Аквариумный контроллер “TeRRaN”

черепаха

Предисловие: «проект Терран».

Дон Кирпич был не молод, по меркам черепахи, но до старости ему было еще далеко. В жизни он видел некоторое дерьмо. Но были радостные моменты. И вот один из таких радостных моментов настал, когда я понял, что наш «болотник» вырос из своего старого жилища и пора бы ему переезжать в новый террариум. Сказано – сделано. Заказали новую «банку», новый внешний фильтр, новые лампы освещения и подогрева. В общем прям пентхаус ему новый построили. А т.к. я, по своей природе, человек ленивый, то в новом террариуме оставлять старые заморочки с включением ламп, фильтра и т.д. тоже не очень хотелось. Ну фиг ли, пусть пентхаус будет умным. Так и был придуман контроллер «Терран». Почему «Терран»? Может потому что террариум, может потому что я в старкрафт переиграл, да просто вот так.

Глава 1 «Чего бы еще повключать?»

Обдумав все свои идеи, и пообщавшись с парочкой аквариумистов, я решил не зацикливаться только на своём конкретном случае, а сделать контроллер «Терран» более или менее универсальным. Так сказать для аквариумов, террариумов и прочих «умов». Ну а раз уж нам надо (как всегда) быстро, то угадайте что я буду использовать? Правильно, Arduino. К слову, не так давно пересмотрел свои позиции относительно неё. Стал немного лучше к ней относиться, с учётом количества реализуемых мной проектов на arduino nano. Ну да ладно, речь не об этом. Так вот концепция, с учётом аппаратных возможностей и наших потребностей такая:

  • Включение и отключение трех устройств по суточному таймеру. При чем без привязки к конкретным суткам. Иными словами нужно иметь возможность включить устройство, к примеру в 20:00, а выключить в 19:00 следующего дня.
  • Включение и отключение одного устройства по температуре. Опять же, не важно, подогреватель это или охладитель. Вдруг Вам захочется аксолотлей завести? Температуры включения и отключения могут быть любыми.
  • Возможность ручного управления.
  • Восстановление состояния после сбоя питания.

Глава 2 «Ректальная тонзиллэктомия»

В проекте «TimeLapse контроллер» я использовал довольно удачную (как мне показалось) связку Arduino nano, дисплея от Nokia5110 и энкодера. Почему бы не повторить? Добавим сюда термистор для измерения температуры и четыре реле для управления. Ну а раз эта аппаратная часть у нас уже проверена, то схватим лошадь за хвост начнем с кода. Так интересней:

Это версия 1.0. Последующие версии буду просто выкладывать в архив с исходниками.

Немного пояснений:

  • Функцию обработки температуры я честно скопипастил с какого-то примера из интернетов.
  • Основная функция цикла нарукожоплена написана таким образом, что бы можно было устанавливать любое время включения и выключения и любые температуры. Положительная разница между ними или отрицательная – не имеет значения.
  • Функция initOn() восстановление после отключения, служит для расчета времени и температур при включении устройства. Благодаря ней не нужно записывать каждый раз состояния в EEPROM. А это существенно продлит жизнь нашей ардуинке.
  • Функция autoCorrection() раз в сутки (начиная от последней настройки времени) компенсирует неточность часов, прибавляя заданное число секунд.

Про последнюю фичу нужно вообще сказать отдельно. Эта функция родилась в процессе отладки устройства, т.к. часы на базе DS1307 вообще не отличаются сильной точностью хода, а ставить GPS приёмник, например, это уже дичайший перебор. В моём случае часы убегали вперед на 5-6 секунд в сутки. Но из профильных форумов читал, что бывают и случаи по 15-20 секунд на сутки. Данная функция позволила сократить разбег часов до 4х секунд в неделю. Что, как я думаю, достойный результат. Вообще, как я понял из собственного опыта, самое сложное в микроконтроллерном программировании, это работа со временем. Оказалось, что это очень тонкая материя – рулить переменной, от которой отталкивается всё, в том числе и сам “руль”. Это как стоять на доске и пытаться её же поднять! А штука в том, что в программировании это ВОЗМОЖНО! И так как я не программист, я много времени провел в интернете, в поисках примера. Десятки форумов проговаривали фразу «программная коррекция», но ни один так и не дал пример. То ли теоретиков слишком много, то ли все считали, что это настолько элементарно, что и пример кода не нужен. В общем пришлось писать самому. А мне, как НЕ программисту, это далось ни разу не просто.

Так или иначе запустил всё это на симуляторе Proteus и (с чего бы это???) всё заработало. Если кто-то захочет поиграться, положу файл Proteus’а в архив с исходниками.

После небольших телодвижений напильником по коду, я накидал схему:

Тут всё по традиции, никакого изврата. Ну разве что подключение пьезоизлучателя через ULN2003, но это просто оптимизация. Был лишний транзистор в сборке, почему бы и не использовать? Так же все порты подключены через резисторы, что бы ограничить ток на случай выхода чего либо из строя. Думаю, как подключать реле к розеткам 220в, объяснять не нужно. А если нужно, то Вам явно не стоит затеваться с повторением этого контроллера.

