Всем привет. Есть датчик Oregon, обмен идет по радиоканалу 433МГц. Ардуинкой успешно принимаю данные + библиотекой распарсиваю. С этим вопросов нет, НО датчик отправвляет данные раз к n-е количество минут. Как реализовать корректный прием данных??? Сейчас просто картина такая: получил данные - хорошо, если не попал в промежуток, то тут просто ждать, когда снова прилетят (даже местами больше 10 минут).
Постоянно слушать эфир почему не устраивает?
Второй вариант. Организовал режим запрос-ответ. Есть набор радио-замок на 4 кнопки. Включил радиокнопкой и слушай датчик. Выключил и пошёл спать.
Чем не устраивают 10 минут? Хоть вы ничего не сказали, что за датчик, я подозреваю, что это термометр, а смена температуры дело не быстрое.
Именно он самый, THN-132N, но есть и другие. Просто как реализовано это все в погодных “Китайских” метеостанциях - просто ждут и если прилетели данные отображаются, если нет, то значит просто старые данные отображаются??? ))) Просто у меня так может сутками ничего не меняться ))
У меня на RST посылка с выносного блока происходит только при изменении температуры, например.
Ещё вариант слушать эфир через 9мин59сек., если нужна экономия) ведь период сеансов передач с необходимой точностью известны?
С точностью точно не известно. Буду пробовать переписывать код, что бы постоянно слушать эфир , плюс внесу какие-либо проверки на прием данных
Для того чтоб дискуссия имела смысл, покажите свой код.
Может у вас там полно делеев или блокирующих операций, когда вы не слушаете эфир и потому пропускаете посылки данных?
Добрый вечер, часть кода приложу, брал за основу другой проект и в него добавил считывание данных.
#include <lib_bl999.h>
static BL999Info info;
......
void DrawBL999() {
if (bl999_have_message() && bl999_get_message(info)) {
lcd.setCursor(0, 2);
lcd.print("Ch:" + String(info.channel));
lcd.setCursor(5, 2);
lcd.print("Pow: " + String(info.powerUUID));
lcd.setCursor(13, 2);
lcd.print("Bat: " + String(info.battery == 0 ? "Ok" : "Low"));
lcd.setCursor(0, 3);
lcd.print("Temp: " + String(info.temperature / 10.0));
temp = (info.temperature/10.0);
Serial.println(temp);
lcd.setCursor(12, 3);
lcd.print("Hum: " + String(info.humidity) + "%");
// Serial.println("====== Got message from BL999 sensor: ");
// Serial.println("Channel: " + String(info.channel));
// Serial.println("PowerUUID: " + String(info.powerUUID));
// Serial.println("Battery is " + String(info.battery == 0 ? "Ok" : "Low"));
// Serial.println("Temperature: " + String(info.temperature / 10.0));
// Serial.println("Humidity: " + String(info.humidity) + "%");
}
}
void setup() {
Serial.begin(9600);
pinMode(BACKLIGHT, OUTPUT);
lcd.init();
//lcd.backlight();
lcd.clear();
rtc.begin();
if (RESET_CLOCK)
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
now = rtc.now();
secs = now.second();
mins = now.minute();
hrs = now.hour();
if (DISPLAY_TYPE == 1) {
loadClock();
drawClock(hrs, mins, 0, 0, 1);
drawData();
}
//установка Oregon BL999
//set digital pin to read info from
bl999_set_rx_pin(2); //пин D2
//start reading data from sensor
bl999_rx_start();
//включить функции
}
void loop() {
if (clockTimer.isReady()) clockTick();
modesTick();
#if (DISPLAY_TYPE == 1)
if (mode == 0) { // в режиме "главного экрана"
if (drawSensorsTimer.isReady()) DrawBL999(); // обновляем показания датчиков на дисплее с периодом SENS_TIME
} else { // в любом из графиков
if (plotTimer.isReady()) drawTemp(temp, 0,0); // перерисовываем график
}
#else
if (drawSensorsTimer.isReady()) DrawBL999();
#endif
}