Сообщение о прерывании связи nrf24l01+

Alkatrazz
Offline
Зарегистрирован: 04.04.2017

Доброго времени суток. 

Есть датчик, данные с которого передаются через дуину-передатчик на дуину, подключенную к компьютеру, после чего выводятся в порт. Однако, при нарушении связи (отключение питания на передатчике), в порт продолжают выводится последние полученные данные.

Подскажите, пожалуйста, как можно реализовать проверку, чтобы если передатчик перестал передавать данные, в порт выводилось сообщение об ошибке.

Передатчик:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>

struct {
  double temp;
  double pressure;  
} bmp_data;

double p, t;

boolean flag; // флажок отправки данных

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

Adafruit_BMP280 bmp; // I2C

double averageT;
double averageP;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //открываем порт для связи с ПК

  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_HIGH); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчик

  if (!bmp.begin()) {  
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }
}

void loop() {
  // put your main code here, to run repeatedly:

    averageT = 0;
    averageP = 0;
//    averageA = 0;
    
    for (int i = 0; i < 100; i++)
    {
      averageT += bmp.readTemperature();
      averageP += bmp.readPressure();
    }
    
    bmp_data.temp = averageT / 100;
    bmp_data.pressure = (averageP / 100) * 0.0075006375541921;
  
  for (int i = 0; i < 3; i++) { // в цикле от 0 до числа каналов
      if (bmp_data.temp != t || bmp_data.pressure != p) { // если есть изменения в transmit_data
        flag = 1; // поднять флаг отправки по радио
        t = bmp_data.temp; // запомнить последнее изменение
        p = bmp_data.pressure;
      }
    }
  
    if (flag == 1) {
      radio.powerUp(); // включить передатчик
      radio.write(&bmp_data, sizeof(bmp_data)); // отправить по радио
      flag = 0; //опустить флаг
      radio.powerDown(); // выключить передатчик
    }
}

Приемник:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <TimeLib.h>
#include <DS1307RTC.h>
#include <Wire.h>

struct {

  double temp;
  double pressure;  
} bmp_data;       

double t, p;

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //открываем порт для связи с ПК
  
  while (!Serial) ; // wait for serial
  delay(200);
  
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openReadingPipe(1, address[0]);     //хотим слушать трубу 0
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_HIGH); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
}

void loop() {
  
  tmElements_t tm;
  
  // put your main code here, to run repeatedly:
  byte pipeNo;
  while ( radio.available(&pipeNo)) {  // слушаем эфир со всех труб
    radio.read( &bmp_data, sizeof(bmp_data) );         // чиатем входящий сигнал
    t = bmp_data.temp;
    p = bmp_data.pressure;
  }
    
    Serial.print(F("Temperature = "));
    Serial.print(t);
    Serial.println(" *C");
    
    Serial.print(F("Pressure = "));
    Serial.print(p);
    Serial.println("mm Hg");
    if (RTC.read(tm)) {
        Serial.print("Ok, Time = ");
        print2digits(tm.Hour);
        Serial.write(':');
        print2digits(tm.Minute);
        Serial.write(':');
        print2digits(tm.Second);
        Serial.print(", Date (D/M/Y) = ");
        Serial.print(tm.Day);
        Serial.write('/');
        Serial.print(tm.Month);
        Serial.write('/');
        Serial.print(tmYearToCalendar(tm.Year));
        Serial.println();
      } else {
        if (RTC.chipPresent()) {
          Serial.println("The DS1307 is stopped.  Please run the SetTime");
          Serial.println("example to initialize the time and begin running.");
          Serial.println();
        } else {
          Serial.println("DS1307 read error!  Please check the circuitry.");
          Serial.println();
        }
      }
    delay (5000);
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

 

IVAN222
Offline
Зарегистрирован: 19.04.2017

Вот кусок кода о не принятии сигнала

         if(!radio.available()){  //если получаем пустой ответ

              Serial.println("ОШИБКА");  //отправляем в порт

              }

          else{
           Здесь выполнение ваших действий
           }

          

 

Alkatrazz
Offline
Зарегистрирован: 04.04.2017

Спасибо, работает