Advertisement
demoss

ПЕРЕДАТЧИК

Sep 16th, 2021 (edited)
1,087
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.93 KB | None | 0 0
  1. // TX
  2.  
  3.  // подключаем библу
  4. #define STRIP_PIN 5     // пин ленты
  5. #define NUMLEDS 1      // кол-во светодиодов
  6. #define COLOR_DEBTH 3
  7. #include <microLED.h>  
  8. microLED<NUMLEDS, STRIP_PIN, MLED_NO_CLOCK, LED_WS2812, ORDER_GRB, CLI_AVER> strip;
  9.  
  10. #include "GyverButton.h"
  11. #include <SPI.h>
  12. #include "nRF24L01.h"
  13. #include "RF24.h"
  14. #include "printf.h"
  15. #include <GyverPower.h>
  16.  
  17. void(* resetFunc) (void) = 0;
  18. void isr() {
  19. resetFunc();
  20. }
  21. GButton pbtn(2, LOW_PULL);
  22. GButton btn1(3, LOW_PULL);
  23. GButton btn2(4, LOW_PULL);
  24.  
  25.  
  26. RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
  27. //RF24 radio(9,53); // для Меги
  28.  
  29. byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
  30.  
  31. uint16_t transmit_data[1]; // массив, хранящий передаваемые данные
  32. uint16_t latest_data[1]; // массив, хранящий последние переданные данные
  33. boolean flag; // флажок отправки данных
  34. uint32_t timer0;
  35. float voltage_r = 3.99;
  36. int Pstate;
  37. int wake =0;
  38.  
  39. void setup() {
  40.   Serial.begin(56700);
  41.   analogReference(INTERNAL);
  42.   pinMode(6, OUTPUT);
  43.   digitalWrite(6,HIGH);
  44.   Serial.println("led_power");
  45.   strip.setBrightness(35);
  46.  
  47.   pbtn.setDebounce(80);        // настройка антидребезга (по умолчанию 80 мс)
  48.   pbtn.setTimeout(600);        // настройка таймаута на удержание (по умолчанию 500 мс)
  49.   pbtn.setClickTimeout(600);   // настройка таймаута между кликами (по умолчанию 300 мс)
  50.  
  51.   btn1.setDebounce(80);        // настройка антидребезга (по умолчанию 80 мс)
  52.   btn1.setTimeout(600);        // настройка таймаута на удержание (по умолчанию 500 мс)
  53.   btn1.setClickTimeout(600);   // настройка таймаута между кликами (по умолчанию 300 мс)
  54.  
  55.   btn2.setDebounce(80);        // настройка антидребезга (по умолчанию 80 мс)
  56.   btn2.setTimeout(600);        // настройка таймаута на удержание (по умолчанию 500 мс)
  57.   btn2.setClickTimeout(600);   // настройка таймаута между кликами (по умолчанию 300 мс)
  58.  
  59.   radio.begin(); //активировать модуль
  60.   radio.setAutoAck(false);         //режим подтверждения приёма, 1 вкл 0 выкл
  61.   radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  62.   radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  63.   radio.setPayloadSize(32);     //размер пакета, в байтах
  64.  
  65.   radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  66.   radio.setChannel(0x66);  //выбираем канал (в котором нет шумов!)
  67.  
  68.   radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  69.   radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  70.   //должна быть одинакова на приёмнике и передатчике!
  71.   //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
  72.  
  73.   radio.powerUp(); //начать работу
  74.   radio.stopListening();  //не слушаем радиоэфир, мы передатчик
  75.   power.autoCalibrate(); // автоматическая калибровка ~ 2 секунды , средняя но достаточная точность
  76.   // см раздел константы в GyverPower.h, разделяющий знак " | "
  77.   power.setSleepMode(POWERDOWN_SLEEP); // если нужен другой режим сна, см константы в GyverPower.h (по умолчанию POWERDOWN_SLEEP)
  78.   power.bodInSleep(false); // рекомендуется выключить bod во сне для сохранения энергии (по умолчанию false - выключен!!)
  79.   attachInterrupt(0, wkp, HIGH);
  80.  
  81. wkp(void){
  82. pbtn.tick();
  83. if (pbtn.isClick()) wake=1;
  84. if (pbtn.isHold())  wake=2;
  85. switch(wake){
  86.   case 1:
  87.   wake=0;
  88.   power.hardwareEnable(PWR_ADC | PWR_TIMER1);
  89.    int power_mesure = analogRead(A0);
  90.   float voltage_t = power_mesure * 0.005;
  91.   char Pcolor;
  92. if (voltage_t >= 3.9) Pcolor=mGreen;
  93. if (voltage_t >= 3.4) Pcolor=mYellow;
  94. if (voltage_t < 3.3) Pcolor=mRed;
  95.        strip.fill(Pcolor);       //заливаем зеленым
  96.       strip.show();             //послали на ленту
  97.   break;
  98.   case 2:
  99.   wake=0;
  100.   power.hardwareEnable(PWR_ADC | PWR_TIMER1);
  101.   radio.powerUp(); // включить передатчик
  102.   transmit_data=0x7;
  103.     radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
  104.     if(radio.available() ) {                    // если в ответе что-то есть
  105.         radio.read(&voltage_r, sizeof(voltage_r));    // читаем
  106.         Serial.println(voltage_r);  
  107.     radio.powerDown(); // выключить передатчик
  108.       char Pcolor;
  109. if (voltage_r <= 3.3){ Pcolor=mRed;
  110. } else if (voltage_r < 3.9){ Pcolor=mYellow;
  111. } else if (voltage_r > 3.9) Pcolor=mGreen;
  112.        strip.fill(Pcolor);       //заливаем зеленым
  113.       strip.show();             //послали на ленту
  114.   break;
  115. }
  116. delay(1000);
  117. }
  118.  
  119. void loop() {
  120. btn1.tick();
  121. btn2.tick();
  122. //Serial.println("start");
  123.   int power_mesure = analogRead(A0);
  124.   float voltage_t = power_mesure * 0.005;
  125. Serial.println (voltage_t);
  126. if (millis() -timer0 >=3600){
  127.    timer0 = millis();
  128.    state =1;
  129. }
  130. if (voltage_r < 3.1) Pstate = 2;
  131. if (voltage_t < 3.1) Pstate = 3;
  132. switch (state){
  133.   case 1:
  134.   Pstate =0;
  135.   Serial.println("timer");
  136.   power.hardwareDisable(PWR_ADC | PWR_TIMER1);
  137.   power.sleep(SLEEP_FOREVER);
  138.   break;
  139.  
  140.   case 2:
  141.   Pstate =0;
  142.   Serial.println("rx low");
  143.        strip.fill(mRed);       //заливаем зеленым
  144.       strip.show();             //послали на ленту
  145.   break;
  146.  
  147.   case 3:
  148.   Pstate =0;
  149.   Serial.println("sleep");
  150.   power.hardwareDisable(PWR_ADC | PWR_TIMER1);
  151.   power.sleep(SLEEP_FOREVER);
  152.   break;
  153. }
  154.  
  155.   if (btn1.isClick()) transmit_data[0]=0x1 && Serial.println("cl1");         // проверка на один клик
  156.   if (btn1.isHold())  transmit_data[0]=0x2 && Serial.println("cl2");         // проверк удержания
  157.   if (btn2.isClick()) transmit_data[0]=0x3 && Serial.println("cl3");         // проверка на один клик
  158.   if (btn2.isHold())  transmit_data[0]=0x4 && Serial.println("cl4");        // проверк удержания
  159.  
  160.   for (int i = 0; i < 1; i++) { // в цикле от 0 до количества переменных
  161.     if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data
  162.       flag = 1; // поднять флаг отправки по радио
  163.       latest_data[i] = transmit_data[i]; // запомнить последнее изменение
  164.     }
  165.   }
  166.  
  167.   if (flag == 1) {
  168.     radio.powerUp(); // включить передатчик
  169.     radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
  170.     flag = 0; //опустить флаг
  171.     if(radio.available() ) {                    // если в ответе что-то есть
  172.         radio.read(&voltage_r, sizeof(voltage_r));    // читаем
  173.         Serial.println(voltage_r);  
  174.     radio.powerDown(); // выключить передатчик
  175.   }
  176.  
  177. }
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement