Advertisement
Mishan150

Sender

Jul 15th, 2019
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.07 KB | None | 0 0
  1. #include <max6675.h>
  2. #include <SPI.h>
  3. #include <LoRa.h>
  4. #include <avr/wdt.h>
  5. #include <avr/sleep.h>
  6.  
  7.  
  8. #define addr 548
  9. #define YES BufferUnion.SmalInt[0] == OK_code
  10.  
  11. #define thermoDO 7  // Определяем константу с указанием № вывода Arduino к которому подключён вывод DO  ( SO, MISO ) модуля на чипе MAX6675
  12. #define thermoCS 6  // Определяем константу с указанием № вывода Arduino к которому подключён вывод CS  ( SS )       модуля на чипе MAX6675
  13. #define thermoCLK 5 // Определяем константу с указанием № вывода Arduino к которому подключён вывод CLK ( SCK )      модуля на чипе MAX6675
  14.  
  15. MAX6675 thermo(thermoCLK, thermoCS, thermoDO); // Объявляем объект thermo для работы с функциями и методами библиотеки MAX6675, указывая выводы ( CLK , CS , DO )
  16.  
  17.  
  18. float val = 0.0;
  19. const int waiting_steps = 1000;
  20. int send_step = 11;
  21. const int temperature_indexes_num = 10;
  22. int now_temperature_index = 0;
  23. int get_temperature_step;
  24. const int OK_code = 0xFF;
  25. const int Write_code = 0xAC;
  26. const int send_time_interval = 3000;
  27. long last_send_time = 0;
  28. long now_step = 0;
  29. const size_t BufferSize = 8;
  30. uint8_t Buffer[BufferSize];
  31. bool in_wait = 0;
  32. float temperature_values[temperature_indexes_num];
  33. float temperature = 0.0;
  34.  
  35. typedef union union4byte_t {
  36.   uint8_t Bytes[4];
  37.   int16_t SmalInt[2];
  38.   int32_t Int;
  39.   float Float;
  40. };
  41. union4byte_t BufferUnion;
  42.  
  43. void Sender() {
  44.   LoRa.setTxPower(20);
  45.   temperature = 0.0;
  46.   for(int i = 1; i <= now_temperature_index; i++) temperature += temperature_values[i];
  47.   Serial.print("Sending packet: ");
  48.   Serial.print(addr);
  49.   Serial.print(" ");
  50.   Serial.println(temperature / now_temperature_index);
  51.   // send packet
  52.   LoRa.beginPacket();
  53.   BufferUnion.Int = addr;
  54.   LoRa.write(BufferUnion.Bytes, 4);
  55.   BufferUnion.Float = temperature / now_temperature_index;
  56.   LoRa.write(BufferUnion.Bytes, 4);
  57.   LoRa.endPacket();
  58. }
  59.  
  60. void setup() {
  61.   Serial.begin(9600);
  62.   while (!Serial);
  63.  
  64.   Serial.println("Lora wan говно");
  65.  
  66.   if (!LoRa.begin(430E6)) {
  67.     Serial.println("Starting LoRa failed!");
  68.     while (1);
  69.   }
  70.   Serial.println("LoRa sender starting");
  71.   LoRa.enableCrc();
  72.   get_temperature_step = send_step / temperature_indexes_num + 1;
  73.   Serial.println(get_temperature_step);
  74. }
  75.  
  76. void loop() {
  77.   now_step++;
  78.  
  79.   if(now_step % get_temperature_step == 0)
  80.   {      
  81.     now_temperature_index++;
  82.     temperature_values[now_temperature_index] = thermo.readCelsius();
  83.     Serial.print("get to ");
  84.     Serial.print(now_temperature_index);  
  85.     Serial.print(" value ");
  86.     Serial.println(temperature_values[now_temperature_index]);
  87.   }
  88.  
  89.   if (now_step % send_step == 0)
  90.   {
  91.     in_wait = 1;
  92.     Serial.println("in send");
  93.     while(in_wait)
  94.     {
  95.       Sender();
  96.       for (int i = 0; i < waiting_steps; i++)
  97.       {
  98.         int packetSize = LoRa.parsePacket();
  99.         if (packetSize)
  100.         {
  101.           Serial.print(" recieved packet: ");
  102.           while (LoRa.available())
  103.           {
  104.             for (size_t i = 0; i < BufferSize; ++i)
  105.             {
  106.               Buffer[i] = LoRa.read();
  107.             }
  108.             Serial.write(Buffer, BufferSize);
  109.           }
  110.           Serial.println();
  111.           BufferUnion.Bytes[0] = Buffer[4];
  112.           BufferUnion.Bytes[1] = Buffer[5];
  113.           BufferUnion.Bytes[2] = Buffer[6];
  114.           BufferUnion.Bytes[3] = Buffer[7];
  115.           if (YES)
  116.           {
  117.             Serial.println("Sending secsess");
  118.             in_wait = 0;
  119.             now_temperature_index = 0;
  120.             break;
  121.           }
  122.         }
  123.         delay(1);
  124.       }
  125.     }
  126.   }
  127.  
  128.   wdt_enable(WDTO_1S); //Задаем интервал сторожевого таймера (2с)
  129.   WDTCSR |= (1 << WDIE); //Устанавливаем бит WDIE регистра WDTCSR для разрешения прерываний от сторожевого таймера
  130.   set_sleep_mode(SLEEP_MODE_PWR_DOWN); //Устанавливаем интересующий нас режим
  131.   sleep_mode(); // Переводим МК в спящий режим
  132.  
  133.   /*in_wait = 1;
  134.     Sender();
  135.     while (in_wait) {
  136.     while (millis() - last_send_time < send_time_interval) {
  137.       int packetSize = LoRa.parsePacket();
  138.       if (packetSize) {
  139.         Serial.print(" recieved packet: ");
  140.         while (LoRa.available()) {
  141.           for (size_t i = 0; i < BufferSize; ++i) {
  142.             Buffer[i] = LoRa.read();
  143.           }
  144.           Serial.write(Buffer, BufferSize);
  145.         }
  146.         Serial.println();
  147.         Serial.println(Buffer[4]);
  148.         Serial.println(Buffer[5]);
  149.         Serial.println(Buffer[6]);
  150.         Serial.println(Buffer[7]);
  151.         if(YES) {
  152.           Serial.println("YES");
  153.           in_wait = 0;
  154.         }
  155.       }
  156.     }
  157.     last_send_time = millis();
  158.     }//*/ //it is work
  159. }
  160.  
  161. ISR (WDT_vect) {
  162.   wdt_disable();
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement