SHT21 / HTU21 / GY-21 / SI7021 Temperature and Humidity Sensor

View on Amazon
Overview
About SHT21 / HTU21 / GY-21 / SI7021 Temperature and Humidity Sensor
The SHT21, HTU21, GY-21, and SI7021 are compact digital temperature and humidity sensors that provide high-precision measurements. Using the I²C communication protocol, they are ideal for HVAC systems, data loggers, weather stations, and consumer electronics.
⚡ Key Features
- High Accuracy & Stability – Reliable temperature and humidity sensing.
- I²C Communication – Easy integration with ESP32, Arduino, and other microcontrollers.
- Compact & Energy-Efficient – Ideal for low-power and battery-powered applications.
- Versatile Applications – Used in climate control, weather monitoring, and industrial automation.
🔗 Looking for alternatives in the SHT series? Check out:
Get Your SHT21 / HTU21 / GY-21 / SI7021
Prices are subject to change. We earn from qualifying purchases as an Amazon Associate.
SHT21 / HTU21 / GY-21 / SI7021 Specifications
Complete technical specification details for SHT21 / HTU21 / GY-21 / SI7021 Temperature and Humidity Sensor
📊 Technical Parameters
SHT21 / HTU21 / GY-21 / SI7021 Pinout
The SHT21/HTU21/GY-21/SI7021 sensors use standard I²C communication with 4 pins.
Visual Pinout Diagram

Pin Types
Quick Tips
Standard I²C interface for easy integration,📡 Default I²C address is 0x40
Multiple sensor names (SHT21/HTU21/GY-21/SI7021) - same chip,⚡ Pull-up resistors (10kΩ) recommended on SDA/SCL
High accuracy: ±0.3°C temperature, ±3% humidity
Pin Descriptions
| Pin Name | Type | Description | Notes |
|---|---|---|---|
1 VCC | Power | Power supply input (2.1V to 3.6V) | Low voltage operation for battery applications |
2 GND | Power | Ground connection | Connect to ESP32 ground |
3 SDA | Communication | I²C data line | Bidirectional data communication |
4 SCL | Communication | I²C clock line | Clock signal from master device |
Wiring SHT21 / HTU21 / GY-21 / SI7021 to ESP32
Connect the SHT21/HTU21/GY-21/SI7021 using standard I²C interface.
Visual Wiring Diagram

