Interfacing ASAIR DHT20 Temperature & Humidity Sensor with Arduino
Learn how to interface the DHT20 compact temperature and humidity sensor from Asair with Arduino.

In the last post, we introduced you to the AGS02MA TVOC sensor. This time, it is the DHT20 temperature and humidity sensor from the same company Asair. The DHT20 is a new-generation sensor with better performance and reliability according to the manufacturer. Inside the DHT20 is the AHT20 sensor module. The IC is soldered on a small PCB and the pins are broken out. The entire circuit is enclosed in a plastic case. The dimensions of the plastic enclosure and the pinout are the same across this type of sensors from Asair. This makes it easy to swap the sensors in your application. In this post, we will take a closer look at the sensor and learn how you can interface this sensor with any of your Arduino microcontroller boards.
How to Use VS Code for Creating and Uploading Arduino Sketches
ASAIR DHT20


DHT20 is compact and low-cost temperature and humidity sensor. It is a new-generation sensor that replaces the popular DHT11/DHT22 class sensors from the same brand. The form-factor of the sensor remain the same. However, the new DHT20 uses I2C interface instead of a simple data output found in the DHT11/DHT22. Inside the DHT20 is the actual sensor AHT20 soldered on a small PCB. If you are planning to use this sensor in your project and you want to keep things small, it is better to use the AHT20 sensor directly. You can use this sensor in applications like HVAC (Heating Ventilation & Air Conditioning), air quality monitor, dehumidifiers etc.
The sensor module breaks out four pins for power and the I2C interface. There are no internal I2C pull-ups, and so you need to add them externally. The sensor can be powered from 2.2~5.5V. Though we do not recommend exceeding the 5V mark. The humidity measurement range is from 0~100% RH (Relative Humidity) with an accuracy of ±3% RH at 25°C, and a repeatability of 0.1% RH/Y. The temperature measurement range is from -40~+80 °C with an accuracy of ±0.5 °C. The sensor is pre-calibrated and works out of the box. We bought the DHT20 sensor from Robu for INR 120. You can also get the AHT20 for almost half the price.
Specifications
Model | DHT20 |
---|---|
Supply Voltage | 2.2~5.5V DC |
Temperature Range | -40 ~ +80°C |
Humidity Range | 0 ~ 100% RH |
Temperature Accuracy | 0.5 °C |
Humidity Accuracy | ±3% RH (25°C) |
Temp. Repeatability | 0.1 °C/Y |
Humidity Repeatability | 0.1% RH/Y |
Temp. Resolution | 0.01 °C |
Humidity Resolution | 0.024% RH |
Response Time | Temp.: 5~30s (τ 63%) RH: <85 (τ 63%) |
Material | ABS + PC |
Interface | I2C |
Pinout
#Pin | Name | Function |
---|---|---|
1 | VDD | Power Input |
2 | SDA | Serial Data |
3 | GND | Ground |
4 | SCL | Serial Clock |
Dimensions

Wiring
We will use the FireBeetle-ESP32E board for interfacing the sensor. Connecting the DHT20 to the ESP32 board is easy. You just need to supply the power and connect the I2C pins to the I2C interface of the microcontroller. Wire them up the following way.
DHT20 | FireBeetle-ESP32E | ||
---|---|---|---|
#Pin | Name | #Pin | GPIO |
1 | VDD | 3V3 | – |
2 | SDA | SDA | GPIO21 |
3 | GND | GND | – |
4 | SCL | SCL | GPIO22 |
If you are using a 5V microcontroller, supply 5V for the sensor also. The sensor works reliably between 3.3V to 5.5V. But it is not recommended to exceed the 5V level. The sensor does not have on-board I2C pull-ups. Therefore, we need to add them externally. We are using a breadboard to connect everything.

