diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index f18c25b6b..0bb9f9aec 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,4 +1,5 @@ /* 6.1.0a + * Change DHT driver to provide better instant results and add decimals to DHT11 (#3164) * Change DS18x20 driver to provide better instant results (#3169) * Change DS18B20 driver to provide better instant results * Remove TSL2561 debug message and update library (#2415) diff --git a/sonoff/xsns_05_ds18b20.ino b/sonoff/xsns_05_ds18b20.ino index 12ebe3be2..505f75a76 100644 --- a/sonoff/xsns_05_ds18b20.ino +++ b/sonoff/xsns_05_ds18b20.ino @@ -29,9 +29,8 @@ #define DS18B20_MAX_MISS 5 float ds18b20_temperature = 0; -uint16_t ds18b20_last_result = 0; +uint8_t ds18b20_last_result = 0; uint8_t ds18x20_pin = 0; -uint8_t ds18b20_second = 0; /*********************************************************************************************\ * Embedded stripped and tuned OneWire library @@ -175,8 +174,7 @@ void Ds18b20Read() void Ds18b20EverySecond() { ds18x20_pin = pin[GPIO_DSB]; - ds18b20_second++; - if (ds18b20_second &1) { + if (uptime &1) { Ds18b20Convert(); // Start conversion, takes up to one second } else { Ds18b20Read(); // Read temperature diff --git a/sonoff/xsns_05_ds18x20.ino b/sonoff/xsns_05_ds18x20.ino index 96c6ef335..5a64ddc29 100644 --- a/sonoff/xsns_05_ds18x20.ino +++ b/sonoff/xsns_05_ds18x20.ino @@ -36,21 +36,18 @@ #define DS18X20_MAX_MISS 5 #define DS18X20_MAX_SENSORS 8 -typedef struct DS18X20SENSORS { - uint8_t address[8]; - uint8_t index; - uint8_t result; - float temperature; -} Ds18x20Sensor; - const char kDs18x20Types[] PROGMEM = "DS18x20|DS18S20|DS1822|DS18B20|MAX31850"; uint8_t ds18x20_chipids[] = { 0, DS18S20_CHIPID, DS1822_CHIPID, DS18B20_CHIPID, MAX31850_CHIPID }; -Ds18x20Sensor ds18x20_sensor[DS18X20_MAX_SENSORS]; +struct DS18X20STRUCT { + uint8_t address[8]; + uint8_t index; + uint8_t result; + float temperature; +} ds18x20_sensor[DS18X20_MAX_SENSORS]; uint8_t ds18x20_sensors = 0; uint8_t ds18x20_pin = 0; -uint8_t ds18x20_second = 0; char ds18x20_types[9]; /*********************************************************************************************\ @@ -360,8 +357,7 @@ void Ds18x20Read(uint8_t sensor) void Ds18x20EverySecond() { - ds18x20_second++; - if (ds18x20_second &1) { + if (uptime &1) { Ds18x20Convert(); // Start conversion, takes up to one second } else { for (uint8_t i = 0; i < ds18x20_sensors; i++) { diff --git a/sonoff/xsns_06_dht.ino b/sonoff/xsns_06_dht.ino index 91a154169..855248a71 100644 --- a/sonoff/xsns_06_dht.ino +++ b/sonoff/xsns_06_dht.ino @@ -139,45 +139,30 @@ void DhtRead(byte sensor) } } -boolean DhtReadTempHum(byte sensor, float &t, float &h) +void DhtReadTempHum(byte sensor) { - if (NAN == Dht[sensor].h) { - t = NAN; - h = NAN; - } else { - if (Dht[sensor].lastresult > DHT_MAX_RETRY) { // Reset after 8 misses - Dht[sensor].t = NAN; - Dht[sensor].h = NAN; - } - t = Dht[sensor].t; - h = Dht[sensor].h; + if ((NAN == Dht[sensor].h) || (Dht[sensor].lastresult > DHT_MAX_RETRY)) { // Reset after 8 misses + Dht[sensor].t = NAN; + Dht[sensor].h = NAN; } - DhtRead(sensor); if (!Dht[sensor].lastresult) { switch (Dht[sensor].type) { case GPIO_DHT11: - h = dht_data[0]; - t = dht_data[2]; + Dht[sensor].h = dht_data[0]; + Dht[sensor].t = dht_data[2] + ((float)dht_data[3] * 0.1f); // Issue #3164 break; case GPIO_DHT22: case GPIO_SI7021: - h = ((dht_data[0] << 8) | dht_data[1]) * 0.1; - t = (((dht_data[2] & 0x7F) << 8 ) | dht_data[3]) * 0.1; + Dht[sensor].h = ((dht_data[0] << 8) | dht_data[1]) * 0.1; + Dht[sensor].t = (((dht_data[2] & 0x7F) << 8 ) | dht_data[3]) * 0.1; if (dht_data[2] & 0x80) { - t *= -1; + Dht[sensor].t *= -1; } break; } - t = ConvertTemp(t); - if (!isnan(t)) { - Dht[sensor].t = t; - } - if (!isnan(h)) { - Dht[sensor].h = h; - } + Dht[sensor].t = ConvertTemp(Dht[sensor].t); } - return (!isnan(t) && !isnan(h)); } boolean DhtSetup(byte pin, byte type) @@ -210,6 +195,17 @@ void DhtInit() } } +void DhtEverySecond() +{ + if (uptime &1) { + DhtReadPrep(); + } else { + for (byte i = 0; i < dht_sensors; i++) { + DhtReadTempHum(i); + } + } +} + void DhtShow(boolean json) { char temperature[10]; @@ -217,34 +213,30 @@ void DhtShow(boolean json) byte dsxflg = 0; for (byte i = 0; i < dht_sensors; i++) { - float t = NAN; - float h = NAN; - if (DhtReadTempHum(i, t, h)) { // Read temperature - dtostrfd(t, Settings.flag2.temperature_resolution, temperature); - dtostrfd(h, Settings.flag2.humidity_resolution, humidity); + dtostrfd(Dht[i].t, Settings.flag2.temperature_resolution, temperature); + dtostrfd(Dht[i].h, Settings.flag2.humidity_resolution, humidity); - if (json) { - snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, Dht[i].stype, temperature, humidity); + if (json) { + snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, Dht[i].stype, temperature, humidity); #ifdef USE_DOMOTICZ - if ((0 == tele_period) && !dsxflg) { - DomoticzTempHumSensor(temperature, humidity); - dsxflg++; - } + if ((0 == tele_period) && !dsxflg) { + DomoticzTempHumSensor(temperature, humidity); + dsxflg++; + } #endif // USE_DOMOTICZ #ifdef USE_KNX - if (0 == tele_period) { - KnxSensor(KNX_TEMPERATURE, t); - KnxSensor(KNX_HUMIDITY, h); - } + if (0 == tele_period) { + KnxSensor(KNX_TEMPERATURE, Dht[i].t); + KnxSensor(KNX_HUMIDITY, Dht[i].h); + } #endif // USE_KNX #ifdef USE_WEBSERVER - } else { - snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_TEMP, mqtt_data, Dht[i].stype, temperature, TempUnit()); - snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_HUM, mqtt_data, Dht[i].stype, humidity); + } else { + snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_TEMP, mqtt_data, Dht[i].stype, temperature, TempUnit()); + snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_HUM, mqtt_data, Dht[i].stype, humidity); #endif // USE_WEBSERVER - } } } } @@ -264,8 +256,8 @@ boolean Xsns06(byte function) case FUNC_INIT: DhtInit(); break; - case FUNC_PREP_BEFORE_TELEPERIOD: - DhtReadPrep(); + case FUNC_EVERY_SECOND: + DhtEverySecond(); break; case FUNC_JSON_APPEND: DhtShow(1);