RisalDash RisalDash

Проект · Климат · Автоматизация

Термостат, который и греет, и охлаждает

Большинство DIY-термостатов заканчиваются на «обогреватель вкл/выкл». Комнате, в которой реально комфортно, нужна и вторая половина: вентилятор охлаждения, включающийся сам при перелёте температуры, и алерт перегрева на день, когда реле обогревателя залипнет. Один DHT22, два реле и ESP32 делают всё три — с уставкой, графиком истории и журналом на дашборде, который чип отдаёт сам.

ПроектКлиматDHT22РелеESP32
Проект умного термостата на ESP32: DHT22, гистерезис, авто-вентилятор и алерты перегрева

Почему гистерезис, а не простой порог

Переключайте обогреватель ровно на уставке — и он затрещит вкл/выкл каждые несколько секунд вокруг границы; реле такое ненавидят. Полоса гистерезиса (греть ниже −0.3 °C, остановить выше +0.3 °C) делает каждый цикл длинным и спокойным. Авто-охлаждение — вторая, более широкая полоса с другой стороны: вентилятор при +1.5 °C сверх уставки, выключение по восстановлению. Алерт перегрева сидит ещё дальше и срабатывает даже в режиме Hold — залипшему реле нет дела до вашей автоматики:

if (!hold) {
  // Heating hysteresis: heat below setpoint-0.3, stop above setpoint+0.3.
  if (roomT < setpoint - 0.3f) heating = true;
  else if (roomT > setpoint + 0.3f) heating = false;
  // Auto-cooling: fan on when the room runs 1.5 C past the setpoint, off on recovery.
  if (roomT > setpoint + 1.5f) { if (!fan && evlog) evlog->print("Overshoot - fan ON"); fan = true; }
  else if (roomT < setpoint + 0.5f) fan = false;
}
// Overheat alert regardless of hold: something is wrong (sun on the sensor, heater stuck).
bool hot = roomT > setpoint + 4.0f;
if (hot && !overheat && evlog) evlog->print("OVERHEAT - check the heater");
overheat = hot;

Дашборд

Живая уставка (number-виджет), оба состояния реле, алерт-LED и график тренда — вся панель управления в дюжине объявлений:

dash.layout("Climate", RICON_THERMOMETER);
dash.gauge("Room temp", &roomT, 0, 40, "C");
dash.gauge("Humidity", &roomH, 0, 100, "%").variant("semi");
dash.chart("Trend", &roomT, "C");            // the history everyone wants

dash.layout("Control", RICON_POWER);
dash.number("Setpoint", &setpoint, 5, 35, 1);
dash.led("Heating", &heating);               // relay 1
dash.led("Cooling fan", &fan);               // relay 2 — auto-cooling
dash.led("Overheat!", &overheat);            // buzzer + red LED
dash.toggle("Hold", &hold);
dash.beginAP("RisalDash-Thermostat", "12345678");

Пример из библиотеки (examples/04_Templates/Thermostat) работает на фейковой комнате день/ночь из RisalFakeEnv — обе стороны гистерезиса срабатывают у вас на глазах: утром греет, днём перелетает и раскручивается вентилятор. Замените одну строку на реальный dht.readTemperature() и подключите два реле, когда полосы устроят.

Доводим до продукта

Сохраните уставку в NVS, чтобы переживала ребут; добавьте MQTT + Home Assistant discovery — термостат появится как climate-сущность; или пусть ИИ-агент читает комнату и двигает уставку через MCP. Полная версия комнаты — с движением и газом — это монитор комнаты.

Настройте полосы гистерезиса на фейковой комнате сегодня — реле подключите потом.