Skip to main content
ESPBoards

ESP32 AHT20 Temperature and Humidity Sensor

The AHT20 datasheet provides comprehensive technical details about the AHT20 digital temperature and humidity sensor, a highly accurate and reliable component designed for industrial-grade applications. This document includes information on the sensor's specifications, electrical characteristics, communication protocols, and recommended usage guidelines, ensuring users can integrate it seamlessly into their projects.

Jump to Code Examples

Arduino Core Image
ESP-IDF Image
ESPHome Image
PlatformIO Image
MicroPython Image

Quick Links

AHT20 Temperature and Humidity Sensor Datasheet ButtonAHT20 Temperature and Humidity Sensor Specs ButtonAHT20 Temperature and Humidity Sensor Specs ButtonAHT20 Temperature and Humidity Sensor Specs Button

AHT20 Price

AHT20 Temperature and Humidity Sensor
Normally, the AHT20 Temperature and Humidity Sensor costs around 4$ per Psc.
The prices are subject to change. Check current price:

Amazon com

Amazon de logo

Aliexpress logo

About AHT20 Temperature and Humidity Sensor

The AHT series comprises digital temperature and humidity sensors manufactured by Aosong Electronics Co., Ltd., also known as AOSONG. The AHT20 is an upgraded version in the AHT series, offering improved performance and precision compared to its predecessor, the AHT10. The AHT20 sensor provides enhanced accuracy in temperature and humidity measurements, making it an ideal choice for a wider range of applications requiring reliable environmental monitoring. Learn more about the AHT20 sensor in the series. Also check the previous, cheaper version - AHT10 Sensor.

AHT20 Sensor Technical Specifications

Below you can see the AHT20 Temperature and Humidity Sensor Technical Specifications. The sensor is compatible with the ESP32, operating within a voltage range suitable for microcontrollers. For precise details about its features, specifications, and usage, refer to the sensor’s datasheet.

  • Protocol: I2C
  • Interface: I2C
  • Accuracy: ±2% RH, ±0.3 °C
  • Operating Range: -40°C to 85°C, 0–100% RH
  • Voltage: 2.0V to 5.5V (typical 3.3V)

AHT20 Sensor Pinout

Below you can see the pinout for the AHT20 Temperature and Humidity Sensor. The VCC pin is used to supply power to the sensor, and it typically requires 3.3V or 5V (refer to the datasheet for specific voltage requirements). The GND pin is the ground connection and must be connected to the ground of your ESP32!

The AHT20 pinout is simple and follows the I2C communication protocol:

  • SDA (Data Line): Used for transferring data between the sensor and the microcontroller (ESP32).
  • SCL (Clock Line): Provides the clock signal for synchronizing data transfer.
  • GND (Ground): Connect to the ground of the ESP32 to complete the circuit.
  • VCC (Power): Connect to the 3.3V or 5V power supply on the ESP32 to power the sensor.

AHT20 Wiring with ESP32

Below you can see the wiring for the AHT20 Temperature and Humidity Sensor with the ESP32. Connect the VCC pin of the sensor to the 3.3V pin on the ESP32 or external power supply for power and the GND pin of the sensor to the GND pin of the ESP32. Depending on the communication protocol of the sensor (e.g., I2C, SPI, UART, or analog), connect the appropriate data and clock or signal pins to compatible GPIO pins on the ESP32, as shown below in the wiring diagram.

Since AHT20 uses I2C protocol, simply connect SDA, SCL, VCC and GND pins to the ESP32. Make sure to configure the I2C pins accordingly.

Code Examples

Below you can find code examples of AHT20 Temperature and Humidity Sensor with ESP32 in several frameworks:

If you encounter issues while using the AHT20 Temperature and Humidity Sensor, check the Common Issues Troubleshooting Guide.

Arduino Core Image

ESP32 AHT20 Arduino IDE Code Example

Example in Arduino IDE

Fill in your main Arduino IDE sketch file with the following code to use the AHT20 Temperature and Humidity Sensor:

#include <Wire.h>
#include <Adafruit_AHT10.h>

// Create an instance of the AHT20 sensor
Adafruit_AHT10 aht;

void setup() {
// Initialize Serial Monitor
Serial.begin(115200);
Serial.println("AHT20 Sensor Example");

// Initialize I2C communication
if (!aht.begin(Adafruit_AHT10::AHTX0_SENSOR)) { // Specify AHT20 variant
Serial.println("Failed to find AHT20 sensor! Check wiring.");
while (1);
}
Serial.println("AHT20 sensor initialized.");
}

