В моём накопительном бойлере на 80 литров сидит ТЭН на 1,5 кВт и колесо родного термостата, у которого нет ни памяти, ни голоса: перегрел — выключил, остыл — включил, и всё молча. Пугают в водонагревателе две вещи. Первая: заводская термозащита срабатывает где-то на 90 °C — уже после того, как ТЭН в накипи поджарил локальный карман вокруг спирали. Вторая: по одному колесу не понять, греет ли он вообще, или вода в баке давно готова, а реле щёлкает вхолостую. Отдельный капиллярный термостат при этом остаётся в цепи как последняя линия обороны — его никто не отменяет.
Поэтому я поставил на бак два DS18B20 и забрал контроль в скетч. Зонды садятся на одну шину 1-Wire по адресам — адресоскан и порядок их получения разобраны в уроке про несколько DS18B20 на шине, электрика и подтяжка — в уроке про подключение. Нижний зонд — у патрубка холодной воды, верхний — в верхней трети бака. Реле на D7 режет питание ТЭНа, зуммер на D8 орёт при отсечке 80 °C, светодиод горит, пока идёт нагрев.
Стратификация: что рассказывает разница
Горячая вода легче холодной, и бак греется сверху вниз: верхний слой уже 65, а у входа холодной воды — всё ещё 20. Эта расслоённость, стратификация, — рабочий инструмент, а не побочный эффект: разница между верхним и нижним зондами 10-20 °C значит, что нагрев в разгаре. Когда разница сжалась до 2-3 °C, бак перемешался и прогрет целиком — по верхнему порогу можно гасить ТЭН. Один датчик такой картины не даёт: он знает температуру своей точки и не отличает «греется» от «уже готов».
Разница — ещё и диагност. На восьмидесятилитровом баке с полуторакиловаттным ТЭНом верхний зонд уползает от нижнего на 5-10 °C за первые 20-30 минут — цифры с моей плиты, у вас ватты и литры свои, но порядок такой. Если ТЭН включён, а разница за полчаса не выросла — ищите накипь, залипшее реле или сгоревшую спираль, пока не кончился горячий душ. Признак бесплатный: для него не нужно ничего, кроме второй точки на той же шине.
| Ситуация | Показания | Что делает скетч |
|---|---|---|
| нагрев в разгаре | разница 10-20 °C, бак ниже порога | реле ON, LED горит |
| бак прогрет | разница меньше 2-3 °C | LED гаснет, реле держит по верхнему порогу |
| авария перегрева | верхний зонд ≥ 80 °C | реле OFF, зуммер, защёлка до перезапуска |
| обрыв одного зонда | −127 на любом из адресов | реле OFF, зуммер, печать кода аварии в журнал |
Отсечка на 80 °C — не про комфорт, а про безопасность. Кожа держит 44-45 °C без последствий, при 60 °C ожог приходит за секунды, и вода такой температуры из крана — уже травма для ребёнка; мой бытовой порог готовой воды — 55-65 °C. Накипь при 70 и выше растёт заметно быстрее и заодно изолирует спираль: ТЭН греет сам себя, а не воду. Заводская термозащита режет питание около 90 °C, моя отсечка на 80 срабатывает раньше и с голосом. Гистерезис для аварии не нужен: тревога сделана защёлкой и держится до перезапуска — человек должен прийти и посмотреть причину, а не услышать, как всё само стихло. Скелет голосовой тревоги по порогам собран в уроке про зуммер и пороги.
Пропажу датчика решаем так же, как в аквариуме: −127 — команда «не греть». Здесь у неё появляется вторая вилка: если молчит нижний зонд, разница обманывает арифметику — t_бак − (−127) даёт сотню, и «нагрев» выглядит вечным. Поэтому оба значения проверяю до всяких вычитаний: промах на любом из двух — реле гаснет и зуммер кричит, а не доверяется разности. После сброса тревоги перезапуском скетч честно включит ТЭН заново — поэтому сброс делают руками, убедившись, что причина найдена и устранена.
Код: отсечка, защёлка и индикатор нагрева
Скетч опрашивает шину одним broadcast-запросом: конверсия идёт обоим зондам разом, чтение — по адресам, и 750 мс не размножаются на два. Светодиод завязан на разницу, а не на реле: реле щёлкает по порогу готовности, а горящий LED обещает, что вода реально греется прямо сейчас. Печать bak=, vhod= и diff= ведёт хронику: за неделю в графике Serial Plotter видно утренний душ, вечернюю стирку и ночной простой — по ней же ловят и режим, в котором ТЭН перестал справляться.
#include <OneWire.h>#include <DallasTemperature.h> OneWire oneWire(2);DallasTemperature sensors(&oneWire); // адреса выдаёт скетч-адресоскан, у вас будут своиbyte addrBak[8] = {0x28, 0x61, 0x64, 0x12, 0x3C, 0x07, 0x00, 0xD1};byte addrIn[8] = {0x28, 0x9A, 0x11, 0x4F, 0x22, 0x08, 0x00, 0xE7}; const int TEN = 7; // реле ТЭНаconst int ZUM = 8; // зуммер аварииconst int LED = 12; // индикатор нагреваconst float POROG_TEN = 70.0; // греем ниже этой отметкиconst float OTSECHKA = 80.0; // авария перегреваconst float RAZN_MIN = 3.0; // разница, ниже которой бак готов int alarm = 0; // защёлка: 1 — тревога до сброса void setup() { Serial.begin(9600); pinMode(TEN, OUTPUT); pinMode(ZUM, OUTPUT); pinMode(LED, OUTPUT); sensors.begin(); Serial.println("bojler start");} void loop() { sensors.requestTemperatures(); // конверсия обоим зондам разом float tBak = sensors.getTempCByAddress(addrBak); // верх бака float tIn = sensors.getTempCByAddress(addrIn); // вход воды int ok = 1; if (tBak < -100 || tIn < -100) ok = 0; // проверка ДО арифметики if (ok == 0) alarm = 1; // пропажа — тоже авария if (ok == 1 && tBak >= OTSECHKA) alarm = 1; int ten = 0; if (ok == 1 && alarm == 0 && tBak < POROG_TEN) ten = 1; digitalWrite(TEN, ten == 1 ? HIGH : LOW); float diff = 0; if (ok == 1) diff = tBak - tIn; if (ten == 1 && diff > RAZN_MIN) digitalWrite(LED, HIGH); else digitalWrite(LED, LOW); if (alarm == 1) tone(ZUM, 880); // сброс — перезапуск платы else noTone(ZUM); Serial.print("bak="); Serial.print(tBak, 1); Serial.print(" vhod="); Serial.print(tIn, 1); Serial.print(" diff="); Serial.print(diff, 1); Serial.print(" ten="); Serial.print(ten); Serial.print(" alarm="); Serial.println(alarm); delay(2000);}Реле и ТЭН на 1,5 кВт — это ток около 7 А, и модуль с обещанными 10 А живёт на грани: клеммы затягивать, провода короткие, корпус закрытый. ТЭН — резистивная нагрузка, пускового броска у него почти нет, в отличие от мотора, но греться болтающаяся клемма умеет на любой нагрузке. Про связку реле и нагревателя у меня уже был подробный разговор — инкубаторный термостат на DHT22 — там же и логика порогов готовности. Цикл с delay(2000) здесь осознанный: защита бойлера — задача неторопливая, вода остывает часами; прибавите живые дела — перенесёте их в кооперативный цикл, он как раз про это.
Порог включения 70 °C я поставил не случайно: выше 65 вода в баке для быта уже избыток, а каждый лишний градус — расход электричества и накипи. При двухтарифном счётчике ТЭН на 1,5 кВт греет 80 литров за два-три часа, и утренний душ ложится на дешёвую ночную зону — прикиньте свой литраж и тариф, за год цифры выходят заметные.
Механика монтажа решает половину дела. В готовый водонагреватель резьбовую гильзу уже не вкрутить, поэтому мой путь — накладной: зонды прижаты к стенкам бака хомутами через тонкий слой термопасты, а поверх закрыты куском пенопласта — датчик меряет воду, а не воздух бойлерной. Наложный способ стоит пару градусов инерции, зато не требует разборки и герметизации. Не вешайте зонд на трубу в двадцати сантиметрах от патрубка: он меряет поток в трубе, а не бак.
Резьбовые гильзы, если вам всё-таки достался бак с разбором, сажают на фум-ленту и затягивают ключом без фанатизма: латунь тянется. Место под нижний зонд выбирайте у входа холодной воды, но после обратного клапана: клапан сбрасывает и перемешивает, и датчик рядом с ним ловит всплески. Верхний — в верхней трети, там, откуда уходит готовая вода: именно её температуру вы раздаёте смесителю и именно её держит отсечка.
- Два зонда на одной шине по адресам: конверсия одна на всех — 750 мс, чтение по очереди.
- Разница верх-низ — индикатор нагрева: 10-20 °C в разгаре, 2-3 °C — бак прогрет целиком.
- Отсечка 80 °C сделана защёлкой до перезапуска: реле гаснет, зуммер орёт; заводская термозащита остаётся в цепи.
- −127 на любом из двух зондов — «не греть»: разница с молчащим зондом превращается в фиктивную сотню.
- ТЭН 1,5 кВт — ток около 7 А: винтовые клеммы, запас по реле, УЗО и закрытый корпус.
- 1. Почему верхний зонд горячее нижнего во время нагрева?
- 2. Разница между зондами сжалась до 2 °C. Что это значит?
- 3. Почему тревога 80 °C сделана защёлкой, а не порогом с гистерезисом?
- 4. Нижний зонд вернул −127. Что выдаст разница t_бак − t_вход?
- 5. Сколько длится конверсия на шине с двумя DS18B20 при 12 битах?
Частые вопросы по теме урока
- Почему верхний зонд горячее нижнего во время нагрева?
- Нагретые слои всплывают, холодная вода остаётся у входа снизу. Разница слоёв — рабочая информация: 10-20 °C значат, что нагрев в разгаре. Горячая вода легче: бак греется сверху вниз, это стратификация
- Разница между зондами сжалась до 2 °C. Что это значит?
- Выравнивание разницы — признак перемешивания: нагрет весь объём. ТЭН гасят по верхнему порогу, и LED индикации нагрева в этот момент честно гаснет. Бак прогрет целиком, вода перемешалась
- Почему тревога 80 °C сделана защёлкой, а не порогом с гистерезисом?
- Аварийная отсечка не должна отпускать сама после остывания: за остыванием может стоять та же накипь или залипшее реле. Сброс — осознанное действие, перезапуск питания. Чтобы человек гарантированно пришёл и посмотрел причину
- Нижний зонд вернул −127. Что выдаст разница t_бак − t_вход?
- Вычитание молчащего зонда из нормального бака даёт t − (−127), то есть плюс сотня: LED горит всегда, а нагрев кажется вечным. Оба значения проверяют до арифметики. Фиктивную сотню: вечный нагрев на экране
- Сколько длится конверсия на шине с двумя DS18B20 при 12 битах?
- requestTemperatures — broadcast всей шине: оба зонда меряют параллельно. Чтение по адресам задержки не добавляет, и второй бак не удваивает паузу. Около 750 мс: команда конверсии идёт всем датчикам разом