Получение данных с датчика oregon

Всем привет. Есть датчик Oregon, обмен идет по радиоканалу 433МГц. Ардуинкой успешно принимаю данные + библиотекой распарсиваю. С этим вопросов нет, НО датчик отправвляет данные раз к n-е количество минут. Как реализовать корректный прием данных??? Сейчас просто картина такая: получил данные - хорошо, если не попал в промежуток, то тут просто ждать, когда снова прилетят (даже местами больше 10 минут).

Постоянно слушать эфир почему не устраивает?

1 лайк

Второй вариант. Организовал режим запрос-ответ. Есть набор радио-замок на 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   
}