Connection Status
Protocol
Pin Connections
| SHT21 / HTU21 / GY-21 / SI7021 Pin | Connection | ESP32 Pin | Description |
|---|---|---|---|
1 VCC Required | 3.3V | Power supply (2.1V to 3.6V) | |
2 GND Required | GND | Ground connection | |
3 SDA Required | GPIO21 | I²C data line (default SDA) | |
4 SCL Required | GPIO22 | I²C clock line (default SCL) |
GPIO21/22 are default I²C pins on ESP32
I²C address is 0x40 (standard for this sensor)
Add 10kΩ pull-up resistors on SDA/SCL if needed
Compatible with SHT20 libraries and code
SHT21 / HTU21 / GY-21 / SI7021 Troubleshooting
Common issues and solutions to help you get your sensor working
Common Issues
Issue: When compiling code that interfaces with the SHT21 sensor using the LibHumidity library, errors such as 'class TwoWire' has no member named 'send' and 'class TwoWire' has no member named 'receive' are encountered.
Possible causes include the use of outdated functions in the library that are incompatible with the current Wire library, which now uses write() and read() methods instead of send() and receive().
Solution: Update the LibHumidity library by replacing instances of send() with write() and receive() with read(). Alternatively, consider using a more recent library that supports the SHT21 sensor and is compatible with the current Wire library implementation.
Issue: When running a Python script to read data from the SHT21 sensor on a Raspberry Pi, the error [Errno 13] Permission denied: '/dev/i2c-1' is encountered.
Possible causes include insufficient permissions to access the I2C bus device file.
Solution: Execute the Python script with elevated privileges by prefixing the command with sudo. For example, run sudo python sht21.py to grant the necessary permissions to access the I2C bus.
Issue: The SHT21 sensor returns incorrect temperature and humidity values, such as 988 instead of the expected readings.
Possible causes include improper wiring, incorrect I2C address configuration, or sensor initialization issues.
Solution: Verify that the sensor is correctly wired to the microcontroller, ensuring proper connections for power, ground, and I2C data lines. Confirm that the correct I2C address (typically 0x40) is specified in your code. Ensure that the sensor is properly initialized in the software, and consider using a reliable library compatible with the SHT21 sensor.
Issue: Difficulty in establishing I2C communication with the SHT21 sensor, leading to unsuccessful data retrieval.
Possible causes include incorrect I2C initialization, improper sensor configuration, or timing issues in the communication protocol.
Solution: Ensure that the I2C bus is correctly initialized with the appropriate settings, including clock speed and addressing. Review the sensor's datasheet to confirm proper configuration and command sequences. Implement necessary delays as specified in the sensor's communication protocol to accommodate timing requirements.
Debugging Tips
Use the Serial Monitor to check for error messages and verify the sensor's output. Add debug prints in your code to track the sensor's state.
Use a multimeter to verify voltage levels and check for continuity in your connections. Ensure the power supply is stable and within the sensor's requirements.
Additional Resources
SHT21 / HTU21 / GY-21 / SI7021 Programming Examples
Ready-to-use code examples for different platforms and frameworks
#include <Wire.h>
#include "SHT21.h"
SHT21 sht;
void setup() {
Wire.begin();
Serial.begin(9600);
}
void loop() {
float temperature = sht.getTemperature();
float humidity = sht.getHumidity();
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
delay(2000);
}#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/i2c.h"
#define I2C_MASTER_SCL_IO 22 /*!< GPIO number used for I2C master clock */
#define I2C_MASTER_SDA_IO 21 /*!< GPIO number used for I2C master data */
#define I2C_MASTER_NUM I2C_NUM_0 /*!< I2C master I2C port number */
#define I2C_MASTER_FREQ_HZ 100000 /*!< I2C master clock frequency */
#define SHT21_SENSOR_ADDR 0x40 /*!< I2C address */
void read_sensor() {
uint8_t data[3];
uint8_t cmd = 0xF5; // Humidity command
i2c_master_write_to_device(I2C_MASTER_NUM, SHT21_SENSOR_ADDR, &cmd, 1, pdMS_TO_TICKS(1000));
vTaskDelay(pdMS_TO_TICKS(50));
i2c_master_read_from_device(I2C_MASTER_NUM, SHT21_SENSOR_ADDR, data, 3, pdMS_TO_TICKS(1000));
uint16_t raw_humidity = (data[0] << 8) | (data[1] & 0xFC);
float humidity = -6.0 + 125.0 * (raw_humidity / 65536.0);
cmd = 0xF3; // Temperature command
i2c_master_write_to_device(I2C_MASTER_NUM, SHT21_SENSOR_ADDR, &cmd, 1, pdMS_TO_TICKS(1000));
vTaskDelay(pdMS_TO_TICKS(50));
i2c_master_read_from_device(I2C_MASTER_NUM, SHT21_SENSOR_ADDR, data, 3, pdMS_TO_TICKS(1000));
uint16_t raw_temperature = (data[0] << 8) | (data[1] & 0xFC);
float temperature = -46.85 + 175.72 * (raw_temperature / 65536.0);
printf("Temperature: %.2f °C\n", temperature);
printf("Humidity: %.2f %%\n", humidity);
}
void app_main() {
// Initialize I2C
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);
while (1) {
read_sensor();
vTaskDelay(pdMS_TO_TICKS(2000));
}
}sensor:
- platform: sht3x
address: 0x40
temperature:
name: "Room Temperature"
humidity:
name: "Room Humidity"
update_interval: 60splatformio.ini
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps =
DFRobot/SHT21 @ ^1.0.0
monitor_speed = 115200main.cpp
#include <Wire.h>
#include "SHT21.h"
SHT21 sht;
void setup() {
Wire.begin();
Serial.begin(115200);
Serial.println("SHT21 Sensor Example");
}
void loop() {
float temperature = sht.getTemperature();
float humidity = sht.getHumidity();
if (!isnan(temperature) && !isnan(humidity)) {
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
} else {
Serial.println("Failed to read from sensor");
}
delay(2000);
}from machine import Pin, I2C
from time import sleep
SENSOR_ADDR = 0x40
CMD_TEMP = 0xF3
CMD_HUM = 0xF5
def read_sensor(i2c, cmd):
i2c.writeto(SENSOR_ADDR, bytearray([cmd]))
sleep(0.05)
data = i2c.readfrom(SENSOR_ADDR, 3)
return (data[0] << 8 | data[1]) & 0xFFFC
def calc_temperature(raw_temp):
return -46.85 + 175.72 * (raw_temp / 65536.0)
def calc_humidity(raw_hum):
return -6.0 + 125.0 * (raw_hum / 65536.0)
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
while True:
raw_temp = read_sensor(i2c, CMD_TEMP)
raw_hum = read_sensor(i2c, CMD_HUM)
temperature = calc_temperature(raw_temp)
humidity = calc_humidity(raw_hum)
print("Temperature: {:.2f} °C".format(temperature))
print("Humidity: {:.2f} %".format(humidity))
sleep(2)Wrapping Up SHT21 / HTU21 / GY-21 / SI7021
The ESP32 SHT21 / HTU21 / GY-21 / SI7021 Temperature and Humidity Sensor is a powerful environment sensor that offers excellent performance and reliability. With support for multiple development platforms including Arduino, ESP-IDF, ESPHome, PlatformIO, and MicroPython, it's a versatile choice for your IoT projects.
Best Practices
For optimal performance, ensure proper wiring and follow the recommended configuration for your chosen development platform.
Safety First
Always verify power supply requirements and pin connections before powering up your project to avoid potential damage.
Ready to Start Building?
Now that you have all the information you need, it's time to integrate the SHT21 / HTU21 / GY-21 / SI7021 into your ESP32 project and bring your ideas to life!








