b

 

 

Бложик потихоньку переезжает сюда

Радиомодули nRF24L01+ и Arduino, часть 4, работа с прерыванием

код из видео





/// пример из видео http://youtu.be/1M04kcHcRlw
//
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

const uint64_t pipe01 = 0xF0F1F2F3F4LL;  
volatile boolean flag_tx, flag_fail, flag_rx;

int i; ////

RF24 radio(9, 10); // CE, CSN
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
void setup(){
        // настраиваем прерывание на 3 ноге
  attachInterrupt(1, check_radio, FALLING); 
  
  Serial.begin(9600);
  lcd.begin();
  lcd.backlight();
  radio.begin();  

  delay(2);
  radio.setChannel(9); // канал (0-127) 
  radio.setDataRate(RF24_250KBPS);      
  radio.setPALevel(RF24_PA_HIGH);   
    
  radio.openReadingPipe(1,pipe01); // открываем трубу с индитификатором "pipe01"
   radio.startListening(); // включаем приемник, начинаем слушать трубу
}
 
//  radio.stopListening(); // останавливает приём (нужно перед началом передачи) 

void check_radio(){ // обработчик прерывания
  bool tx, fail, rx;
    radio.whatHappened(tx,fail,rx); // читаем регистр
  flag_tx = tx; // 1 если успешно отправили данные
  flag_fail = fail; // 1 если данные не отправленны   
  flag_rx = rx;  // 1 если пришли данные для чтения 
}

void loop(){  
  
   if (flag_rx){ // если пришли данные для чтения
     float temperature = 0; // забераем их и выводим на экран
     radio.read(&temperature, sizeof(temperature));     

       lcd.setCursor(0, 0);
       if (temperature > 0) lcd.print("+");
       lcd.print(temperature);
       lcd.print("   ");
       
//       Serial.println(temperature);
//       Serial.println();
       
     flag_rx = 0;
  }
  
  if (flag_fail){ // если данные не отправленны
    flag_fail = 0;
  
  }
   
  if (flag_tx){ // если данные отправленны 
  flag_tx = 0;
  
  } 
   
 ///////////////////  
      // можно занятся другими делами.      
   lcd.setCursor(0, 1);
   i++;
   lcd.print(i);
   delay(250);
}