diff --git a/drivers/dht/dht.c b/drivers/dht/dht.c index 81754ac15f43f..a7ffe54e27e3d 100644 --- a/drivers/dht/dht.c +++ b/drivers/dht/dht.c @@ -37,7 +37,8 @@ #define mp_hal_pin_od_high_dht mp_hal_pin_od_high #endif -STATIC mp_obj_t dht_readinto(mp_obj_t pin_in, mp_obj_t buf_in) { +// dht_version should be 22 for DHT22 and 11 for DHT11 +STATIC mp_obj_t dht_readinto(mp_obj_t pin_in, mp_obj_t buf_in, mp_obj_t dht_version) { mp_hal_pin_obj_t pin = mp_hal_get_pin_obj(pin_in); mp_hal_pin_open_drain(pin); @@ -52,7 +53,15 @@ STATIC mp_obj_t dht_readinto(mp_obj_t pin_in, mp_obj_t buf_in) { mp_hal_pin_od_high_dht(pin); mp_hal_delay_ms(250); mp_hal_pin_od_low(pin); - mp_hal_delay_ms(18); + + // we have to use non-interruptable delay here, because otherwise + // on high system load, we get DHT timeout errors: see Issue #5848 + // DHT22 needs only 1-3 milliseconds low, DHT11 needs 18 milliseconds low + if(mp_obj_get_int(dht_version) == 22){ + mp_hal_delay_us_fast(3000); + }else{ + mp_hal_delay_us_fast(18000); + } mp_uint_t irq_state = mp_hal_quiet_timing_enter(); @@ -91,4 +100,4 @@ STATIC mp_obj_t dht_readinto(mp_obj_t pin_in, mp_obj_t buf_in) { mp_hal_quiet_timing_exit(irq_state); mp_raise_OSError(MP_ETIMEDOUT); } -MP_DEFINE_CONST_FUN_OBJ_2(dht_readinto_obj, dht_readinto); +MP_DEFINE_CONST_FUN_OBJ_3(dht_readinto_obj, dht_readinto); diff --git a/drivers/dht/dht.h b/drivers/dht/dht.h index 883e077961941..5bf8839828fde 100644 --- a/drivers/dht/dht.h +++ b/drivers/dht/dht.h @@ -3,6 +3,6 @@ #include "py/obj.h" -MP_DECLARE_CONST_FUN_OBJ_2(dht_readinto_obj); +MP_DECLARE_CONST_FUN_OBJ_3(dht_readinto_obj); #endif // MICROPY_INCLUDED_DRIVERS_DHT_DHT_H diff --git a/drivers/dht/dht.py b/drivers/dht/dht.py index 1163b382bbc77..94473c22edb98 100644 --- a/drivers/dht/dht.py +++ b/drivers/dht/dht.py @@ -14,12 +14,16 @@ def __init__(self, pin): def measure(self): buf = self.buf - dht_readinto(self.pin, buf) + dht_readinto(self.pin, buf, self.dht_version) if (buf[0] + buf[1] + buf[2] + buf[3]) & 0xFF != buf[4]: raise Exception("checksum error") class DHT11(DHTBase): + def __init__(self, pin): + DHTBase.__init__(self, pin) + self.dht_version = 11 + def humidity(self): return self.buf[0] @@ -28,6 +32,10 @@ def temperature(self): class DHT22(DHTBase): + def __init__(self, pin): + DHTBase.__init__(self, pin) + self.dht_version = 22 + def humidity(self): return (self.buf[0] << 8 | self.buf[1]) * 0.1 pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy