Проект · Климат · Автоматизация
Термостат, который и греет, и охлаждает
Большинство DIY-термостатов заканчиваются на «обогреватель вкл/выкл». Комнате, в которой реально комфортно, нужна и вторая половина: вентилятор охлаждения, включающийся сам при перелёте температуры, и алерт перегрева на день, когда реле обогревателя залипнет. Один DHT22, два реле и ESP32 делают всё три — с уставкой, графиком истории и журналом на дашборде, который чип отдаёт сам.
Почему гистерезис, а не простой порог
Переключайте обогреватель ровно на уставке — и он затрещит вкл/выкл каждые несколько секунд вокруг границы; реле такое ненавидят. Полоса гистерезиса (греть ниже −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. Полная версия комнаты — с движением и газом — это монитор комнаты.
Настройте полосы гистерезиса на фейковой комнате сегодня — реле подключите потом.