Code
We are going to use the Adafruit AHTX0 Arduino library for reading the measurements from the DHT20 sensor. The library is written for the AHT10 & AHT20 sensors. Since DHT20 also uses AHT20 inside, the library is compatible with our sensor. We will use the FireBeetle-ESP32E microcontroller board for this demo and create the project using PlatformIO and VS Code. Following is the main.cpp
file.
//======================================================================================//
#include <Arduino.h>
#include <Adafruit_AHTX0.h>
//======================================================================================//
// Global variables
Adafruit_AHTX0 dht; // Create a new sensor object.
//======================================================================================//
// Forward declarations
bool initDHT20();
void readSensor();
//======================================================================================//
void setup() {
Serial.begin (115200);
Serial.println();
Serial.println ("Asair DHT20 - Temperature & Humidity Sensor Example");
Serial.println();
initDHT20();
}
//======================================================================================//
bool initDHT20() {
Serial.println (F("initDHT20 [INFO]: Initializing DHT20 sensor.."));
if (!dht.begin()) {
Serial.println ("initDHT20 [ERROR]: Couldn't find the DHT20 sensor. Check your wiring and pull-up resistors.");
while (1) yield();
}
Serial.println();
return true;
}
//======================================================================================//
void loop() {
readSensor();
delay (1000);
}
//======================================================================================//
void readSensor() {
sensors_event_t humidity, temp;
dht.getEvent (&humidity, &temp); // Read the temperature and humidity
Serial.print ("Temperature: ");
Serial.print (temp.temperature);
Serial.println (" °C");
Serial.print ("Humidity: ");
Serial.print (humidity.relative_humidity);
Serial.println (" % RH");
Serial.println();
}
//======================================================================================//
main.cppFollowing is the platformio.ini
configuration file.
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:esp32doit-devkit-v1]
platform = espressif32
board = esp32doit-devkit-v1
framework = arduino
lib_deps =
Adafruit_AGS02MA=https://github.com/adafruit/Adafruit_AHTX0.git
platformio.iniFollowing is the compilation and upload log.
Executing task: C:\PIO\penv\Scripts\platformio.exe run --target upload
Processing esp32doit-devkit-v1 (platform: espressif32; board: esp32doit-devkit-v1; framework: arduino)
-----------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32doit-devkit-v1.html
PLATFORM: Espressif 32 (6.10.0) > DOIT ESP32 DEVKIT V1
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:
- framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b
- tool-esptoolpy @ 1.40501.0 (4.5.1)
- tool-mkfatfs @ 2.0.1
- tool-mklittlefs @ 1.203.210628 (2.3)
- tool-mkspiffs @ 2.230.0 (2.30)
- toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 38 compatible libraries
Scanning dependencies...
Dependency Graph
|-- Adafruit AHTX0 @ 2.0.5+sha.805eab7
Building in release mode
Compiling .pio\build\esp32doit-devkit-v1\src\main.cpp.o
Building .pio\build\esp32doit-devkit-v1\bootloader.bin
Generating partitions .pio\build\esp32doit-devkit-v1\partitions.bin
esptool.py v4.5.1
Creating esp32 image...
Merged 1 ELF section
Successfully created esp32 image.
Compiling .pio\build\esp32doit-devkit-v1\lib265\Wire\Wire.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\lib2bb\SPI\SPI.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\lib8c8\Adafruit BusIO\Adafruit_BusIO_Register.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\lib8c8\Adafruit BusIO\Adafruit_GenericDevice.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\lib8c8\Adafruit BusIO\Adafruit_I2CDevice.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\lib8c8\Adafruit BusIO\Adafruit_SPIDevice.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\libaf2\Adafruit Unified Sensor\Adafruit_Sensor.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\lib860\Adafruit_AGS02MA\Adafruit_AHTX0.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\Esp.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\FirmwareMSC.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\FunctionalInterrupt.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\HWCDC.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\HardwareSerial.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\IPAddress.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\IPv6Address.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\MD5Builder.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\Print.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\Stream.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\StreamString.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\Tone.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\USB.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\USBCDC.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\USBMSC.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\WMath.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\WString.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\base64.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\cbuf.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-adc.c.o
Archiving .pio\build\esp32doit-devkit-v1\lib265\libWire.a
Archiving .pio\build\esp32doit-devkit-v1\lib2bb\libSPI.a
Archiving .pio\build\esp32doit-devkit-v1\lib8c8\libAdafruit BusIO.a
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-bt.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-cpu.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-dac.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-gpio.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-i2c-slave.c.o
Archiving .pio\build\esp32doit-devkit-v1\libaf2\libAdafruit Unified Sensor.a
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-i2c.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-ledc.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-matrix.c.o
Indexing .pio\build\esp32doit-devkit-v1\lib265\libWire.a
Indexing .pio\build\esp32doit-devkit-v1\lib2bb\libSPI.a
Indexing .pio\build\esp32doit-devkit-v1\lib8c8\libAdafruit BusIO.a
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-misc.c.o
Indexing .pio\build\esp32doit-devkit-v1\libaf2\libAdafruit Unified Sensor.a
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-psram.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-rgb-led.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-rmt.c.o
Archiving .pio\build\esp32doit-devkit-v1\lib860\libAdafruit_AGS02MA.a
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-sigmadelta.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-spi.c.o
Indexing .pio\build\esp32doit-devkit-v1\lib860\libAdafruit_AGS02MA.a
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-time.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-timer.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-tinyusb.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-touch.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\esp32-hal-uart.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\firmware_msc_fat.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\libb64\cdecode.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\libb64\cencode.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\main.cpp.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\stdlib_noniso.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\wiring_pulse.c.o
Compiling .pio\build\esp32doit-devkit-v1\FrameworkArduino\wiring_shift.c.o
Archiving .pio\build\esp32doit-devkit-v1\libFrameworkArduino.a
Indexing .pio\build\esp32doit-devkit-v1\libFrameworkArduino.a
Linking .pio\build\esp32doit-devkit-v1\firmware.elf
Retrieving maximum program size .pio\build\esp32doit-devkit-v1\firmware.elf
Checking size .pio\build\esp32doit-devkit-v1\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM: [= ] 6.7% (used 21816 bytes from 327680 bytes)
Flash: [== ] 22.0% (used 288833 bytes from 1310720 bytes)
Building .pio\build\esp32doit-devkit-v1\firmware.bin
esptool.py v4.5.1
Creating esp32 image...
Merged 2 ELF sections
Successfully created esp32 image.
Configuring upload protocol...
AVAILABLE: cmsis-dap, esp-bridge, esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa
CURRENT: upload_protocol = esptool
Looking for upload port...
Auto-detected: COM8
Uploading .pio\build\esp32doit-devkit-v1\firmware.bin
esptool.py v4.5.1
Serial port COM8
Connecting......
Chip is ESP32-D0WD-V3 (revision v3.0)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: e0:5a:1b:55:d1:bc
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Flash will be erased from 0x00001000 to 0x00005fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Flash will be erased from 0x0000e000 to 0x0000ffff...
Flash will be erased from 0x00010000 to 0x00056fff...
Compressed 17536 bytes to 12202...
Writing at 0x00001000... (100 %)
Wrote 17536 bytes (12202 compressed) at 0x00001000 in 0.6 seconds (effective 217.4 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 146...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (146 compressed) at 0x00008000 in 0.1 seconds (effective 340.8 kbit/s)...
Hash of data verified.
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 491.3 kbit/s)...
Hash of data verified.
Compressed 289200 bytes to 161514...
Writing at 0x00010000... (10 %)
Writing at 0x0001bcee... (20 %)
Writing at 0x000248c5... (30 %)
Writing at 0x00029f7a... (40 %)
Writing at 0x0002f5bb... (50 %)
Writing at 0x00034830... (60 %)
Writing at 0x0003b867... (70 %)
Writing at 0x0004524f... (80 %)
Writing at 0x0004c5b1... (90 %)
Writing at 0x00051ad3... (100 %)
Wrote 289200 bytes (161514 compressed) at 0x00010000 in 3.8 seconds (effective 611.1 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
============================================ [SUCCESS] Took 12.67 seconds ============================================
* Terminal will be reused by tasks, press any key to close it.
TerminalAfter uploading the code, you can open the serial monitor to see the measurements. The sensor instantly report the temperature and humidity measurements. Though we recommend waiting at least a minute for the readings to settle.
ets Jul 29 2019 12:21:46
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:1184
load:0x40078000,len:13232
load:0x40080400,len:3028
entry 0x400805e4
Asair DHT20 - Temperature & Humidity Sensor Example
initDHT20 [INFO]: Initializing DHT20 sensor..
Temperature: 26.35 °C
Humidity: 60.61 % RH
Temperature: 26.35 °C
Humidity: 60.21 % RH
Temperature: 26.34 °C
Humidity: 59.80 % RH
Temperature: 26.32 °C
Humidity: 59.40 % RH
Temperature: 26.34 °C
Humidity: 59.08 % RH
Temperature: 26.33 °C
Humidity: 58.71 % RH
Serial MonitorWe will be posting more similar tutorials on environmental sensing soon. If you have any difficulty in using this sensor, please let us know in the comments. If you are new PlatformIO and VS Code, please check out our following tutorials. Happy coding 🖥️
How to Use VS Code for Creating and Uploading Arduino Sketches
Getting Started with PlatformIO – Unified IDE for Embedded Software Development
Links
- ASAIR DHT20 – Product Page
- DHT20 – Datasheet [PDF]
- DHT20 – Product Design Guide [PDF]
- Buy Asair DHT20 Temperature & Humidity Sensor – Robu
- Buy Asair AHT20 Temperature & Humidity Sensor – Robu
Short Link
- Short URL to this page – https://www.circuitstate.com/intdht20