Свой аквариум я долгое время грел нагревателем со стеклянной колбой и колёсиком-термостатом, и однажды утром застал воду на 29,8 °C: колёсико заело во включённом положении, встроенный термостат молча держал ток, а неоны с гуппи жили на пределе. Рыбы тогда выжили, доверие — нет. С тех пор я считаю заводское колёсико единственной линией обороны, а линий должно быть две. Вторую и собираем в этом уроке: герметичный DS18B20 в воде, реле на ТЭН, гистерезис по полградуса вокруг 25 °C и зуммер, который поднимет вас с кровати, если вода остыла до 20.
Электрику самого зонда выбирать не будем: подтяжка 4,7 кОм, распиновка, диапазон и смысл значения −127 уже разобраны в уроке про подключение DS18B20 — здесь берём его как готовый прибор. Интереснее то, чего в даташите нет: какую мощность брать у ТЭНа, куда именно опускать зонд, почему термостат обязан быть с окном, а не с одним порогом, и как связать всё это с экраном, реле и тревогой так, чтобы система спасала рыбу без вашего участия. А колёсико на колбе при этом не выбрасывается: его выкручивают на максимум и договариваются с ним заново — об этом ниже.
Мощность ТЭНа и место датчика
Мощность считают по правилу аквариумистов: около 1 Вт на литр. На 60-литровую ёмкость хватает 50-75 Вт, на 100 литров — 100, на 150 и больше — 150-200. Прохладная комната добавляет половину сверху, поэтому мой 90-литровый в комнате с одним стеклопакетом живёт на стоваттном ТЭНе. У правила есть обратная сторона, о которой молчат каталоги: ставить 300 Вт в 40 литров «чтобы наверняка» — путь к беде. Мощная колба у стенки варит локальный карман, датчик в другом углу читает честные 24, а рыба в метре от колбы ловит все 30.
Зонд опускаю в поток от фильтра на противоположной от ТЭНа стенке: перемешивание выравнивает градиент, который в неподвижной воде доходит до 1-2 °C между зонами. Присоска держит гильзу на середине высоты, кабель перед клеммой укладываю петлёй ниже уровня крепления — конденсат стекает по петле вниз, а не в разъём. Стальному или стеклянному корпусу чипа вода безразлична, слабое место то же, что и на воздухе: заделка кабеля в гильзу.
И про сам нагреватель. Колбы с колёсиком, титановые трубки и плоские стеклянные модели включаются одинаково — реле разрывает фазу, и от формы корпуса скетчу ничего не нужно. Встроенный термостат колбы выкручиваю на максимум: два термостата с неизвестными порогами в одном баке дерутся между собой, и кто из них главный — загадка. Пусть мастер один, мой скетч, а колба останется просто трубкой со своими ста ваттами.
| Объём аквариума | Мощность ТЭНа | Замечание из практики |
|---|---|---|
| 20-40 л | 25-50 Вт | маломощную колбу тоже ставьте в поток фильтра |
| 50-100 л | 75-100 Вт | мой вариант: 100 Вт на 90 л при 24 °C зимой |
| 120-180 л | 150-200 Вт | в холодной комнате смело берите верх диапазона |
| 200 л и больше | 2 × 150-200 Вт | две колбы с разных концов лучше одной мощной |
Порог держу один: цель 25,0 °C, включение ниже 24,5, выключение выше 25,5. Окно шире шума сенсора в разы, поэтому реле щёлкает по два-три раза в сутки, а не на каждом опросе — механику и счётчик щелчков мы считали в уроке про гистерезис реле. Цикл опроса — 2 секунды: 750 мс из них съедает конверсия при 12 битах, остальное — тишина. Вода остывает медленно, опрашивать чаще незачем; если скетч обрастёт живыми делами вроде кормушки — переносите цикл на планировщик millis.
Зуммер здесь не про перегрев, а про холод: вода уронилась до 20 °C — значит ТЭН умер, реле залипло в разомкнутом положении или датчик слетел с присоски. При 20 рыба ещё жива, и у вас есть часы, чтобы воткнуть запасной нагреватель; скелет такой тревоги по порогам собран в уроке про зуммер и пороги. Тонкий вопрос — реакция на пропажу датчика. Вариант «греть на всякий случай» я отвергаю твёрдо: нагреватель, который нечем выключить по неверным показаниям, однажды выключится, когда исправлять будет поздно. Скетч при −127 гасит реле и включает зуммер: холодная вода — беда поправимая, кипячёная — нет.
Код: экран, реле и голос тревоги
Экран — 16×2 по I2C, его первый запуск разобран в уроке про первый текст на LCD. Верхняя строка — температура воды, нижняя — состояние ТЭНа; хвост из пробел за пробелом стирает остатки прошлой цифры. Реле сидит на D7, зуммер на D8. За одним журналом t= в мониторе порта я провожу недели: по нему видно и ритм щелчков, и скорость остывания при выключенном ТЭНе — полезная цифра, когда проверяете утепление на зиму.
#include <OneWire.h>#include <DallasTemperature.h>#include <LiquidCrystal_I2C.h> OneWire oneWire(2); // линия DATA на пине 2DallasTemperature sensors(&oneWire);LiquidCrystal_I2C lcd(0x27, 16, 2); const int RELAY = 7; // модуль реле на ТЭНconst int BUZZ = 8; // зуммер тревоги холодаconst float T_ON = 24.5; // ниже — включаем нагревconst float T_OFF = 25.5; // выше — выключаемconst float T_ALR = 20.0; // тревога: вода остылаconst float T_BAD = -100.0; // всё ниже — шина молчит int heater = 0; void setup() { Serial.begin(9600); pinMode(RELAY, OUTPUT); pinMode(BUZZ, OUTPUT); lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Akva-termostat"); sensors.begin(); delay(1500);} void loop() { sensors.requestTemperatures(); // конверсия, ~750 мс при 12 битах float t = sensors.getTempCByIndex(0); int ok = 1; if (t < T_BAD) ok = 0; // -127.00 — это не температура if (ok == 1 && t < T_ON) heater = 1; if (ok == 1 && t > T_OFF) heater = 0; if (ok == 0) heater = 0; // нет данных — не греем digitalWrite(RELAY, heater == 1 ? HIGH : LOW); lcd.setCursor(0, 0); lcd.print("Voda: "); lcd.print(t, 1); lcd.write(223); lcd.print("C "); lcd.setCursor(0, 1); if (ok == 0) lcd.print("NET DATCHIKA! "); else if (heater == 1) lcd.print("TEN VKL "); else lcd.print("TEN VYKL "); if (ok == 1 && t < T_ALR) tone(BUZZ, 1000); // ТЭН умер? слышно! else noTone(BUZZ); Serial.print("t="); Serial.print(t, 1); Serial.print(" ten="); Serial.println(heater); delay(2000);}Логика порогов та же, что в гаражном термостате с гистерезисом, поменялся только датчик: у DS18B20 цифра цифровая, без АЦП и дрожи делителя. Конверсия блокирует цикл на 750 мс, но при двухсекундном такте это четверть времени — вода остывает часами, спешить некуда. Флаг heater — не кнопка, а память: между порогами реле держит прежнее состояние, и именно на этом держится вся защита от перещёлкивания. Захотите повесить на ту же плату освещение и кормушку — сначала разнесите дела по таймеру millis, потом добавляйте.
В симуляторе ТЭН изображает лампочка реле: он не греет воду, столбик датчика вы двигаете мышкой. На живом баке физика другая: 100 Вт поднимают 90 литров на градус за считаные минуты, поэтому гистерезис в полградуса не даёт реле покоя только на графике, а на деле — два щелчка в час и тишина.
Летом задача переворачивается: в жаркой квартире без кондиционера те же 90 литров ползут к 28-29 °C, а для многих тропических видов граница комфорта проходит у 28. Зеркальные пороги решают и это: включение вентилятора выше 28,0, выключение ниже 27,0 — скетч меняет только константы и направление сравнений, гистерезисный каркас остаётся. Вентилятор берите 5-вольтовый компьютерный и кормите его от отдельного канала или через транзисторный ключ: поток над водой сбивает 2-3 °C за счёт испарения — проверено на моём баке в августовскую духоту. Связку датчика и вытяжки по порогу собирали в уроке про вентилятор-автоматику. Один нюанс: при испарительном охлаждении вода уходит — доливайте и следите, чтобы лопасти не брызгали на плату.
Перед пуском в воду проверьте зонд на двух точках, пока он ещё сухой. Стакан с колотым льдом и водой — около нуля; второй точкой служит комнатный настенный термометр: сверьте показания с ним. Моя привычка — гонять новый зонд сутки рядом со старым, прежде чем доверить ему рыбу: расхождение больше 0,5 °C в устойчивых условиях — повод вернуть деталь продавцу, а не править пороги в скетче.
- Порог один, окно два: включение ниже 24,5, выключение выше 25,5 — по полградуса от цели 25 °C, и реле щёлкает дважды в сутки.
- Зонд — в поток от фильтра, на противоположную от ТЭНа стенку: градиент в неподвижной воде доходит до 1-2 °C.
- Мощность ТЭНа — около 1 Вт на литр; 90-литровый бак довольствуется 100 Вт, холодная комната добавляет половину.
- −127 — команда «не греть»: реле гасим, зуммер включаем; холодная вода поправима, кипячёная — нет.
- Колёсико на колбе выкручивают на максимум: два термостата в одном баке дерутся между собой.
- 1. Куда ставят DS18B20 в аквариуме с ТЭНом?
- 2. Вода остыла до 19,5 °C. Что делает скетч урока?
- 3. DS18B20 вернул −127. Как реагирует мой скетч?
- 4. Какой ТЭН выбрать для 90-литрового аквариума?
- 5. Зачем выключение на 25,5, а включение на 24,5?
Частые вопросы по теме урока
- Куда ставят DS18B20 в аквариуме с ТЭНом?
- Датчик должен читать среднюю температуру бака. Возле ТЭНа он видит локальное тепло колбы и выключает реле раньше, чем прогреется весь объём; поток фильтра перемешивает воду. В поток от фильтра на противоположной стенке
- Вода остыла до 19,5 °C. Что делает скетч урока?
- Тревога холода на 20 °C — про отказ ТЭНа или реле, а не про регулятор. Реле остаётся включённым, зуммер зовёт человека: при 20 °C у рыбы ещё есть часы на спасение. Продолжает греть и пищит зуммером: ТЭН, похоже, умер
- DS18B20 вернул −127. Как реагирует мой скетч?
- −127 — молчание шины, а не температура. Нагреватель по неверным данным нечем выключить, поэтому единственная безопасная реакция — не греть и звать человека. Гасит реле и включает зуммер
- Какой ТЭН выбрать для 90-литрового аквариума?
- Мощная колба в малом объёме варит локальный карман у стенки: датчик в другом углу показывает норму, а рыба рядом с колбой перегрета. Холодная комната добавляет к правилу половину. 100 Вт — по правилу около 1 Вт на литр
- Зачем выключение на 25,5, а включение на 24,5?
- У датчика шум в десятые градуса. С одним порогом 25,0 реле перещёлкивало бы на каждом колебании; окно в градус мы считали на счётчике щелчков в уроке про гистерезис. Окно шире шума сенсора: реле не щёлкает на каждом опросе