Гараж, ноябрь, обогреватель на киловатт через релейный модуль, термостат на DHT22 с порогом ровно 20,0 °C. Вечером я сидел рядом и слушал: клац — четыре секунды тишины — клац. За вечер реле насчитало несколько сотен щелчков, а я за тот же вечер сделал три бессмысленные правки: ставил delay подлиннее, сдвигал порог на 19,9, даже перепаял датчик на новый. Ничего не помогло, потому что чинить нужно было не железо, а логику: у моего термостата не было гистерезиса.
Температура в гараже не стоит на отметке — она дышит вокруг неё. ТЭН остывает, воздух оседает на две десятых градуса ниже порога, сквозняк из щели под воротами возвращает его обратно. DHT22 честно докладывает каждое колебание, а термостат с одним порогом на каждое колебание отвечает новым решением: включить, выключить, включить. Реле при этом механическое — пружина, якорь, контакты, и каждый щелчок это износ: в паспорте модуля значится порядка ста тысяч переключений под нагрузкой. При щелчке раз в четыре секунды этот запас выгорает меньше чем за шесть суток — 86400 секунд в сутках делим на четыре.
Гистерезис — не деталь и не библиотека, а правило автоматики: включать и выключать на разных величинах. Ниже 21,0 реле включается, выше 23,0 выключается, а в коридоре между ними прибор держит последнее решение и молчит. В этом уроке посмотрим, что именно изнашивается при частых щелчках, как выбирать ширину коридора под шум конкретного датчика и как за десять строк скетча построить счётчик щелчков, который покажет проблему раньше, чем вы её услышите. Базовый термостат у нас уже был — урок про термостат с гистерезисом собрал комнатную версию, а про коммутацию 220 вольт своими руками напоминает урок про релейный модуль.
Что именно щёлкает и почему ему больно
Релейный модуль — это не кнопка, а катушка и подвижный якорь. На катушку подают 5 вольт, она тянет около 70 миллиампер — для пина Arduino это много, поэтому на плате модуля стоит транзистор с оптопарой, а пину остаётся вежливый управляющий сигнал. Якорь перебрасывает контакт с тем самым щелчком пружины из начала урока. Внутри модуля живёт целый механизм, и у него две слабости: механика изнашивается, а контакт подгорает.
Подгорает он из-за искры. Каждый раз, когда контакт размыкает нагрузку 220 вольт, между расходящимися поверхностями проскакивает микродуга и выжигает микронный слой металла. Десять щелчков в минуту превращают это в постоянную эрозию: контакт покрывается нагаром, растёт сопротивление, реле греется на нагрузке, которая раньше шла холодным. Мой подгоревший модуль из той зимы до сих пор лежит в ящике как памятник: щёлкает, а обогреватель не включается.
Отсюда и логика лечения. Убрать искру совсем не выйдет — разве что поставить твердотельное реле, о нём подробно в следующем инкубаторном уроке, — зато можно убрать лишние переключения. Гистерезис — способ сказать прибору: между 21 и 23 градусами любое решение правильно, просто не меняй его каждые четыре секунды.
| Симптом | Причина | Лечение |
|---|---|---|
| Реле щёлкает каждые 2–4 секунды у порога | нет гистерезиса: показания дышат через один порог | коридор включения и выключения |
| Щелчки раз в минуту, реле и датчик рядом | катушка реле греет воздух вокруг сенсора | отодвинуть датчик от модуля, пересмотреть коридор |
| Щёлкает, а нагрузка не включается | контакты подгорели от частой коммутации | новый модуль и гистерезис, пока этот не дожил |
| Реле срабатывает само при старте скетча | пин до pinMode висит в воздухе | задать начальное состояние сразу после pinMode |
Коридор вместо порога: как выбрать ширину
Правило, к которому я пришёл после того гаража: коридор должен быть хотя бы вдвое шире, чем гуляют показания датчика между соседними опросами. У DHT22 паспортная погрешность ±0,5 °C, но между двумя опросами через две секунды показания прыгают обычно на 0,1–0,3 °C — межопросный шум меньше паспортной погрешности, и считать их одним числом ошибка. Коридор в 2 °C перекрывает такой шум с десятикратным запасом: реле переключается только когда температура реально ушла за границу, а не задела её краем.
Вторая поправка — инерция нагрузки. Обогреватель выключается, а ТЭН ещё минуту отдаёт тепло: воздух у датчика доплывает ещё на градус-полтора после щелчка. Узкий коридор заставит реле щёлкнуть обратно раньше, чем нагрев кончит дышать. Поэтому для инертных нагрузок — обогреватели, тёплые полы — я беру коридор 2 °C, а для быстрых, вроде лампочки в коробе, хватает 0,4–0,5. Если сомневаетесь, начните с широкого: узкий коридор всегда успеете сузить, а подгоревшие контакты не восстановишь.
Проверить выбор глазами проще всего на графике: в уроке про Serial Plotter показания рисуются кривой, и на ней сразу видно, как далеко гуляет температура за опрос. А если реле начало щёлкать само по себе, без порога рядом, — это чаще всего питание или обрыв линии, разбор таких случаев живёт в уроке про диагностику nan.
#include "DHT.h" #define DHTPIN 2#define DHTTYPE DHT22#define RELAY 7 #define T_ON 21.0 // ниже — включаем обогреватель#define T_OFF 23.0 // выше — выключаем DHT dht(DHTPIN, DHTTYPE); int heat = 0; // последнее решение: 1 — реле включено void setup() { Serial.begin(9600); pinMode(RELAY, OUTPUT); digitalWrite(RELAY, LOW); dht.begin();} void loop() { float t = dht.readTemperature(); if (t < T_ON) { heat = 1; } else if (t > T_OFF) { heat = 0; } // между T_ON и T_OFF решение не меняется — это и есть гистерезис digitalWrite(RELAY, heat == 1 ? HIGH : LOW); Serial.print("t="); Serial.println(t); Serial.print("rel="); Serial.println(heat); delay(2000);}В скетче гистерезис — это переменная состояния и два сравнения вместо одного. heat хранит последнее решение: единица — реле включено, ноль — выключено. Пока температура живёт внутри коридора, ни одно сравнение не срабатывает, и heat остаётся как была — прибор помнит, что делал, даже когда показания болтаются туда-сюда. digitalWrite сразу после pinMode ставит реле в известное состояние, иначе до первого решения якорь висит как придётся.
Обратите внимание на else if: включение и выключение проверяются не парой независимых if, а взаимоисключающей веткой. Пока границы стоят далеко друг от друга, это одно и то же, — но как только вы сузите коридор до шага шума, порядок проверок и их исключительность перестанут быть мелочью. else if делает решение обязательным по построению: ровно одна из трёх судеб на каждый опрос. Печать парами t= и rel= — та же, что во всех приборах раздела: такие строки без правок читает и человек, и Serial Plotter.
Счётчик щелчков: гистерезис, который видно
Звук — плохой измерительный прибор, поэтому щелчки я считаю программно: каждая смена состояния реле — событие, которое дешевле посчитать, чем услышать. В симуляторе ниже счётчика два: clicks= — сколько раз переключилось реле с гистерезисом, и would= — сколько раз переключался бы термостат с одним порогом в середине того же коридора. Разница между этими числами и есть цена вопроса.
В реальном проекте достаточно одного счётчика: добавьте clicks= в печать любого релейного скетча, подержите сутки и посмотрите итог. Пара щелчков в час — прибор дышит нормально. Сотни в сутки — коридор узкий для вашего шума или датчик стоит неудачно, и это видно по числам раньше, чем почувствуют контакты.
Частота опроса здесь второй участник арифметики: чем чаще вы читаете датчик, тем больше у каждого колебания шансов доехать до реле. Почему DHT22 не опрашивают чаще, чем раз в две секунды, и что происходит при нарушении интервала — отдельный урок про интервал опроса.
- Сузьте коридор до 21,8–22,2 и подержите ползунок на 22,0 минуту при ускорении ×10. Сравните clicks= и would=: коридор сжался до размеров шума и перестал защищать — это та самая граница применимости гистерезиса.
- Переверните логику на охлаждение: реле включает вентилятор выше 26,0 и выключает ниже 24,0. Меняются только константы и знаки сравнений — счётчик щелчков остаётся честным судьёй.
- Добавьте печать seconds= — сколько секунд реле уже в текущем состоянии: millis() минус метка последнего переключения. Длинные интервалы между щелчками — признак того, что коридор наконец шире шума.
- 1. Почему реле с одним порогом щёлкает каждые несколько секунд, хотя в гараже ничего не изменилось?
- 2. Какой минимальной ширины делать коридор гистерезиса?
- 3. Что происходит с контактами реле при каждом размыкании нагрузки 220 В?
- 4. Счётчик щелчков за сутки показал 400 при коридоре 2 °C. Первое подозрение?
- 5. Пока температура живёт внутри коридора, термостат...
- Гистерезис — разные величины для включения и выключения: ниже 21,0 реле включается, выше 23,0 выключается, в коридоре держится последнее решение.
- Ширина коридора — минимум двойной межопросный шум датчика; мой старт: 2 °C для обогревателя, 0,5 для лампы.
- Каждый щелчок под нагрузкой — микродуга и износ контактов; счётчик щелчков в Serial покажет проблему раньше, чем вы её услышите.
- Датчик рядом с реле врёт: катушка греет воздух на градус, и от этого щёлкает любой коридор.
- Пары t= и rel= в печати читает и человек, и Serial Plotter — график шума подбирает коридор за минуту.
Коридор включения и выключения — самая переиспользуемая конструкция бытовой автоматики: те же две константы и одна переменная состояния работают в инкубаторе, где цена каждой секунды перегрева выше, — об этом следующий урок про инкубатор. Если же ваша нагрузка в первый раз требует 220 вольт, начните с урока про релейный модуль: там разводка силовой части и предохранители на стороне железа.
И про мой гараж напоследок: коридор 21,0–23,0 пережил вторую зиму. Реле щёлкает от силы двадцать раз в сутки, обогреватель держит полградуса от середины коридора, и звук этот стал настолько редким, что я успел забыть, как выглядел тот ноябрьский стробоскоп.
Частые вопросы по теме урока
- Почему реле с одним порогом щёлкает каждые несколько секунд, хотя в гараже ничего не изменилось?
- Показания гуляют на 0,1–0,3 °C между опросами, порог один — и каждое пересечение это щелчок. Гистерезис разносит включение и выключение по разным величинам, и в коридоре прибор молчит. Температура дышит вокруг порога, и каждое колебание датчика становится новым решением
- Какой минимальной ширины делать коридор гистерезиса?
- Коридор уже двойного межопросного шума будет щёлкать сам. Мои стартовые значения: 2 °C для инертного обогревателя, 0,4–0,5 для быстрой лампы — и оба с запасом к шуму DHT22. Хотя бы вдвое шире, чем гуляют показания между соседними опросами
- Что происходит с контактами реле при каждом размыкании нагрузки 220 В?
- Искра при размыкании — главный износ механического реле. Сотни лишних щелчков в сутки сжигают стотысячный ресурс за дни, а нагар на контактах потом мешает включать нагрузку. Проскакивает микродуга и выжигает микронный слой металла
- Счётчик щелчков за сутки показал 400 при коридоре 2 °C. Первое подозрение?
- Сотни щелчков в сутки при широком коридоре — признак систематической ошибки: самонагрев от катушки, поток от нагрузки, сквозняк через датчик. Шум такое не даёт — шум лечится именно коридором. Датчик стоит рядом с реле и греется от катушки — либо нагрузка инертнее, чем казалась, и коридор пора расширять
- Пока температура живёт внутри коридора, термостат...
- Память о последнем решении — суть гистерезиса. Именно поэтому реле в коридоре молчит, хотя показания дрожат: решение уже принято, и новые данные его не трогают. Держит последнее решение и ничего не переключает