The DHT11 (or DHT22 and similar) are cheap temperature and humidity sensors. The communicate with a uC is over a single wire, but unfortunately it is not compatible with the 1-Wire protocol defined by Dallas Semiconductors.

The electric connection to the ESP32 is very simple, as the DHT series can be powered direct with 3.3V. Only 3 wires are needed: VCC, GND and the data line.

Important is that a 10kΩ or at least 4.7kΩ resistor is needed between the data line and VCC. Sometimes this resistor is already integrated in the module, sometimes its necessary to add it.

The hardware connection was really easy, but the software gave me a lot of headaches. I tried several DHT libraries, but all of them worked very unreliable and failed with timeouts and checksum errors. The reason for this is quite simple, they are all written for single core Arduino boards.

The way the DHT is sending data is that it pulls the dataline high for either 70us for a ‘1’ or 26us for a ‘0’.

So during the data transmission the ESP32 has to watch the data line in a high frequency and measure the length of the pulses to detect the 0’s and 1’s. On an AVR controller this is not a big deal, as there is only one task active and the only thing needed is to disable interrupts to make sure the time measurement works.

On the ESP32 there are not only interrupts that can disturb the time measurement, in addition there is a multi task scheduler active that can switch at any time to a different task and then the time measurement simple fails. As long as there is only the function to read from the DHT sensor there is no problem. But as soon as WiFi and/or Bluetooth and/or other tasks are active, the reading from the DHT sensor fails most of the time because the reading is interrupted by task switches.

The only way to get around this is to disable task switching of the FreeRTOS on the ESP32 while data from the DHT sensor is received. And none of the existing DHT libraries had this implemented.

The only solution for me was to adapt an existing library to the requirements. So I created a DHTesp library and made it available to both Arduino IDE and PlatformIO.

The usage of the library is quite simple.

Define the class and the GPIO pin to which the DHT sensor is connected

Initialize the interface to the sensor and tell the library which sensor type will be used

Read the values from the sensor

The values are returned as a structure, containing the temperature and the humidity. To access the values the parts of the structure are read

I added some additional functions into the DHTesp library that might be useful for users

  • Heat index
  • Dew point
  • Comfort profile
  • Human perception

For details what these functions deliver, check the readme file of the repository.




  • Fabio

    Great! Thank you very much.

  • Roberto

    Muchas gracias por tu gran trabajo!!!

  • Steffen D

    Vielen Dank für diese SW. Ich suche schon lange eine Möglichkeit, bzw. komplettes Example, mit einen DHT22 die Temp. zu messen und dann aber über WLAN zu senden. Empfang über PC-Browser und Aufruf einer IP Adresse des ESP32 oder ESP8266? Alle eigenen Versuche scheiterten leider. Hätten sie da ev. schon etwas verwendbares oder wäre das nicht etwas?
    Vielen Dank für eine Info.

    • beegee1962

      Hallo Steffen,
      Ich habe keine fertige Lösung für einen DHT Webserver. Aber es gibt ein Tutorial von Adafruit. Es ist für den ESP8266, es sollte aber kein Problem sein es an den ESP32 anzupassen.

  • Thanks a lot !
    You made my day. My home temp sensors are now working perfect !
    It is mush faster than the DHT standard library.

    Could you add AM2302 to the definitions of temp sensor ?

    • beegee1962

      Thanks for the encouraging feedback.
      AM2302 is the same as DHT22, but if I find time I’ll add it.

  • carl-philippe cyr

    Wow great job!!

  • vandilson oliveira dos santos

    Muito obrigado.


  • Aaron Settle

    Hey, works great…is it possible to get a floating point number opposed to a int on the read out.


    • beegee1962

      float getTemperature();
      float getHumidity();
      return float as result. Not sure what you are referring to?

  • Werner

    ich versuche DHTesp mit ESP8266 zu benutzen.
    Mit allen anderen Bibliotheken habe ich dieses sporadische NAN Problem :O(
    Mit DHTesp funktioniert es jetzt fehlerfrei bei mir :O)
    Das Problem:
    Es funktioniert nur an GPIO16 ( alias D0 ? ), “dht.setup(16, DHTesp::DHT22);”
    Dabei benutze ich das Beispiel vom GITHUB.
    Die “16” ist die einzige Änderung.
    Das habe ich zufällig mit TrialAndError herausgefunden.
    Anschließen möchte ich aber zwei DHT22 und natürlich auch etwas mehr Programm als das Beispiel verwenden. Ich würde es auch gerne mit ESP8266-01 machen, mangels GPIO16 …
    Alle anderen Ports gehen einmal für ca. 2mS auf 0 Volt und später die Meldung TIMEOUT

    ARDUINO IDE 1.8.8 / DHTesp 1.0.9 / LoLin NodeMCU ESP8266 ver.3

    Warum geht es nur an einem einzigen GPIO, der Nummer 16 ?

    Für jeden Tipp dankbar,

    • beegee1962

      Ich habe keine Probleme mit anderen GPIO Nummern. Keine Ahnung warum das bei Dir nicht klappt.

  • Andyching168

    Thanks for build this library!
    I want to ask how can I read the data formated float like 25.32 C?

    • beegee1962

      The data is provided by the library in float.
      Possible ways to format it as char[]

      If you need it to send over WiFi, BLE or something else:
      char tempCharArray[6];
      float tempFloat = dht.getTemperature();
      snprintf(tempCharArray,6,”%.2f”, tempFloat);

      If you just want to print it out:
      float tempFloat = dht.getTemperature();
      Serial.printf(“Temperature is %0.2f C\n”, tempFloat);

  • fgAviator

    Thanks for creating and maintaining the library! Using this for multiple devices – each with two DHT22 sensors. Working nicely: not a single failed measurement in weeks.

  • recai

    Thank you
    I was very sleepless because of this problem,
    Good for me,
    I want to see the problem solved, now.
    I’ll try soon, hoping to correspond again
    Thanks again, very very

  • Hairyloon

    Does this library still work OK with Arduino?

    • beegee1962

      Why wouldn’t it? But be aware it’s for ESP8266 and ESP32 platforms.

  • Sam

    Great job!
    Having the same issues you described with other libs I changed to your ESP32 DHT11. Hopefully now I get rid of the sporadic wrong values I have (I assume them to be with valid checksum by multiple errors).

    Just one minor remark:
    In your example it would be helpful to add the


Leave a Reply

Your email address will not be published. Required fields are marked *

Free Link Directory