Odświeżanie temperatury

kaceepeer
Posts: 8
Joined: Mon Jan 13, 2025 9:06 am

Post

Jestem w trakcie pracy nad termometrem WiFi. Do mojego zastosowania potrzebne jest częstsze odświeżanie. Jako, że dopiero zaczynam raczkować w tematach Supli niestety nie potrafię pisać kodu. Udało dotrzeć mi się do tego, że należy wprowadzić zmiany w poniższym kodzie, a dokładniej w metodzie iterateAlways. Czy jest ktoś w stanie mi pomóc?

Code: Select all

/
using Supla::Sensor::Thermometer;

Supla::Sensor::Thermometer::Thermometer() {
  channel.setType(SUPLA_CHANNELTYPE_THERMOMETER);
  channel.setDefault(SUPLA_CHANNELFNC_THERMOMETER);
}

Thermometer::Thermometer(ThermometerDriver *driver) : Thermometer() {
  this->driver = driver;
}

void Supla::Sensor::Thermometer::onInit() {
  if (driver) {
    driver->initialize();
  }
  channel.setNewValue(getValue());
}

double Supla::Sensor::Thermometer::getValue() {
  if (driver) {
    return driver->getValue();
  }
  return TEMPERATURE_NOT_AVAILABLE;
}


void Supla::Sensor::Thermometer::iterateAlways() {
  if (millis() - lastReadTime > refreshIntervalMs) {
    lastReadTime = millis();
    channel.setNewValue(getValue());
  }
}

void Supla::Sensor::Thermometer::setHumidityCorrection(int32_t correction) {
  (void)(correction);
}

double Supla::Sensor::Thermometer::getTemp() {
  return getValue();
}
User avatar
klew
Posts: 10708
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Na instancji klasy termometu możesz wykonać:

Code: Select all

termometr->setRefreshIntervalMs(intervalMs);
i powinno odświeżać częściej. Ale czy to zadziała, zależy też od tego jaki tam masz termometr (np. na DS18B20 to nie zadziała).
kaceepeer
Posts: 8
Joined: Mon Jan 13, 2025 9:06 am

Post

Zapomniałam dodać, że chodzi właśnie o DS18B20 :roll:
User avatar
klew
Posts: 10708
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

kaceepeer wrote: Mon Jan 13, 2025 11:19 am Zapomniałam dodać, że chodzi właśnie o DS18B20 :roll:
To możesz w pliku src/supla/sensor/DS18B20.h zmienić tutaj:

Code: Select all

  void iterateAlways() {
    if (millis() - myBus->lastReadTime > 10000) {
      myBus->sensors.requestTemperatures();
      myBus->lastReadTime = millis();
    }
    if (millis() - myBus->lastReadTime > 5000 &&
        (lastReadTime != myBus->lastReadTime)) {
      channel.setNewValue(getValue());
      lastReadTime = myBus->lastReadTime;
    }
10000 -> 2000
5000 -> 1000

To zmieni odczyt z 10s na 2s. Szybciej nie wiem czy zadziała przy obecnej implementacji, bo tam jest najwyższa precyzja ustawiona i DS potrzebuje niecałą 1s na przeprowadzenie fizycznie odczytu.n
kaceepeer
Posts: 8
Joined: Mon Jan 13, 2025 9:06 am

Post

Dziękuję!
2 sekundy już mnie ratują.

Return to “FAQ / Jak to zrobić”