Датчик DHT: температура и влажность
Подключаем первый «умный» датчик — измеритель климата для метеостанции.
DHT11/DHT22 — недорогие датчики, измеряющие температуру и влажность воздуха и отдающие данные по одному цифровому проводу.
DHT11 против DHT22
| Параметр | DHT11 | DHT22 |
| Температура | 0…50 °C, ±2° | −40…80 °C, ±0.5° |
| Влажность | 20–90%, ±5% | 0–100%, ±2% |
| Опрос | раз в 1 с | раз в 2 с |
DHT22 точнее и шире по диапазону, но дороже. Для дома обоих хватает.
Код чтения
В прошивке MicroPython уже есть модуль dht, поэтому код короткий:
from machine import Pin
import dht
import time
sensor = dht.DHT22(Pin(4))
while True:
try:
sensor.measure()
t = sensor.temperature()
h = sensor.humidity()
print("Температура:", t, "°C Влажность:", h, "%")
except OSError:
print("Ошибка чтения датчика")
time.sleep(2)Проверка показаний
Датчик иногда выдаёт сбойные значения. Логику фильтрации правдоподобности можно проверить на обычном Python:
def is_valid(temp, hum):
return -40 <= temp <= 80 and 0 <= hum <= 100
readings = [(23.5, 45), (250.0, 45), (22.0, 110), (24.1, 50)]
for t, h in readings:
status = "ОК" if is_valid(t, h) else "ОТБРОСИТЬ"
print(f"t={t}°C h={h}% -> {status}")Вывод:
t=23.5°C h=45% -> ОК t=250.0°C h=45% -> ОТБРОСИТЬ t=22.0°C h=110% -> ОТБРОСИТЬ t=24.1°C h=50% -> ОК
Как работает под капотом
DHT общается по собственному однопроводному протоколу: ESP32 даёт стартовый импульс, затем датчик отвечает серией импульсов разной длины, кодирующих 40 бит (влажность, температура, контрольная сумма). Модуль dht сам разбирает этот тайминг и проверяет контрольную сумму. Если сумма не сошлась (помехи, слишком частый опрос), measure() бросает OSError — поэтому чтение оборачивают в try/except.
Частые ошибки
- Опрашивать слишком часто. DHT22 — не чаще раза в 2 с; иначе ошибки чтения.
- Не ловить
OSError. Случайный сбой уронит всю программу. - Забыть подтягивающий резистор. Линии данных нужен pull-up 10 кОм (у многих модулей он уже впаян).
Итог
- DHT11/DHT22 измеряют температуру и влажность по одному проводу.
- Модуль
dhtуже встроен в MicroPython. - Чтение оборачивают в
try/except OSError— сбои нормальны. - Соблюдайте интервал опроса (DHT22 — раз в 2 с) и фильтруйте неправдоподобные значения.