From bad2855dac6dd271e81879e1c68100a7fe1c77e0 Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Fri, 8 Nov 2019 20:31:55 +0300 Subject: [PATCH 1/3] sensor/dht: increase the delay per DHT22 datasheet Operating specifications / Communication and signal "Data-bus's free status is high voltage level. When communication between MCU and DHT22 begin, program of MCU will transform data-bus's voltage level from high to low level and this process must beyond at least **1ms** to ensure DHT22 could detect MCU's signal, then MCU will wait 20-40us for DHT22's response." --- code/espurna/sensors/DHTSensor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/espurna/sensors/DHTSensor.h b/code/espurna/sensors/DHTSensor.h index 93bca0395c..9084f81c35 100644 --- a/code/espurna/sensors/DHTSensor.h +++ b/code/espurna/sensors/DHTSensor.h @@ -149,7 +149,7 @@ class DHTSensor : public BaseSensor { if ((_type == DHT_CHIP_DHT11) || (_type == DHT_CHIP_DHT12)) { nice_delay(20); } else { - delayMicroseconds(500); + delayMicroseconds(1100); } digitalWrite(_gpio, HIGH); delayMicroseconds(40); From 6861417c4076262c3e077a122158eb513c9ce7e1 Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Fri, 8 Nov 2019 20:35:35 +0300 Subject: [PATCH 2/3] sensor/dht: set pin mode before digitalWrite --- code/espurna/sensors/DHTSensor.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/espurna/sensors/DHTSensor.h b/code/espurna/sensors/DHTSensor.h index 9084f81c35..8772035307 100644 --- a/code/espurna/sensors/DHTSensor.h +++ b/code/espurna/sensors/DHTSensor.h @@ -137,13 +137,14 @@ class DHTSensor : public BaseSensor { unsigned char byteInx = 0; unsigned char bitInx = 7; + pinMode(_gpio, OUTPUT); + // Send start signal to DHT sensor if (++_errors > DHT_MAX_ERRORS) { _errors = 0; digitalWrite(_gpio, HIGH); nice_delay(250); } - pinMode(_gpio, OUTPUT); noInterrupts(); digitalWrite(_gpio, LOW); if ((_type == DHT_CHIP_DHT11) || (_type == DHT_CHIP_DHT12)) { From d5ff0d3f1d0736cab5a5d5eed92d2394639d8416 Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Sat, 9 Nov 2019 02:57:12 +0300 Subject: [PATCH 3/3] sensor/dht: wait DHT_MIN_INTERVAL after initialization --- code/espurna/sensors/DHTSensor.h | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/code/espurna/sensors/DHTSensor.h b/code/espurna/sensors/DHTSensor.h index 8772035307..626907c976 100644 --- a/code/espurna/sensors/DHTSensor.h +++ b/code/espurna/sensors/DHTSensor.h @@ -20,6 +20,8 @@ #define DHT_CHIP_DHT21 21 #define DHT_CHIP_AM2301 21 +#define DHT_DUMMY_VALUE -255 + class DHTSensor : public BaseSensor { public: @@ -75,6 +77,9 @@ class DHTSensor : public BaseSensor { } _previous = _gpio; + // Set now to fail the check in _read at least once + _last_ok = millis(); + _count = 2; _ready = true; @@ -126,7 +131,11 @@ class DHTSensor : public BaseSensor { void _read() { if ((_last_ok > 0) && (millis() - _last_ok < DHT_MIN_INTERVAL)) { - _error = SENSOR_ERROR_OK; + if ((_temperature == DHT_DUMMY_VALUE) && (_humidity == DHT_DUMMY_VALUE)) { + _error = SENSOR_ERROR_WARM_UP; + } else { + _error = SENSOR_ERROR_OK; + } return; } @@ -246,8 +255,8 @@ class DHTSensor : public BaseSensor { unsigned long _last_ok = 0; unsigned char _errors = 0; - double _temperature = 0; - double _humidity = 0; + double _temperature = DHT_DUMMY_VALUE; + double _humidity = DHT_DUMMY_VALUE; };