void loop() {
// Read temperature and humidity from the sensor
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp); // Populate the event objects

// Print temperature and humidity to Serial Monitor
Serial.print("Temperature: ");
Serial.print(temp.temperature);
Serial.println(" °C");

Serial.print("Humidity: ");
Serial.print(humidity.relative_humidity);
Serial.println(" %");

// Delay between readings
delay(2000);
}

The code uses the Adafruit_AHT10 library to interface with the AHT20 sensor. It begins by including the required libraries, #include <Wire.h> for I2C communication and #include <Adafruit_AHT10.h> for the sensor-specific functionality.

An instance of the AHT20 sensor is created using Adafruit_AHT10 aht;. In the setup() function, the serial communication is initialized with Serial.begin(115200), and the sensor is initialized using aht.begin(). If the sensor is not detected, an error message is printed, and the program enters an infinite loop.

The loop() function reads the temperature and humidity data from the sensor using aht.getEvent(&humidity, &temp). The temperature is accessed via temp.temperature, and the humidity via humidity.relative_humidity. These values are printed to the Serial Monitor using Serial.print(). A delay of 2 seconds is added between readings using delay(2000).

Connect your ESP32 to your computer via a USB cable, Ensure the correct Board and Port are selected under Tools, Click the "Upload" button in the Arduino IDE to compile and upload the code to your ESP32.

ESP-IDF Image

ESP32 AHT20 ESP-IDF Code Example
Example in Espressif IoT Framework (ESP-IDF)

If you're using ESP-IDF to work with the AHT20 Temperature and Humidity Sensor, here's how you can set it up and read data from the sensor. Fill in this code in the main ESP-IDF file:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/i2c.h"

#define I2C_MASTER_NUM I2C_NUM_0 // I2C port number
#define I2C_MASTER_SDA_IO 21 // GPIO for SDA
#define I2C_MASTER_SCL_IO 22 // GPIO for SCL
#define I2C_MASTER_FREQ_HZ 100000 // I2C clock frequency
#define AHT20_ADDR 0x38 // I2C address of the AHT20 sensor
#define AHT20_CMD_TRIGGER 0xAC // Command to trigger measurement
#define AHT20_CMD_SOFTRESET 0xBA // Command to reset the sensor
#define AHT20_CMD_INIT 0xBE // Command to initialize the sensor

// Function to initialize I2C
void i2c_master_init() {
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = I2C_MASTER_SDA_IO,
.scl_io_num = I2C_MASTER_SCL_IO,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_MASTER_FREQ_HZ,
};
i2c_param_config(I2C_MASTER_NUM, &conf);
i2c_driver_install(I2C_MASTER_NUM, conf.mode, 0, 0, 0);
}

// Function to write data to the AHT20
esp_err_t aht20_write_command(uint8_t cmd) {
i2c_cmd_handle_t handle = i2c_cmd_link_create();
i2c_master_start(handle);
i2c_master_write_byte(handle, (AHT20_ADDR << 1) | I2C_MASTER_WRITE, true);
i2c_master_write_byte(handle, cmd, true);
i2c_master_stop(handle);
esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, handle, pdMS_TO_TICKS(1000));
i2c_cmd_link_delete(handle);
return ret;
}

// Function to read data from the AHT20
esp_err_t aht20_read_data(uint8_t *data, size_t length) {
i2c_cmd_handle_t handle = i2c_cmd_link_create();
i2c_master_start(handle);
i2c_master_write_byte(handle, (AHT20_ADDR << 1) | I2C_MASTER_READ, true);
i2c_master_read(handle, data, length, I2C_MASTER_LAST_NACK);
i2c_master_stop(handle);
esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, handle, pdMS_TO_TICKS(1000));
i2c_cmd_link_delete(handle);
return ret;
}

// Function to reset and initialize the AHT20
void aht20_init() {
aht20_write_command(AHT20_CMD_SOFTRESET);
vTaskDelay(pdMS_TO_TICKS(20)); // Wait after reset
aht20_write_command(AHT20_CMD_INIT);
vTaskDelay(pdMS_TO_TICKS(20)); // Wait for initialization
}

