Подключение датчика HTU21D к ESP32
Цифровой датчик температуры и влажности (I2C)
HTU21D к ESP32 — четыре провода: питание 3,3 В, земля, SDA на GPIO21 и SCL на GPIO22 (выводы I2C по умолчанию). Датчик работает от 3,3 В, поэтому делители не нужны.
Схема подключения датчика HTU21D к ESP32
| HTU21D | ESP32 |
|---|---|
| SCL | GPIO22 |
| SDA | GPIO21 |
| VCC | 3V3 |
| GND | GND |
Схема из примера «HTU21D: температура и влажность по I2C без библиотеки».
Выводы HTU21D
| Вывод | Назначение |
|---|---|
| SCL | тактовый сигнал I2C |
| SDA | данные I2C |
| VCC | питание модуля |
| GND | общий провод |
Код для ESP32
#include <Wire.h>
// HTU21D (модуль GY-21) на I2C. Библиотека не нужна: у датчика всего
// несколько команд, и вся работа видна в скетче.
//
// Алгоритм один на оба измерения:
// 1. послать команду «измерь» (0xF3 — температура, 0xF5 — влажность);
// 2. подождать: измерение занимает до 50 мс, и раньше времени датчик
// не отвечает;
// 3. прочитать три байта: старший, младший и контрольную сумму CRC-8;
// 4. сверить сумму и пересчитать число по формуле из даташита.
const uint8_t HTU21D = 0x40;
const uint8_t CMD_TEMPERATURE = 0xF3;
const uint8_t CMD_HUMIDITY = 0xF5;
uint8_t crc8(uint8_t msb, uint8_t lsb) {
// Многочлен датчика x^8 + x^5 + x^4 + 1 (0x131), начальное значение 0.
uint16_t crc = 0;
uint8_t data[2] = {msb, lsb};
for (int i = 0; i < 2; i++) {
crc ^= data[i];
for (int bit = 0; bit < 8; bit++) {
crc = (crc & 0x80) ? ((crc << 1) ^ 0x131) : (crc << 1);
}
}
return crc & 0xFF;
}
// Возвращает false, если датчик не ответил или сумма не сошлась.
bool measure(uint8_t command, uint16_t &raw) {
Wire.beginTransmission(HTU21D);
Wire.write(command);
if (Wire.endTransmission() != 0) return false;
delay(60);
if (Wire.requestFrom((int)HTU21D, 3) != 3) return false;
uint8_t msb = Wire.read();
uint8_t lsb = Wire.read();
uint8_t crc = Wire.read();
if (crc8(msb, lsb) != crc) return false;
// Два младших бита — служебные, перед пересчётом их обнуляют.
raw = ((uint16_t)msb << 8) | (lsb & 0xFC);
return true;
}
void setup() {
Serial.begin(115200);
Wire.begin(21, 22); // SDA, SCL
}
void loop() {
uint16_t rawT, rawH;
if (!measure(CMD_TEMPERATURE, rawT) || !measure(CMD_HUMIDITY, rawH)) {
Serial.println("датчик не ответил: проверьте SDA, SCL и питание");
delay(2000);
return;
}
float t = -46.85 + 175.72 * rawT / 65536.0;
float h = -6.0 + 125.0 * rawH / 65536.0;
h = constrain(h, 0.0, 100.0); // у границ формула может чуть выйти за 0..100
Serial.printf("%.2f °C %.1f %%\n", t, h);
delay(2000);
}
Скетч можно править и запускать в симуляторе без платы и установки среды.
Что учесть на ESP32
- Шину можно переназначить:
Wire.begin(sda, scl)принимает любые GPIO, кроме входных 34–39. - Подтяжки SDA и SCL на модуле уже есть; на голой микросхеме поставьте по 4,7 кОм к 3,3 В.
В железе
Сама микросхема HTU21D рассчитана на питание до 3,6 В. На готовых модулях типа GY-21 стоит стабилизатор и подтяжки шины, и их можно питать от 5 В, а на «голой» микросхеме — нельзя. Адрес один и менять его нельзя, поэтому два таких датчика на одной шине не работают без мультиплексора.
Частые ошибки при подключении к ESP32
- Шина вынесена на GPIO34–39: эти выводы только входные, датчик не получит команду.
- Подтяжка шины к 5 В вместо 3,3 В: ESP32 такой уровень не выдерживает.
- Чтение сразу после команды измерения: датчик занят и не отвечает (NACK). Подождите хотя бы 50 мс.
- Контрольная сумма не проверяется: помеха на шине превращается в «температуру» в сотни градусов.
- Два служебных бита результата не обнулены: ошибка на сотые доли, но в формулу они не входят.
- Два датчика с адресом 0x40 на одной шине: ответ получится смешанным. Нужен второй канал I2C или мультиплексор.
Ещё по теме
Другие детали для ESP32
HC-SR04DHT22 (AM2302)BME280DS3231SSD1306 OLED 0,96″LCD 1602 с I2CMAX7219TM1637MPU6050 (GY-521)Модуль релеWS2812B (NeoPixel)KY-040Клавиатура 4×4HX711ФоторезисторМодуль microSDRGB-светодиодСервопривод SG9074HC595ИК-приёмник (VS1838B)TFT ST7735 1,8″Шаговый двигательКнопкаПотенциометрПьезопищалкаСветодиодDS18B20Ползунковый переключательHC-SR501TTP223Датчик влажности почвыMQ-2LM35Джойстик KY-023DHT11SN65HVD230