Проблемы с передачей данных по NRF24
- Войдите на сайт для отправки комментариев
Втр, 30/05/2017 - 06:54
Всем привет!
Проблема в следующем. Есть 2 ардуино к одной прикручен 7 сигментный индикатор к другой датчик температуры-влажности. При помощи NRF24 данные с датчика передаются на на индикатор, но после нескольких секунд индикации данные температуры и влажности меняются местами, тоесть если температура 25 градусов, а влажность 40 процентов, то на индикаторе показывает 40 градусов и 25 процентов. Кто знает в чем проблема подскажите.
RX
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include "DHT.h" #include <TimerOne.h> #include <TM74HC595Display.h> #define SCLK 7 // пины ардуины #define RCLK 6 #define DIO 5 TM74HC595Display disp(SCLK, RCLK, DIO); RF24 radio(9,10); // "создать" модуль на пинах 9 и 10 Для Уно int i; int d; byte digitBuffer[10]; byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; //возможные номера труб void setup(){ Serial.begin(9600); digitBuffer[0] = 0b11000000; digitBuffer[1] = 0b11111001; digitBuffer[2] = 0b10100100; digitBuffer[3] = 0b10110000; digitBuffer[4] = 0b10011001; digitBuffer[5] = 0b10010010; digitBuffer[6] = 0b10000010; digitBuffer[7] = 0b11111000; digitBuffer[8] = 0b10000000; digitBuffer[9] = 0b10010000; Timer1.initialize(900); // set a timer of length 1500 Timer1.attachInterrupt(timerIsr); 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_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.startListening(); //начинаем слушать эфир, мы приёмный модуль } void loop(void) { byte pipeNo; radio.available(&pipeNo); // слушаем эфир со всех труб radio.read( &i, sizeof(i) ); // чиатем входящий сигнал radio.read( &d, sizeof(d)); Serial.println("Температура "); Serial.println(i); Serial.println("Влажность "); Serial.println(d); disp.digit2(i, 1); disp.set(0b10011100, 0); // знак градуса delay(5000); disp.clear(); disp.digit2(d, 2); disp.set(0b10011100, 1); disp.set(0b10100011, 0); delay(5000); disp.clear(); } void timerIsr() { disp.timerIsr(); }
TX
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include "DHT.h" #define DHTPIN 8 #define DHTTYPE DHT22 RF24 radio(9,10); // "создать" модуль на пинах 9 и 10 Для Уно DHT dht(DHTPIN, DHTTYPE); byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; //возможные номера труб int i; int d; void setup(){ Serial.begin(9600); dht.begin(); 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_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.stopListening(); //не слушаем радиоэфир, мы передатчик } void loop(void) { i = dht.readTemperature(); d = dht.readHumidity(); Serial.println("Температура "); Serial.println(i); Serial.println("Влажность "); Serial.println(d); radio.write(&i, sizeof(i)); radio.write(&d, sizeof(d)); delay(9000); }
Ошибок много.
Одна, глобальная, - в придуманном Вами незащищенном протоколе передачи.
Несколько локальных - в фрагменте, принимающем сообщения.
Можете поподробней объяснить, пожалуйста, буду благодарен.
byte
pipeNo;
radio.available(&pipeNo);
// слушаем эфир со всех труб
с передачей ей адреса неинициализщированной локальной переменной pipeNo, то главная ошибка в разделении двух переменных по разным пакетам с последующей потерей синхронизации между четными и нечетными пакетами. Чтение производится не будучи уверенным, что в приемнике есть данные.