После решил собрать всё на макете и проверить в железе, перед тем как удариться во все тяжкие делать печатную плату.

Знаю, выглядит ужасно. Но мы тут не ядерный синтез запускаем. Главное – работает!

Глава 3 «Снова практикуем ардусатанизм»

приступаем к печатной плате:

Для экономии места расположил часы вертикально. И да! Снова выворачиваем «нанку на изнанку». Отдельный стабилизатор 7805 поставил, что бы не греть встроенный в ардуину. Ну не доверяю я им, хрупкие они на мой взгляд. Это моя «шиза» и нечего с неё смеяться. А вообще, можно использовать и встроенный. Кто как любит. Всё проверил, травлю, лужу, паяю, лаком покрываю:

Тестовый запуск:

Вот над вопросом «И куда вот это вот всё засунуть?» я думал долго. Корпус хотелось не большой, но с розетками на 220в, что, оказалось, две несовместимые «хотелки». На моё счастье нашелся дохлый ИБП с нужным корпусом типа вот такого:

Ну что же, не очень компактно, но неплохо. Четыре розетки я использовал для своих целей, а остальные четыре просто запитал напрямую. Вынул всё лишнее, отпилил всё ненужное, поставил внутрь всё нужное:

Маленькая белая коробочка справа – блок питания на 12в 500мА. Куплен в местном радиодетальном магазине. Собрал:

Рекомендация по сборке всего лишь одна:

Т.к. мы тут имеем дело с напряжением 220в, четко понимайте и перепроверяйте всё что вы делаете. Тут Вам не шутки. Обязательно озаботьтесь предохранителями и прочими средствами защиты. Пожары и жертвы никому не нужны.

Глава 4 «Как это работает?»

Прошивка 1.0

И так, в итоге у нас управление энкодером, и три варианта экрана. Главный экран включает в себя:

  • Дата и время
  • Кнопки с номерами розеток, для ручного управления
  • Под ними индикаторы “O” или “I”. Показывают включена или выключена розетка
  • Справа температура на датчике. Обновляется каждую нечётную секунду
  • Снизу кнопки “Auto” – для входа в меню установок автоматизации, и “Sett” – для настройки самого устройства.

Экран установок автоматизации:

  • Четыре строки с номером розетки. Напротив каждого номера время включения, время выключения. На четвертой розетке соответственно температуры включения и выключения.
  • Кнопка возврата в главный экран
  • Текущая температура. Для удобства установки последнего реле

Экран настройки:

  • “DAY” – установка даты
  • “TIME” – установка времени
  • “tADJ” – количество секунд, прибавляемое каждые сутки, для автоматической корректировки часов
  • “DSPL” – уровень контраста дисплея
  • Кнопка возврата в главный экран
  • “τ” время следующей автоматической корректировки часов

Первый запуск контроллера «Терран», настоятельно рекомендую проводить с зажатой кнопкой енкодера. Это сбросит настройки на начальные и пропишет их в память EEPROM. Так же при первом запуске велика вероятность, что модуль часов не инициирован и Вы увидите вместо даты и времени «00». Это нормально, нужно зайти в настройки и как только Вы начнёте задавать дату или время – часы начнут отсчёт. Рекомендую начать установку от года к дням. Так же, именно с момента установки времени, будут отсчитываться 24 часа для периодической корректировки времени. Далее рекомендую выставить точное время и проверить через 24 часа на сколько и в какую сторону убегает Ваш экземпляр часов. Установить это время в параметре tADJ. Например, в моём случае, часы спешили на 5 сек. Соответственно в параметре tADJ я указал -5 сек, скорректировал часы по серверу точного времени и сохранил EEPROM.
Основной цикл автоматизации и автокоррекция не работают пока Вы находитесь на одном из экранов настройки. Если Вы что-то меняли в настройках или в установках автоматизации – нажмите и подержите кнопку енкодера на главном экране до звукового сигнала. Это сохранит изменения в EEPROM память контроллера (включая последнее время корректировки времени). Если этого не сделать, то после выключения питания настройки вернутся на предыдущие.

Прошивка 1.1

  • третья розетка работает по таймеру, а не по времени как первая и вторая. Т.е. в настройке автоматизации указывается не время, а продолжительность включенного состояния (работы) и продолжительность выключенного состояния (простоя).
  • внесены некоторые оптимизирующие правки. Размер занимаемой памяти стал меньше, изменена работа с EEPROM.
  • поправлены мелкие недочеты в коде.

Прошивка 1.2

  • глобально переработан цикл дисплея
  • количество таймеров выросло с четырех до восьми (6 по времени и 2 по температуре). Все розетки отвязаны от таймеров. Любой таймер  можно назначить на любую розетку и можно их смешивать.
  • исправлены ошибки в основном цикле и цикле инициализации
  • исправлена стабильность работы енкодера
  • размер занимаемой памяти сократился на 5-7%.

