Сообщение о прерывании связи nrf24l01+
- Войдите на сайт для отправки комментариев
Вс, 21/01/2018 - 21:08
Доброго времени суток.
Есть датчик, данные с которого передаются через дуину-передатчик на дуину, подключенную к компьютеру, после чего выводятся в порт. Однако, при нарушении связи (отключение питания на передатчике), в порт продолжают выводится последние полученные данные.
Подскажите, пожалуйста, как можно реализовать проверку, чтобы если передатчик перестал передавать данные, в порт выводилось сообщение об ошибке.
Передатчик:
#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);
}
Вот кусок кода о не принятии сигнала
if(!radio.available()){ //если получаем пустой ответ Serial.println("ОШИБКА"); //отправляем в порт } else{ Здесь выполнение ваших действий }Спасибо, работает