Проект: метеостанция с отправкой в облако

Объединяем датчик, экран и сеть в законченное устройство.

Метеостанция на ESP32 измеряет климат, показывает его на дисплее и отправляет данные в облако или Home Assistant для истории и графиков.

Из чего состоит проект

  • Датчик DHT22 — температура и влажность.
  • OLED по I2C — локальный показ.
  • Wi-Fi + MQTT — отправка в облако.
  • Логика — усреднение, проверка, интервал.

Усреднение показаний

АЦП и датчики «шумят». Усреднение нескольких чтений даёт стабильное значение. Это чистый stdlib — пример исполним:

import statistics

def stable_value(samples):
    # отбрасываем явные выбросы и усредняем
    good = [x for x in samples if -40 <= x <= 80]
    return round(statistics.mean(good), 1)

readings = [23.4, 23.6, 250.0, 23.5, 23.3]   # один выброс
print("Сырые:", readings)
print("Стабильная температура:", stable_value(readings), "°C")

Вывод:

Сырые: [23.4, 23.6, 250.0, 23.5, 23.3]
Стабильная температура: 23.4 °C

Главный цикл устройства

from machine import Pin, I2C
from umqtt.simple import MQTTClient
import dht, ssd1306, ujson, time

sensor = dht.DHT22(Pin(4))
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
client = MQTTClient("esp32-meteo", "192.168.1.50")
client.connect()

while True:
    try:
        sensor.measure()
        t, h = sensor.temperature(), sensor.humidity()
        # показываем
        oled.fill(0)
        oled.text("Meteo", 0, 0)
        oled.text("t={} C".format(t), 0, 20)
        oled.text("h={} %".format(h), 0, 35)
        oled.show()
        # отправляем
        payload = ujson.dumps({"t": t, "h": h})
        client.publish(b"home/balcony/meteo", payload.encode())
    except OSError:
        oled.fill(0)
        oled.text("Sensor error", 0, 0)
        oled.show()
    time.sleep(60)

Как работает под капотом

Каждую минуту устройство читает датчик, рисует значения в буфер OLED и выталкивает их на экран через show(), затем упаковывает данные в JSON и публикует в MQTT-топик. Облачный сервис или Home Assistant, подписанный на этот топик, сохраняет точки во времени и строит графики. Локальный экран работает даже при пропаже сети — пользователь всегда видит текущие значения, а история копится в облаке.

Частые ошибки

  • Слать сырые показания. Без усреднения графики «дёргаются» — усредняйте 3–5 чтений.
  • Падать при сбое датчика. Оборачивайте чтение в try/except и показывайте ошибку, а не зависайте.
  • Слишком частая отправка. Раз в минуту достаточно; чаще — лишний трафик и нагрев датчика.

Итог

  • Метеостанция = датчик + дисплей + сеть.
  • Показания усредняют и фильтруют от выбросов.
  • Локальный экран не зависит от сети, история копится в облаке.
  • Сбои датчика обрабатывают, отправляют данные раз в минуту.
Проверьте себя
1. Зачем усреднять показания датчика перед отправкой?
AЧтобы ускорить Wi-Fi
BДатчики шумят, и усреднение даёт стабильное значение без скачков
CЧтобы экономить память
DУсреднять не нужно
2. Почему локальный OLED-дисплей полезен в метеостанции?
AОн ускоряет MQTT
BОн показывает текущие значения даже при пропаже сети
CБез него датчик не работает
DОн заменяет Wi-Fi
3. Как обрабатывают сбой чтения датчика в рабочем устройстве?
AИгнорируют и надеются
BОборачивают чтение в try/except и показывают ошибку, не зависая
CПерезагружают роутер
DОтключают дисплей навсегда