инструкция по эксплуатации версии 1.2

Заключение

Данный прототип я собирал пару дней, а вот отлаживал почти месяц. И прошивка Террана продолжает “вылизываться” по сей день. Тем не менее, устройство стабильно работает и имеет право на жизнь. Главное что дон Кирпич доволен и улыбается. И не маловажная часть прототипирования – экономическое обоснование. Ну так вот: цена всех запчастей на момент публикации составила примерно 1300р + корпус. Если все эти пироги покупать не в местном магазине, а заказать в Китае, выйдет еще дешевле. А вот три розетки с таймером и один термостат в заводском исполнении, по цене обошлись бы примерно в два-три раза дороже. В общем, пользуйся своими мозгами правильно, дорогой читатель.

исходники проекта

11 комментариев для “Аквариумный контроллер “TeRRaN”

  1. Честно говоря, я считаю, что собрать нормальный аквариум, например, местами сложней. Это же нужно целую экосистему создать, кучу мелочей продумать. Так что если человек способен на создание подобного, то и этот контроллер будет для него выполнимой задачей. Может не простой, но выполнимой 🙂

  2. Классно получилось! основательно, даже с шпротеусом) Теперь черепахен вообще людей перестанет видеть, всё завтоматизировал)
    Репозитарий на github не надумал завести? чтобы обновления прошивок вести.

  3. ой, ниии. я пока не дорос до хаба. А черепах только рад, что его не трогают. Он только жрачку когда чуит – активизируется))

  4. Мне известно что uln2003 – это транзисторы Дарлингтона дающие на выходе или обрыв или землю.
    Поэтому пищалка подключенная к земле работать не будет.
    Её надо на питание подключать , как релюшки.

    1. Спасибо, что заметили ошибку. На самом деле в PCB пищалка подключена правильно, к +5V. Ошибка закралась только в схему. Я сейчас же её исправлю.

  5. Нашёл ссылку на Ваш блог на форуме aquakmv.com. Сначала собрал описанный там контроллер (без световых эффектов – закатов, восходов и прочих лун, считаю это лишним) – много таймеров, а температурное реле только для вентилятора, что не очень меня устраивало.
    Увидел Ваш и загорелся сделать. Считаю, он выгодно отличается от первого.Пока разбираюсь, собрал без релюх и транзисторов.
    Единственное, пришлось подправить код – у меня автоподсветка работала “наоборот” , т.е. постоянно, а когда действуешь энкодером, гасла. Но это мелочь, вероятно, дисплей не такой как у Вас.
    Возник вопрос : как можно откалибровать датчик температуры? Только подбором R1 или можно программно?
    И как подключить датчик ds 3231 вместо терморезистора ? Я совсем чайник в этих делах…

    1. Здравствуйте.
      Про калибровку: обычно точность +/- 1 градус, что вполне достаточно. Если сильно врёт, то можно не мудрить и в строке tempNTC = steinhart; добавить или отнять нужную величину. Но я бы лучше подобрал резистор. Так идеологически правильней, я считаю.
      ds3231 – это часы реального времени. Кстати более точные чем ds1307 и полностью совместимые с данным проектом. Я бы рекомендовал ставить именно их. Если же вы имели в виду датчик ds18b20, то примеров в интернете полно (первая ссылка в гугле https://arduinomaster.ru/datchiki-arduino/arduino-ds18b20/), но я не просто так отказался от него в пользу терморезистора. Дело в том, что датчики эти (может мне только подделки китайские попадались?) часто возвращают ошибочные значения, а написать правильную программную обработку мне не хватило желания. Кода больше, толку меньше.

      P.S. про дисплей Вы правы. Бывают с управлением по 1 а бывают по 0.

  6. Спасибо за быстрый ответ. Конечно, я имел в виду ds18b20, а часы применил ds3231, перепутал. И все-таки точности термометра на термисторе недостаточно для аквариума , особенно при разведении.
    Погуглил термисторы, датчики LM35… Только ds18b20 дает необходимую точность (0.5оС, 0.25оС, 0.125оС или 0.0625оС ) . Попробую разобраться, как подключить. Всё когда-нибудь приходится делать впервые, может, программистом на старости лет стану!

  7. Ещё вопрос. Если Вы пробовали подключать ds18b20, не могли бы скинуть код для образца. Просто кроме кода для подключения придётся как-то выводить на дисплей, что-то удалять из основного кода… Боюсь, сразу не осилю.

    1. Хм… Эту часть кода я пробовал, но не сильно помню куда всё это делось.
      Я поищу, что у меня было. Если будет время, подкину код в симулятое, посмотрим что получится.
      Для связи можете писать мне на support@unicaster.ru может так побыстрей будет.

Добавить комментарий

Ваш адрес электронной почты не будет опубликован.Обязательные поля помечены *

* Все комментарии проходят предмодерацию.