DHT ESP Temperature/Humidity Sensors

An Arduino library for reading the DHT family of temperature and humidity sensors.
Forked from arduino-DHT
Original written by Mark Ruys, mark@paracas.nl.

Why did I clone this library instead of forking the original repo and push the changes? When I searched through Github for DHT libraries, I found a lot of them, some of them offers additional functions, some of them only basic temperature and humidity values. I wanted to combine all interesting functions into one library. In addition, none of the DHT libraries I found were written to work without errors on the ESP32. For ESP32 (a multi core/ multi processing SOC) task switching must be disabled while reading data from the sensor.
Another problem I found is that many of the available libraries use the same naming (dht.h, dht.cpp), which easily leads to conflicts if different libraries are used for different platforms.

*According to users, the library works as well with DHT33 and DHT44 sensors. But as I do not own these sensors, I cannot test and confirm it. However, if you want to use this sensors, you can do so by using ``setup(pin, DHTesp::DHT22)`` and it should work. Please give me feedback in the issues if you successfull use these sensors. Thank you_

The library is tested as well on ESP8266 and should work on AVR boards as well.

Changes to the original library:

  • 2017-12-12: Renamed DHT class to DHTesp and filenames from dht.* to DHTesp.* to avoid conflicts with other libraries - beegee-tokyo, beegee@giesecke.tk.

  • 2017-12-12: Updated to work with ESP32 - beegee-tokyo, beegee@giesecke.tk.

  • 2017-12-12: Added function computeHeatIndex. Reference: Adafruit DHT library.

  • 2017-12-14: Added function computeDewPoint. Reference: idDHTLib.

  • 2017-12-14: Added function getComfortRatio. Reference: libDHT. (References about Human Comfort invalid)

  • 2017-12-15: Added function computePerception. Reference: WikiPedia Dew point==> Relationship to human comfort - beegee-tokyo, beegee@giesecke.tk.

  • 2018-01-02: Added example for multiple sensors usage.

  • 2018-01-03: Added function getTempAndHumidity which returns temperature and humidity in one call.

  • 2018-01-03: Added retry in case the reading from the sensor fails with a timeout.

  • 2018-01-08: Added ESP8266 (and probably AVR) compatibility.

  • 2018-03-11: Updated DHT example

  • 2018-06-19: Updated DHT example to distinguish between ESP8266 examples and ESP32 examples

  • 2018-07-06: Fixed bug in ESP32 example

  • 2018-07-17: Use correct field separator in keywords.txt

  • 2019-03-07: Added computeAbsoluteHumidity which returns the absolute humidity in g/m³. Reference: How to convert relative humidity to absolute humidity kudos to Wurstnase

  • 2019-03-22: Fixed auto detection problem

  • 2019-07-31: Make getPin() public, Updated ESP8266 example

  • 2019-10-01: Using noInterrupts() & interrupts() instead of cli and sei

  • 2019-10-05: Reduce CPU usage and add decimal part for DHT11 (thanks to Swiftyhu)

  • 2019-10-06: Back to working version by removing the last commit

Features

Functions

**``void setup(uint8_t pin, DHT_MODEL_t model=AUTO_DETECT);``*_

  • Call to initialize the interface, define the GPIO pin to which the sensor is connected and define the sensor type. Valid sensor types are:

    • AUTO_DETECT Try to detect which sensor is connected (default if 2nd parameter is not used)

    • DHT11

    • DHT22

    • AM2302 Packaged DHT22

    • RHT03 Equivalent to DHT22
      **``void resetTimer();``*_

  • Reset last time the sensor was read

**``float getTemperature();``*_

  • Get the temperature in degree Centigrade from the sensor
    Either one of *getTemperature()* or *getHumidity()* or *getTempAndHumidity()* initiates reading a value from the sensor if the last reading was older than the minimal refresh time of the sensor.
    See example _`DHT_ESP32.ino`_ or _`DHT_Test.ino`_

**``float getHumidity();``*_

  • Get the humidity from the sensor
    Either one of *getTemperature()* or *getHumidity()* or *getTempAndHumidity()* initiates reading a value from the sensor if the last reading was older than the minimal refresh time of the sensor.
    See example _`DHT_ESP32.ino`_ or _`DHT_Test.ino`_

