demoss

ПЕРЕДАТЧИК

Sep 16th, 2021
870
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*   Данный скетч делает следующее: передатчик (TX) отправляет массив
  2.      данных, который генерируется согласно показаниям с кнопки и с
  3.      двух потенциомтеров. Приёмник (RX) получает массив, и записывает
  4.      данные на реле, сервомашинку и генерирует ШИМ сигнал на транзистор.
  5.     by AlexGyver 2016
  6. */
  7. #include "GyverButton.h"
  8. #include <SPI.h>
  9. #include "nRF24L01.h"
  10. #include "RF24.h"
  11. #include <GyverPower.h>
  12. void(* resetFunc) (void) = 0;
  13.  
  14. GButton btn1(4);
  15. GButton btn2(5);
  16.  
  17. RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
  18. //RF24 radio(9,53); // для Меги
  19.  
  20. byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
  21.  
  22. uint16_t transmit_data[1]; // массив, хранящий передаваемые данные
  23. uint16_t latest_data[1]; // массив, хранящий последние переданные данные
  24. boolean flag; // флажок отправки данных
  25. uint32_t timer0;
  26. int state;
  27.  
  28. void setup() {
  29.   pinMode(2, INPUT);
  30.  
  31.   btn1.setDebounce(80);        // настройка антидребезга (по умолчанию 80 мс)
  32.   btn1.setTimeout(600);        // настройка таймаута на удержание (по умолчанию 500 мс)
  33.   btn1.setClickTimeout(600);   // настройка таймаута между кликами (по умолчанию 300 мс)
  34.  
  35.   btn2.setDebounce(80);        // настройка антидребезга (по умолчанию 80 мс)
  36.   btn2.setTimeout(600);        // настройка таймаута на удержание (по умолчанию 500 мс)
  37.   btn2.setClickTimeout(600);   // настройка таймаута между кликами (по умолчанию 300 мс)
  38.  
  39.   radio.begin(); //активировать модуль
  40.   radio.setAutoAck(false);         //режим подтверждения приёма, 1 вкл 0 выкл
  41.   radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  42.   radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  43.   radio.setPayloadSize(32);     //размер пакета, в байтах
  44.  
  45.   radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  46.   radio.setChannel(0x66);  //выбираем канал (в котором нет шумов!)
  47.  
  48.   radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  49.   radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  50.   //должна быть одинакова на приёмнике и передатчике!
  51.   //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
  52.  
  53.   radio.powerUp(); //начать работу
  54.   radio.stopListening();  //не слушаем радиоэфир, мы передатчик
  55.   power.autoCalibrate(); // автоматическая калибровка ~ 2 секунды , средняя но достаточная точность
  56.   power.hardwareDisable(PWR_ADC | PWR_TIMER1); // см раздел константы в GyverPower.h, разделяющий знак " | "
  57.   power.setSleepMode(POWERDOWN_SLEEP); // если нужен другой режим сна, см константы в GyverPower.h (по умолчанию POWERDOWN_SLEEP)
  58.   power.bodInSleep(false); // рекомендуется выключить bod во сне для сохранения энергии (по умолчанию false - выключен!!)
  59.   void ISR() {
  60. }
  61. attachInterrupt(digitalPinToInterrupt(2), ISR, CHANGE);
  62.  
  63. }
  64. void loop() {
  65. if (millis() -timer0 >=60000){
  66.   timer0 = millis();
  67.   state =1;
  68. }
  69. switch (state){
  70.   case 1:
  71.   state =0;
  72.   power.sleep(SLEEP_FOREVER);
  73.   break;
  74. }
  75. btn1.tick();
  76. btn2.tick();
  77.   if (btn1.isClick()) transmit_data[0]=0x1;         // проверка на один клик
  78.   if (btn1.isHold())  transmit_data[0]=0x2;         // проверк удержания
  79.   if (btn2.isClick())  transmit_data[0]=0x3;         // проверка на один клик
  80.   if (btn2.isHold())  transmit_data[0]=0x4;         // проверк удержания
  81.  
  82.   for (int i = 0; i < 1; i++) { // в цикле от 0 до числа каналов
  83.     if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data
  84.       flag = 1; // поднять флаг отправки по радио
  85.       latest_data[i] = transmit_data[i]; // запомнить последнее изменение
  86.     }
  87.   }
  88.  
  89.   if (flag == 1) {
  90.     radio.powerUp(); // включить передатчик
  91.     radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
  92.     flag = 0; //опустить флаг  
  93.     radio.powerDown(); // выключить передатчик
  94.   }
  95.  
  96. }
RAW Paste Data