Проблемы с передачей данных по 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);
}
Ошибок много.
Одна, глобальная, - в придуманном Вами незащищенном протоколе передачи.
Несколько локальных - в фрагменте, принимающем сообщения.
Можете поподробней объяснить, пожалуйста, буду благодарен.
bytepipeNo;radio.available(&pipeNo);// слушаем эфир со всех трубс передачей ей адреса неинициализщированной локальной переменной pipeNo, то главная ошибка в разделении двух переменных по разным пакетам с последующей потерей синхронизации между четными и нечетными пакетами. Чтение производится не будучи уверенным, что в приемнике есть данные.