demoss

TX_05012022

Jan 4th, 2022
2,231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.77 KB | None | 0 0
  1. // TX
  2. // подключаем библу
  3. #define STRIP_PIN 6     // пин ленты
  4. #define NUMLEDS 1      // кол-во светодиодов
  5. #define COLOR_DEBTH 2
  6. #include <microLED.h>
  7. microLED<NUMLEDS, STRIP_PIN, MLED_NO_CLOCK, LED_WS2812, ORDER_GRB, CLI_AVER> strip;
  8.  
  9. #define EB_CLICK 600
  10. #include <EncButton.h>
  11. #include <SPI.h>
  12. #include "nRF24L01.h"
  13. #include "RF24.h"
  14. #include "printf.h"
  15. #include <GyverPower.h>
  16.  
  17.  
  18. volatile boolean isrflag = true;
  19. //void(* resetFunc) (void) = 0;
  20. //void isr() {
  21. //resetFunc();
  22. //}
  23. EncButton<EB_TICK, 2> btn0;
  24. EncButton<EB_TICK, 3> btn1;
  25. EncButton<EB_TICK, 4> btn2;
  26. EncButton<EB_TICK, 5> btn3;
  27.  
  28. RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
  29. byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
  30. uint16_t transmit_data[1]; // массив, хранящий передаваемые данные
  31. uint16_t latest_data[1]; // массив, хранящий последние переданные данные
  32. boolean flag; // флажок отправки данных
  33. uint32_t timer0, timer1;
  34. double voltage_r = 3.49;
  35. double voltage_t = 3.49;
  36. int Pstate = 0;
  37. int  pled = 7;
  38.  
  39. void setup() {
  40.   //Serial.begin(56700);
  41.   analogReference(INTERNAL);
  42.   pinMode(A0, INPUT);
  43.   pinMode(pled, OUTPUT);
  44.   digitalWrite(pled, LOW);
  45.  
  46.   //Serial.println("led_power");
  47.   strip.setBrightness(20);
  48.  
  49.   radio.begin();
  50.   radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  51.   radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  52.   radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  53.   radio.setPayloadSize(32);     //размер пакета, в байтах
  54.  
  55.   radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  56.   radio.setChannel(0x66);  //выбираем канал (в котором нет шумов!)
  57.  
  58.   radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  59.   radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  60.   //должна быть одинакова на приёмнике и передатчике!
  61.   //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
  62.  
  63.   radio.powerUp(); //начать работу
  64.   radio.stopListening();  //не слушаем радиоэфир, мы передатчик
  65.   power.autoCalibrate(); // автоматическая калибровка ~ 2 секунды , средняя но достаточная точность
  66.   // см раздел константы в GyverPower.h, разделяющий знак " | "
  67.   power.setSleepMode(POWERDOWN_SLEEP); // если нужен другой режим сна, см константы в GyverPower.h (по умолчанию POWERDOWN_SLEEP)
  68.   power.bodInSleep(false); // рекомендуется выключить bod во сне для сохранения энергии (по умолчанию false - выключен!!)
  69.   //attachInterrupt(digitalPinToInterrupt(2), wkp, FALLING);
  70.  
  71. }
  72.  
  73. void loop() {
  74.   btn0.tick();
  75.   btn1.tick();
  76.   btn2.tick();
  77.   btn3.tick();
  78.   if (isrflag > 0) {
  79.     digitalWrite(pled, HIGH);
  80.     //Serial.println("isr1");
  81.     delay(1200);
  82.     int power_mesure = analogRead(A0);
  83.     voltage_t = power_mesure * 0.0048;
  84.     //Serial.println(voltage_t);
  85.     if (voltage_t <= 3.3) {
  86.       strip.fill(mRed);
  87.       strip.show();             //послали на ленту
  88.       delay(1000);
  89.       strip.fill(mBlack);
  90.       strip.show();
  91.     } else if (voltage_t < 3.9) {
  92.       strip.fill(mYellow);
  93.       strip.show();             //послали на ленту
  94.       delay(1000);
  95.       strip.fill(mBlack);
  96.       strip.show();
  97.     } else if (voltage_t > 3.9) {
  98.       strip.fill(mGreen);
  99.       strip.show();             //послали на ленту
  100.       delay(1000);
  101.       strip.fill(mBlack);
  102.       strip.show();
  103.     }
  104.     //Serial.println("FILL-1-ok");
  105.     //Serial.println("isr2");
  106.     radio.powerUp(); // включить передатчик
  107.     transmit_data[0] = 0x7;
  108.     radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
  109.     if (!radio.available()) {                                  // если получаем пустой ответ
  110.     } else {
  111.       for (; radio.available();) {                   // если в ответе что-то есть
  112.         radio.read(&voltage_r, sizeof(voltage_r));    // читаем
  113.         // получили забитый данными массив  ответа от приёмника
  114.       }
  115.     }
  116.     // если в ответе что-то есть читаем
  117.     //Serial.println(voltage_r);
  118.     delay(100);
  119.     radio.powerDown(); // выключить передатчик
  120.     if (voltage_r <= 3.45) {
  121.       strip.fill(mRed);
  122.       strip.show();             //послали на ленту
  123.       delay(1000);
  124.       strip.fill(mBlack);
  125.       strip.show();
  126.     } else if (voltage_r < 3.9) {
  127.       strip.fill(mYellow);
  128.       strip.show();             //послали на ленту
  129.       delay(1000);
  130.       strip.fill(mBlack);
  131.       strip.show();
  132.     } else if (voltage_r > 3.9) {
  133.       strip.fill(mGreen);       //заливаем зеленым
  134.       strip.show();             //послали на ленту
  135.       delay(1000);
  136.       strip.fill(mBlack);
  137.       strip.show();
  138.     }
  139.     //Serial.println("END_OF_isr2");
  140.     delay(100);
  141.     isrflag = false;
  142.     detachInterrupt(0);
  143.     radio.powerDown();
  144.   }
  145.  
  146.   if (millis() - timer1 >= 10000) {
  147.     int power_mesure = analogRead(A0);
  148.     voltage_t = power_mesure * 0.0048;  // таймер на 10 сек - замер напруги
  149.     if (voltage_r < 3.4) Pstate = 2;
  150.     if (voltage_t < 3.1) Pstate = 3;
  151.     //Serial.println(voltage_t);
  152.     timer1 = millis();
  153.   }
  154.  
  155.   if (millis() - timer0 >= 1800000) {
  156.     timer0 = millis();
  157.     Pstate = 1;
  158.   }
  159.  
  160.   switch (Pstate) {
  161.     case 1:
  162.       Pstate = 0;
  163.       //Serial.println("timer");
  164.       delay(200);
  165.       digitalWrite(pled, LOW);
  166.       radio.powerDown();
  167.       attachInterrupt(digitalPinToInterrupt(2), wkp, LOW);
  168.       power.hardwareDisable(PWR_ADC | PWR_TIMER1);
  169.       power.sleep(SLEEP_FOREVER);
  170.       break;
  171.  
  172.     case 2:
  173.       Pstate = 0;
  174.       //Serial.println("rx low");
  175.       strip.fill(mRed);       //заливаем зеленым
  176.       strip.show();             //послали на ленту
  177.       break;
  178.  
  179.     case 3:
  180.       Pstate = 0;
  181.       //Serial.println("sleep");
  182.       delay(200);
  183.       digitalWrite(pled, LOW);
  184.       radio.powerDown();
  185.       attachInterrupt(digitalPinToInterrupt(2), wkp, LOW);
  186.       power.hardwareDisable(PWR_ADC | PWR_TIMER1);
  187.       power.sleep(SLEEP_FOREVER);
  188.       break;
  189.   }
  190.  
  191.   if (btn1.click()) transmit_data[0] = 0x1;       // проверка на один клик
  192.   if (btn1.held())  transmit_data[0] = 0x2;       // проверк удержания
  193.   if (btn2.click()) transmit_data[0] = 0x3;       // проверка на один клик
  194.   if (btn2.held())  transmit_data[0] = 0x4;       // проверк удержания
  195.   if (btn0.click()) transmit_data[0] = 0x6;       // проверка на один клик
  196.   if (btn0.held())  transmit_data[0] = 0x5;
  197.   if (btn0.hasClicks(5)) wkp();
  198.  
  199.   for (int i = 0; i < 1; i++) { // в цикле от 0 до количества переменных
  200.     if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data
  201.       flag = 1; // поднять флаг отправки по радио
  202.       latest_data[i] = transmit_data[i]; // запомнить последнее изменение
  203.     }
  204.   }
  205.  
  206.   if (flag == 1) {
  207.     radio.powerUp(); // включить передатчик
  208.     radio.write(&transmit_data, sizeof(transmit_data));       // отправить по радио
  209.     //Serial.println(latest_data[0]);
  210.     flag = 0; //опустить флаг
  211.     if (radio.available() ) {                   // если в ответе что-то есть
  212.       radio.read(&voltage_r, sizeof(voltage_r));    // читаем
  213.       //Serial.println(voltage_r);
  214.       timer0 = millis();
  215.       radio.powerDown(); // выключить передатчик
  216.     }
  217.  
  218.   }
  219. }
  220. void wkp() {
  221.   power.hardwareEnable(PWR_ADC | PWR_TIMER1);
  222.   digitalWrite(pled, HIGH);
  223.   power.autoCalibrate();
  224.   isrflag = true;
  225.   //Serial.print("WKPstart");
  226. }
Advertisement
Add Comment
Please, Sign In to add comment