Спасибо за совет. Сразу итог: результат тот же
Что делал: из примера выброшены все датчики и их библиотеки. Одно значение "термодатчика" задано равным 250, чтоб на вебморде отображалось как 25.0 - оно без проблем и отображается.
В исполнительные команды на приеме вместо управления пинами поставил вывод значения val1 в терминал, чтоб хоть как-то понять, что происходит
Сырой код с nrf (мое значение "250"):
1:1;250;0;84;0;85;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
Для его отображения как температуры в настройках nrf стоит структура данных - Т.
Это то, что в терминале после подачи 2-3 команд вида:
http://192.168.0.150/nrfwrite?chselect=1&val1=10&val2=5&val3=1
(сначала идет "обычная" работа с выводом значения C 250, потом 10 - это пришло значение val1 и "пошло циклить"):
C 250
C 250
C 250
C 250
10
C 250
10
10
10
C 250
10
10
10
C 250
10
10
......
Словно val1 надо "освободить". Но и передача из esp не хочет с первого раза идти, светодиод на ней секунды 2-3 горит ("идет передача"). В дебуге пишет: Send data NRF: 0 10 5 1 Тут первым байтом разве не номер клиента должен быть, равный 1? Почему его не шлет?
Сам код скетча клиента:
/* В настройке сервера указать Data structure: THTAL
Счетчик можно закоментить в скетче, тогда данные будут так - THTA
*/
#define chclient 1 // номер клиента 1...
#define timeoutper 400 // таймаут запросов от сервера.
#define timesend 300 // интервал отправки данных,для обычных датчиков можно установить время выше.
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
unsigned long time1=0;
unsigned long time2=0;
#define RELE_1 6 //
#define RELE_2 7
// Set up nRF24L01 radio on SPI bus plus pins 9 & 10
RF24 radio(9,10);
//
// 0 -прием , 1 -передача
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL,0xF0F0F0F0D2LL};
//
// структура принятых данных.МЕНЯТЬ НЕЛЬЗЯ
typedef struct{
byte identifier;
byte val1;
byte val2;
byte val3;
byte val4;
}
nf0;
nf0 servernf;
// структура отправляемых данных.Изменяемые данные.Размер структуры должен быть не больше 32 байт !
typedef struct{
byte identifier;// номер передатчика.МЕНЯТЬ НЕЛЬЗЯ
int temperature_Sensor;// ОСТАВИЛ ОДИН СЕНСОР ДЛЯ ТЕСТА
unsigned int Error_Message; // счетчик ошибок
unsigned long count;// счетчик передач для контроля качества канала
}
nf1;
nf1 clientnf;
/* ************************************** */
void setup() {
Serial.begin(9600);
pinMode(RELE_1, OUTPUT);
pinMode(RELE_2, OUTPUT);
radio.begin();
delay(2);
radio.setDataRate(RF24_1MBPS);
radio.setPALevel(RF24_PA_MAX);
radio.setChannel(100); //тут установка канала
radio.setCRCLength(RF24_CRC_16);
radio.setAutoAck(false); // выключить аппаратное потверждение
radio.setRetries(15,15);
radio.openReadingPipe(1,pipes[0]); // Открываем канал приема
radio.openWritingPipe(pipes[1]); // Открываем канал передачи
clientnf.identifier = chclient;
}
byte errorstate;
void loop() {
// для чтения сенсоров
if ((millis()-time1) >= 1000) { // обновляем сенсоры раз в секунду (1000млс)
// тут будут опросы сенсоров
clientnf.temperature_Sensor = 250; // ЗАДАЮ ОТОБРАЖЕНИЕ ТЕРМОДАТЧИКА = 25 C
Serial.print(" C ");
Serial.println(clientnf.temperature_Sensor); // И В ТЕРМИНАЛКУ ДЛЯ ПРОВЕРКИ
time1 = millis();
}
//**************************************************************/
if ((millis() - time2) >= timesend || errorstate !=0) {
if (clientnf.count <= 2147483646) clientnf.count++; // счетчик передач для контроля качества канала
else clientnf.count = 0;
radio.stopListening();
bool ok = radio.write( &clientnf, sizeof(clientnf) );
radio.startListening();
unsigned long started_waiting_at = millis();
bool timeout = false;
while ( ! radio.available() && ! timeout )
if (millis() - started_waiting_at > timeoutper ) timeout = true;
if ( timeout ) {
// счетчик ошибок
clientnf.Error_Message++;
errorstate++; // счетчик ошибок для повтора
}
else {
radio.read( &servernf, sizeof(servernf) );
errorstate=0;
}
if (errorstate>=50) errorstate=0; // не более 3 попыток для повтора
//************************************************************************************************/
if (servernf.identifier == chclient) { // выполнение команд с сервера,если данные предназначены для этого клиента:
// val1= 10 -значит дергаем пинами, val2 - номер пина, val3 - состояние пина
if (servernf.val1==10) Serial.println(servernf.val1);
// val1= 11 -значит управляем ШИМ пинами, val2 - номер пина, val3 - уровень 0..255.
if (servernf.val1==11) Serial.println(servernf.val1);
}
time2 = millis();
}
} // конец loop