// Function to get temperature and humidity
void aht20_get_temp_humidity(float *temperature, float *humidity) {
uint8_t data[6];
aht20_write_command(AHT20_CMD_TRIGGER);
vTaskDelay(pdMS_TO_TICKS(80)); // Wait for the measurement

if (aht20_read_data(data, 6) == ESP_OK) {
uint32_t raw_humidity = ((data[1] << 16) | (data[2] << 8) | data[3]) >> 4;
uint32_t raw_temperature = ((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5];

*humidity = ((float)raw_humidity / 1048576.0) * 100.0;
*temperature = ((float)raw_temperature / 1048576.0) * 200.0 - 50.0;
} else {
*humidity = -1.0;
*temperature = -1.0;
}
}

// Main application
void app_main() {
float temperature = 0.0, humidity = 0.0;

i2c_master_init();
aht20_init();

while (1) {
aht20_get_temp_humidity(&temperature, &humidity);
printf("Temperature: %.2f °C, Humidity: %.2f %%
", temperature, humidity);
vTaskDelay(pdMS_TO_TICKS(2000));
}
}

The code initializes the I2C communication using i2c_master_init() and sets up the AHT20 sensor with aht20_init(). The aht20_write_command() function sends commands to the sensor for initialization and measurements, while aht20_read_data() reads the response, including raw temperature and humidity data. The aht20_get_temp_humidity() function processes the raw data to compute the actual temperature and humidity values. The main function app_main() initializes the sensor, enters a loop, and retrieves and displays the sensor data every 2 seconds using printf().

Update the I2C pins (I2C_MASTER_SDA_IO and I2C_MASTER_SCL_IO) to match your ESP32 hardware setup, Use idf.py build to compile the project, Use idf.py flash to upload the code to your ESP32.

ESPHome Image

ESP32 AHT20 ESPHome Code Example

Example in ESPHome (Home Assistant)

Fill in this configuration in your ESPHome YAML configuration file (example.yml) to integrate the AHT20 Temperature and Humidity Sensor

sensor:  
- platform: aht10
variant: AHT20
temperature:
name: "Living Room Temperature"
humidity:
name: "Living Room Humidity"
update_interval: 60s

This code snippet configures an AHT20 temperature and humidity sensor in an ESPHome YAML file. The sensor block defines the platform as aht10, specifying that the device is compatible with the AHT10/AHT20 series of sensors. The variant field explicitly declares the sensor model as AHT20.

Two sensors are set up: temperature and humidity. Each sensor has a unique name for identification in the ESPHome dashboard or Home Assistant, such as Living Room Temperature and Living Room Humidity. These names are used when displaying or logging the sensor readings.

The update_interval is set to 60s, which means the sensor will provide updated temperature and humidity readings every 60 seconds.

Upload this code to your ESP32 using the ESPHome dashboard or the esphome run command.

PlatformIO Image

ESP32 AHT20 PlatformIO Code Example

Example in PlatformIO Framework

For PlatformIO, make sure to configure the platformio.ini file with the appropriate environment and libraries, and then proceed with the code.

Configure platformio.ini

First, your platformio.ini should look like below. You might need to include some libraries as shown. Make sure to change the board to your ESP32:

[env:esp32]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps =
adafruit/Adafruit AHTX0 @ ^2.0.0
arduino-libraries/Wire

ESP32 AHT20 PlatformIO Example Code

Write this code in your PlatformIO project under the src/main.cpp file to use the AHT20 Temperature and Humidity Sensor:

#include <Wire.h>
#include "Adafruit_AHT10.h"

// Create an instance of the AHT20 sensor
Adafruit_AHT10 aht;

void setup() {
// Initialize Serial Monitor
Serial.begin(115200);
Serial.println("AHT20 Sensor Example");

// Initialize I2C communication and sensor
if (!aht.begin(Adafruit_AHT10::AHTX0_SENSOR)) { // Specify AHT20 variant
Serial.println("Failed to find AHT20 sensor! Check wiring.");
while (1); // Infinite loop if initialization fails
}
Serial.println("AHT20 sensor initialized.");
}

void loop() {
// Read temperature and humidity from the sensor
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp); // Populate the event objects

// Print temperature and humidity to Serial Monitor
Serial.print("Temperature: ");
Serial.print(temp.temperature);
Serial.println(" °C");

Serial.print("Humidity: ");
Serial.print(humidity.relative_humidity);
Serial.println(" %");

// Delay between readings
delay(2000);
}

The platformio.ini file configures the project for the ESP32 using the Arduino framework. The environment is set to [env:esp32], with platform = espressif32 for the ESP32 platform and board = esp32dev specifying a generic ESP32 development board. The framework is set to arduino, and the baud rate for the serial monitor is configured with monitor_speed = 115200.

Upload the code to your ESP32 using the PlatformIO "Upload" button in your IDE or the pio run --target upload command.

MicroPython Image

ESP32 AHT20 MicroPython Code Example

Example in Micro Python Framework

Fill in this script in your MicroPython main.py file (main.py) to integrate the AHT20 Temperature and Humidity Sensor with your ESP32.

import machine
import time
from ahtx0 import AHT20

# Initialize I2C
i2c = machine.I2C(0, scl=machine.Pin(22), sda=machine.Pin(21))

# Initialize AHT20 sensor
sensor = AHT20(i2c)

# Main loop
while True:
try:
# Read temperature and humidity
temperature = sensor.temperature
humidity = sensor.humidity

# Print readings
print("Temperature: {:.2f} °C".format(temperature))
print("Humidity: {:.2f} %".format(humidity))

# Wait for 2 seconds
time.sleep(2)
except Exception as e:
print("Error reading

The code initializes I2C communication using machine.I2C with GPIO22 for SCL and GPIO21 for SDA. The AHT20 sensor is initialized with the AHT20 class. In the main loop, the temperature and humidity are read using sensor.temperature and sensor.humidity, and the values are printed to the console using print(). A delay of 2 seconds is added between readings using time.sleep(2).

Upload this code to your ESP32 using a MicroPython-compatible IDE, such as Thonny, uPyCraft, or tools like ampy.

AHT20 Temperature and Humidity Sensor Troubleshooting

This guide outlines a systematic approach to troubleshoot and resolve common problems with the . Start by confirming that the hardware connections are correct, as wiring mistakes are the most frequent cause of issues. If you are sure the connections are correct, follow the below steps to debug common issues.

Sensor Initialization Failure on ESP32

Issue: When connecting the AHT20 sensor to an ESP32, the sensor fails to initialize, resulting in errors such as: AHT20 sensor initialization failed. error status : 2.

Possible causes include incorrect wiring, improper I2C configuration, or insufficient power supply.

Solution: Verify that the AHT20's SCL and SDA pins are correctly connected to the ESP32's I2C pins (commonly GPIO 21 for SDA and GPIO 22 for SCL). Ensure that the sensor is powered appropriately, either through the 3.3V or 5V pin, depending on the sensor's voltage requirements. Additionally, confirm that the I2C bus is properly initialized in the code with the correct pins and that no other devices on the bus share the same address. (forum.arduino.cc)

Communication Failure with ESPHome

Issue: When integrating the AHT20 sensor with ESPHome, the following error appears in the logs: [E][aht10:080]: Communication with AHT10 failed!, leading to the sensor not providing temperature and humidity data.

Possible causes include incorrect sensor variant specification or compatibility issues with the ESPHome version.

Solution: Ensure that the sensor variant is correctly specified in the ESPHome configuration. For the AHT20 sensor, the configuration should include variant: AHT20. Additionally, updating ESPHome to the latest version may resolve compatibility issues. If the problem persists, consider testing the sensor with a different microcontroller or using alternative libraries to rule out hardware-related issues. (github.com)

Temperature Readings Increasing Over Time

Issue: The AHT20 sensor reports temperature readings that gradually increase over time, deviating from actual ambient conditions.

Possible causes include self-heating effects due to the sensor's proximity to heat-generating components or insufficient ventilation.

Solution: Position the sensor away from heat sources such as microcontrollers, voltage regulators, or other components that may emit heat. Implement proper ventilation around the sensor to allow for accurate ambient temperature measurements. Using longer connecting wires can help distance the sensor from potential heat sources. Additionally, consider placing the sensor in a well-ventilated enclosure to minimize the impact of external heat. (community.home-assistant.io)

Device Address Detected but Read Failed on Raspberry Pi

Issue: On a Raspberry Pi, the I2C bus detects the AHT20 sensor's address, but attempts to read data result in errors such as: Error: Read failed.

Possible causes include incorrect I2C bus configuration, insufficient pull-up resistors, or conflicts with other I2C devices.

Solution: Verify that the I2C interface is enabled on the Raspberry Pi and that the correct I2C bus is being used. Ensure that appropriate pull-up resistors (typically 4.7kΩ) are present on the SDA and SCL lines. Check for address conflicts with other devices on the I2C bus and ensure that each device has a unique address. Additionally, inspect the wiring for secure connections and test the sensor with an I2C scanner to confirm its responsiveness. (forums.raspberrypi.com)

Conclusion

We went through technical specifications of AHT20 Temperature and Humidity Sensor, its pinout, connection with ESP32 and AHT20 Temperature and Humidity Sensor code examples with Arduino IDE, ESP-IDF, ESPHome and PlatformIO.