Всем доброго дня. Может кто нибудь помочь с NRF-хабом на ESP? Есть NRF передатчик на Arduino (DevDuino Sensor Node V2.0) и два приемника (один такой же DevDuino Sensor Node и второй - WEMOS D1 mini). Пара - передатчик и NRF-хаб работала, до тех пор, пока не решил внести изменения в работу передатчика. Старого кода не было, решил снова написать, но что-то никак NRF-хаб не видит данных. Стал проверять работу передатчика - взял второй приемник, написал код в Arduino - работает, эту же прошивку залил в NRF-хаб на wemos - работает, но не верно. Посылки видит, но данные не те. На скриншотах видно.
Это код передатчика:
#include <SPI.h> // библиотека для протокола SPI
#include <nRF24L01.h> // библиотека для nRF24L01+
#include <RF24.h> // библиотека для радио модуля
#include <avr/sleep.h>
#include <avr/wdt.h>
//Адреса отправки- 0xF0F0F0F0E1, приема- 0xF0F0F0F0D2
const uint64_t pipe = 0xF0F0F0F0E1LL; // идентификатор передачи
// 0 -прием , 1 -передача
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL};
//Initialization RF-module as follows: DevDuino Sensor Node V2.0 (ATmega 328)
//RF24 radio(CE,CSN)
RF24 radio(8, 7);
volatile boolean wdt_tripped = 1;
//режим сна для МК
void system_sleep() {
delay(2); // Wait for serial traffic
_SFR_BYTE(ADCSRA) &= ~_BV(ADEN); // Switch ADC off
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode(); // System sleeps here
sleep_disable();
_SFR_BYTE(ADCSRA) |= _BV(ADEN); // Switch ADC on
}
void wdt_interrupt_mode() {
wdt_reset();
WDTCSR |= _BV(WDIE); // Restore WDT interrupt mode
}
ISR(WDT_vect) {
wdt_tripped = 1; // set global volatile variable
}
typedef struct {
unsigned char identifier;// номер передатчика. Неизменяемые данные
int Analog; //Аналоговый вход
unsigned long count;// счетчик передач для контроля качества канала.
int temperature_Sensor; //передаём температуру.
int Humidity_Sensor;// передаём влажность
}
Message;
Message sensor;
void sendSensorMessage() {
//подготовим данные в структуру для передачи
sensor.identifier = 1;
sensor.Analog = 123;
sensor.count = 456; // счетчик передач для контроля качества канала.
sensor.temperature_Sensor = 37;
sensor.Humidity_Sensor = 50;
//отправляем данные по RF24
radio.stopListening();
radio.write( &sensor, sizeof(sensor) );
Serial.println("Send ok..." );
delay (20);
return;
}
void readSensor()
{
//data.temperature = 37.7;
//data.humidity = 80;
}
void setup()
{
pinMode(4, INPUT); // порт для датчика воды
// enable pull-up resistor
digitalWrite(4, HIGH);
Serial.begin(9600); // запускаем последовательный порт
radio.begin(); // включаем радио модуль
// скорость: RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
// мощность: RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM
radio.setDataRate(RF24_1MBPS);
radio.setPALevel(RF24_PA_MAX);
radio.setChannel(100); // выбираем канал (от 0 до 127)
radio.setCRCLength(RF24_CRC_16);
radio.setAutoAck(false); // выключить аппаратное потверждение
radio.setRetries(15, 15);
// radio.enableDynamicPayloads(); // разрешить Dynamic Payloads
// radio.enableAckPayload(); // разрешить AckPayload
//radio.openReadingPipe(1,pipes[0]); // Открываем канал приема
//radio.openWritingPipe(pipes[1]); // Открываем канал передачи
radio.openWritingPipe(pipe); // открываем трубу на передачу
//radio.stopListening();
wdt_disable();
wdt_reset();
wdt_enable(WDTO_2S); //пробуждение каждые 2 сек
}
void loop()
{
wdt_interrupt_mode();
radio.powerUp(); //подаём питание на NRF24
sendSensorMessage();
radio.powerDown(); // отключаем питание RF24
system_sleep(); //МК засыпает
delay(100);
}
это код приемника:
#include <SPI.h> // библиотека для протокола SPI
#include <nRF24L01.h> // библиотека для nRF24L01+
#include <RF24.h> // библиотека для радио модуля
const uint64_t pipe = 0xF0F0F0F0E1LL; // идентификатор передачи
//RF24 radio(8, 7); // Для DevDuino Sensor Node V2.0;
RF24 radio(D8, D3); // Для WEMOS D1 mini;
typedef struct {
unsigned char identifier;// номер передатчика. Неизменяемые данные
int Analog; //Аналоговый вход
unsigned long count;// счетчик передач для контроля качества канала.
int temperature_Sensor; //передаём температуру.
int Humidity_Sensor;// передаём влажность
}
Message;
Message sensor;
void setup()
{
Serial.begin(9600); // запускаем последовательный порт
radio.begin(); // включаем радио модуль
// скорость: RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
// мощность: RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM
radio.setDataRate(RF24_1MBPS);
radio.setPALevel(RF24_PA_MAX);
radio.setChannel(100); // выбираем канал (от 0 до 127)
radio.setCRCLength(RF24_CRC_16);
radio.setAutoAck(false); // выключить аппаратное потверждение
radio.setRetries(15, 15);
radio.openReadingPipe(1, pipe); // открываем первую трубу
radio.startListening(); // начинаем слушать трубу
}
void loop(void) {
if ( radio.available() )
{
// bool done = false;
radio.read( &sensor, sizeof(sensor) );
if (sensor.identifier == 1 ) {
Serial.print("sensor.identifier = ");
Serial.print(sensor.identifier);
Serial.print(", sensor.Analog = ");
Serial.print(sensor.Analog);
Serial.print(", sensor.count = ");
Serial.print(sensor.count);
Serial.print(", sensor.temperature_Sensor = ");
Serial.print(sensor.temperature_Sensor);
Serial.print(", sensor.Humidity_Sensor = ");
Serial.println(sensor.Humidity_Sensor);
}
}
}
Что я делаю не так?