Сообщение о прерывании связи 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); }
Вот кусок кода о не принятии сигнала
Спасибо, работает