Датчик DHT: температура и влажность

Подключаем первый «умный» датчик — измеритель климата для метеостанции.

DHT11/DHT22 — недорогие датчики, измеряющие температуру и влажность воздуха и отдающие данные по одному цифровому проводу.

DHT11 против DHT22

ПараметрDHT11DHT22
Температура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 с) и фильтруйте неправдоподобные значения.
Проверьте себя
1. Чем DHT22 лучше DHT11?
AОн дешевле
BШире диапазон и выше точность температуры и влажности
CОн не требует кода
DОн работает без питания
2. Зачем чтение DHT оборачивают в try/except OSError?
AДля красоты кода
BДатчик иногда выдаёт сбой контрольной суммы, и без обработки программа упадёт
CЧтобы ускорить опрос
DЭто требование Wi-Fi
3. Как часто можно опрашивать DHT22?
A1000 раз в секунду
BНе чаще одного раза в 2 секунды
CТолько раз в час
DВ любой момент без ограничений