**``TempAndHumidity getTempAndHumidity();``*_

  • Get the temperature and humidity from the sensor
    Either one of *getTemperature()* or *getHumidity()* or *getTempAndHumidity()* initiates reading a value from the sensor if the last reading was older than the minimal refresh time of the sensor.
    Return value is a struct of type *TempAndHumidity* with temperature and humidity as float values. See example _`DHT_Multi.ino`_

**``DHT_ERROR_t getStatus();``*_

  • Get last error if reading from the sensor failed. Possible values are:

    • ERROR_NONE no error occured

    • ERROR_TIMEOUT timeout reading from the sensor

    • ERROR_CHECKSUM checksum of received values doesn’t match

*`const char* getStatusString();`_

  • Get last error as a char *

**``DHT_MODEL_t getModel()``*_

  • Get detected (or defined) sensor type

**``int getMinimumSamplingPeriod();``*_

  • Get minimmum possible sampling period. For DHT11 this is 1000ms, for other sensors it is 2000ms

**``int8_t getNumberOfDecimalsTemperature();``*_

  • Get number of decimals in the temperature value. For DHT11 this is 0, for other sensors it is 1

**``int8_t getLowerBoundTemperature();``*_

  • Get lower temperature range of the sensor. For DHT11 this is 0 degree Centigrade, for other sensors this is -40 degree Centrigrade

**``int8_t getUpperBoundTemperature();``*_

  • Get upper temperature range of the sensor. For DHT11 this is 50 degree Centigrade, for other sensors this is 125 degree Centrigrade

**``int8_t getNumberOfDecimalsHumidity();``*_

  • Get number of decimals in the humidity value. This is always 0.

**``int8_t getLowerBoundHumidity();``*_

  • Get lower humidity range of the sensor. For DHT11 this is 20 percent, for other sensors this is 0 percent

**``int8_t getUpperBoundHumidity();``*_

  • Get upper temperature range of the sensor. For DHT11 this is 90 percent, for other sensors this is 100 percent

**``static float toFahrenheit(float fromCelcius);``*_

  • Convert Centrigrade value to Fahrenheit value

**``static float toCelsius(float fromFahrenheit) { return (fromFahrenheit - 32.0) / 1.8; };``*_

  • Convert Fahrenheit value to Centigrade value

**``float computeHeatIndex(float temperature, float percentHumidity, bool isFahrenheit=false);``*_

  • Compute the heat index. Default temperature is in Centrigrade.

**``float computeDewPoint(float temperature, float percentHumidity, bool isFahrenheit=false);``*_

  • Compute the dew point. Default temperature is in Centrigrade.

**``float computeAbsoluteHumidity(float temperature, float percentHumidity, bool isFahrenheit=false);``*_

  • Compute the absolute humidity in g/m³. Default temperature is in Centrigrade.

**``float getComfortRatio(ComfortState& destComfStatus, float temperature, float percentHumidity, bool isFahrenheit=false);``*_

  • Compute the comfort ratio. Default temperature is in Centrigrade. Return values:
    0 -> OK
    1 -> Too Hot
    2 -> Too cold
    4 -> Too dry
    8 -> Too humid
    9 -> Hot and humid
    5 -> Hot and dry
    10 -> Cold and humid
    6 -> Cold and dry

**``byte computePerception(float temperature, float percentHumidity, bool isFahrenheit=false);``*_

  • Compute the human perception. Default temperature is in Centrigrade. Return values:
    0 -> Dry
    1 -> Very comfortable
    2 -> Comfortable
    3 -> Ok
    4 -> Uncomfortable
    5 -> Quite uncomfortable
    6 -> Very uncomfortable
    7 -> Severe uncomfortable

**``uint8_t getPin(void);``*_

  • Returns the assigned GPIO for this instance. Usefull when connecting multiple sensors

Usage

See examples. For all the options, see dhtesp.h.

Installation

In Arduino IDE open Sketch->Include Library->Manage Libraries then search for *DHT ESP:raw-html-m2r:`<br>` In PlatformIO open PlatformIO Home, switch to libraries and search for ***DHT ESP32*. Or install the library in the terminal with **platformio lib install 2029**_

For manual installation download the archive, unzip it and place the DHTesp folder into the library directory.
In Arduino IDE this is usually **``<arduinosketchfolder>/libraries/``*:raw-html-m2r:`<br>` In PlatformIO this is usually **<user/.platformio/lib>**_

References

Used by

SoC support

  • esp32

  • esp32c3

  • esp32s2

  • esp32s3

  • esp8266

  • host

  • rp2040