Простой аквариумный контроллер. Таймер – незаменимый помощник аквариумиста

25.05.2019

Идея максимально автоматизировать обслуживание аквариума зрела давно.

Просмотрев в сети множество конструкций, я остановился на одном из вариантов многофункционального акваконтроллера Виталия Шарапова. Существует несколько его модификаций. Вот схема автора, взятая мной за основу:

Итак, что может этот прибор? Вот выдержки из авторского описания, полный вариант находиться в архиве.

  1. Отсчет реального времени в часах и минутах;
  2. Управление 3-мя нагрузками (Свет, Нагрузка1, Нагрузка2) по времени;
  3. 6 независимых программируемых таймеров (времён включения-выключения), каждый может управлять любой из нагрузок, дискретность – 15 мин.;
  4. Измерение температуры воды каждые 10 секунд с точностью до 1°C (диапазон 0…99°C);
  5. Управление нагревателем и охладителем (вентилятор или аппарат на основе модуля Пельтье) с точностью +-1°C (диапазон 20…39°C), работа охладителя на пониженной мощности при превышении допустимой температуры менее чем на 3°C (для снижения шума);
  6. Индикация состояния нагрузок (включено или выключено);
  7. Ручная коррекция времени (по сигналам точного времени);
  8. Автоматическая ежедневная коррекция времени на заданную величину (от -59 до +59 секунд в сутки);
  9. Сохранение хода часов (при наличии резервной батареи) при отсутствии напряжения в сети до 2-7 суток (зависит от используемой батареи);
  10. Сохранение настроек пользователя в энергонезависимой памяти при полном отключении питания, восстановление при включении.

Вот так всё начиналось:

Плату процессора я повторил почти полностью, изменения не большие и не принципиальные.


Исходил прежде всего из наличия у меня деталей и следовательно удешевления всей конструкции. Этим же обусловлен выбор индикатора МТ-10Т7. Он самый недорогой среди доступных, есть вариант без подсветки. Конечно, у такого выбора есть и минусы. Например, сложность отображения букв с помощью семи сегментов. Уже после сборки я переделал схему питания индикатора. Считаю, что питать индикатор от батареи ни к чему, её задача сохранить питание микроконтроллера и тратить её на индикацию не стоит. Индикатор работает только при питании от сети, при переходе на питании от батареи, индикации нет. К сожалению, к тому моменту плата уже была спаяна, поэтому новые дорожки проложены навесным монтажем. Печатного варианта для такого подключения я не разрабатывал. Вот расположение навесного монтажа:

Вот мой вариант схемы:

И плата силового блока.

Резистор R6 есть смысл ставить при использовании аккумулятора в качестве резервного источника питания. Резисторы R9-R13 ставятся при необходимости и подбираются под конструкцию силового блока. Изначально в качестве корпуса был выбран сломанный сетевой фильтр. Опять же потому, что он у меня уже был. Так как я не планирую использовать нагрузку 220 вольт более 150 ватт, то тиристоры установлены без радиаторов. Для основной массы приборов это более чем достаточно. Транзисторы, управляющие нагрузкой 12 вольт так же без радиаторов. Следовательно, учитывая это, и мощность трансформатора, нагрузка на оба 12в канала должна быть не более 2 вт. Для вентилятора-охладителя и светодиодной подсветки этого вполне достаточно. Единственный радиатор будет на КРЕНке, и то скорее для подстраховки.

В настоящее время таймер управляет освещением в и продолжается работа над завершением корпуса.

Каких-либо проблем и ошибок в процессе изготовления и эксплуатации до настоящего момента не выявлено. В одном месте пришлость поработать надфилем, благо место позволило: отверстия крепления индикатора на плате не совпали с отверстиями на самом индикаторе-примерно на 0,5-1 мм.

Наличие шести таймеров дает широкие возможности для автоматизации . Конструкция достаточно проста, работоспособна и доступна для повторения. Архив с моим вариантом схемы, печатными платами и прошивкой: Алгоритм работы таймеров в описан в авторском архиве.

P.S. К сожалению, архив с моими файлами(схема в.lay и платы в.spl7) перестал быть доступен на этом сайте. Если у Вас есть интерес к ним, пишите личное сообщение, вышлю на почту.

1.8. Простой аквариумный таймер

Аквариумный таймер, работающий в режиме циклической генерации, сегодня не новость для радиолюбителей. Промышленность (в том числе зарубежная) бьет все рекорды по выпуску электронных и электромеханических таймеров, программируемых для выдержки времени в определенные дни и часы недели (и месяца). Конкуренция в области производства таймеров бытового предназначения выросла за пару лет в разы. Однако для радиолюбителя-практика и сегодня актуально создание собственных схем, вместо предлагаемых промышленностью.

Одна из схем подобного назначения, воплотившая наиболее простое схемное решение, представлена на рис. 1.10.

Особенности устройства - в полуавтоматическом режиме работы. При наступлении рассвета (включении освещения в комнате, где установлены фотодатчики) электронное устройство издает кратковременный звуковой сигнал и включает слаботочное электромагнитное реле К2. Исполнительные контакты реле К2, в свою очередь, включают лампу аквариумного освещения вместе с компрессором-помпой (на схеме не показаны). Лампа освещения и компрессор остаются включенными в течение почти 4 ч (зависит от номиналов элементов R5C2). По окончании выдержки времени лампа освещения и компрессор отключаются. При новом рассвете (новом включении света в комнате после периода затемнения) цикл работы устройства повторяется - так происходит ежедневно.

В основе устройства таймер на популярной микросхеме КР1006ВИ1. Он собран по классической схеме в режиме автогенерации импульсов большой длительности. На выходе таймера включено электромагнитное реле К2, своими контактами К2.1 оно управляет подачей напряжения на компрессор аквариума и осветительную лампу. Лампа может быть как люминесцентной (с соответствующей схемой управления), так и лампой накаливания с мощностью до 15 Вт. Более большая мощность не желательна из-за возможности перегрева и оплавления верхней крышки аквариума, в которой установлена лампа освещения. Компрессор - любой промышленный для аквариумов.

В схему введен узел управления самой микросхемой КР1006ВИ1 в зависимости от внешнего освещения. Это сделано для того, чтобы таймер и соответственно лампа освещения аквариума и компрессор включались только в светлое время суток, а ночью были не активны. Данный фоточувствительный узел собран на однотипных транзисторах VT1, VT2, нагруженных на электромагнитное реле К1. Коммутирующие контакты реле К1.1 подают питание на (или отключают от питания) микросхему DA1. При слабой освещенности однотипных фоторезисторов СФ3-1 (включенных параллельно и обозначенных единым обозначением на схеме PR1) транзисторы VT1, VT2 закрыты, соответственно реле К1 обесточено, контакты реле К1.1 с номерами 3 и 5 (согласно схеме рис. 1.10) разомкнуты и на автогенератор, собранный на микросхеме DA1, напряжение не поступает. Соответственно контакты К2.1 разомкнуты и лампа освещения аквариума, а также компрессор обесточены.

Переменный резистор R1 введен в схему для удобства регулировки порога включения транзисторного каскада VT1, VT2. Резистор R1 определяет чувствительность данного узла к световому потоку.

Если освещение фоторезисторов достаточно, например днем, сопротивление фоторезисторов PR1 мало, транзисторы VT1, VT2 открыты, реле К1 включено, на микросхему DA1 подано напряжение питания, индикаторный светодиод HL2 (аналогичный по электрическим характеристикам HL1) светится. На узел звуковой индикации подано питание. Микросхема DA1, включенная в режиме отсчета выдержки времени в соответствии с номиналами элементов времязадающей цепи R5C2, начинает отсчет времени. Реле К2 включено, лампа освещения аквариума и компрессор включены.

По окончании выдержки времени, заданной номиналами элементов R5C2 (примерно 240 мин) на выводе 3 микросхемы DA1, появляется высокий уровень напряжения, реле отпускает и контакты К2.1 размыкаются, лампа освещения погаснет, компрессор выключится.

Теперь следующее включение произойдет после того, как контакты К1.1 разомкнутся (это произойдет при недостаточной освещенности, например, вечером и ночью), а затем снова замкнутся с наступлением нового дня или включением основного света в комнате, где установлены фотодатчики PR1.

Узел звукового сопровождения подключается непосредственно параллельно к контактам питания того устройства, включение которого он призван контролировать, в данном случае параллельно питанию микросхемы DA1.

В основе этого электронного узла популярная микросхема К561ЛА7. Благодаря применению одного из ее логических элементов, а также использования капсюля со встроенным генератором звуковой частоты (ЗЧ) HA1 в схему нет необходимости вводить какие-либо генераторы импульсов или усилители к ним. Такой же узел несложно собрать и на логических элементах других микросхем КМОП (например, К561ЛЕ5, К561ТЛ1), однако наиболее простое схемное решение показано на рис. 1.10.

Схема кратковременной звуковой сигнализации основана на одном логическом элементе DD1.1 микросхемы К561ЛА7, включенном как инвертор. При подаче питания на входе элемента (выводы 1 и 2 DD1.1) присутствует низкий уровень напряжения до тех пор, пока не зарядится оксидный конденсатор С1 через ограничительный резистор R2. Пока этого не произошло, на выходе элемента (вывод 3 элемента DD1.1) присутствует высокий уровень напряжения. Он поступает через ограничивающий ток резистор R6 в базу транзистора VT3, работающего в режиме усилителя тока. Транзистор VT3 открыт, сопротивление его перехода коллектор-эмиттер близко к нулю и на пьезоэлектрический капсюль со встроенным генератором звуковой частоты НА1 подано напряжение питания.

Когда постоянное напряжение на пьезоэлектрическом капсюле со встроенным генератором НА1 окажется почти равным напряжению питания устройства капсюль переходит в режим генерации колебаний звуковой частоты.

По мере заряда конденсатора С1 через резистор R2 и внутренний узел элемента DD1.1 происходит изменение состояния выхода микросхемы. Когда напряжение на обкладках конденсатора С1 достигнет уровня переключения микросхемы, она переключится и высокий уровень напряжения на выходе DD1.1 сменится низким. Транзистор VT1 закроется. Постоянное напряжение на пьезоэлектрическом капсюле со встроенным генератором НА1 окажется почти равным нулю, и капсюль перейдет в режим ожидания.

При указанных на схеме значениях элементов R2 и С1 задержка выключения звука составит около 3 сек. Ее можно увеличить, соответственно увеличив емкость конденсатора С1. В качестве конденсатора С1 лучше использовать оксидный типа К50-29, К50-35 и аналогичный с небольшим током утечки. В обратную сторону длительность временного интервала можно легко сократить, уменьшив сопротивление резистора R2. Если вместо него установить переменный резистор с линейной характеристикой, то получится устройство с регулируемой задержкой.

Функцию данного электронного узла можно поменять на обратную - т. е. сделать так, чтобы пьезоэлектрический капсюль НА1 молчал первые 3 секунды после подачи на устройство питания, а затем все остальное время работал. Для этого оксидный конденсатор С1 и времязадающий резистор R1 следует поменять местами (с соблюдением полярности включения оксидного конденсатора - положительной обкладкой к «плюсу» питания). При этом средняя точка их подключения к выводам 1 и 2 элемента DD1.1 сохраняется. В таком варианте устройство без особых изменений можно применять для звукового сигнализатора открытой (сверх меры) дверцы холодильника. Кроме того, вариантов применения данного простого и надежного устройства бесконечно много и они ограничены только фантазией радиолюбителя.

Из книги Феномен науки [Кибернетический подход к эволюции] автора Турчин Валентин Фёдорович

Из книги Электронные самоделки автора Кашкаров А. П.

1.3. Простой источник аварийного питания Электрическая схема, представленная на рис. 1.3, удобна в применении на даче и там, где электроэнергия пока еще поступает нестабильно. Простое устройство, собранное по рекомендуемой схеме, обеспечит автоматическое включение

Из книги Электронные фокусы для любознательных детей автора Кашкаров Андрей Петрович

2.3.1. Простой вариант устройства управления Телефонная сеть, кроме своего прямого назначения, обладает еще несколькими преимуществами, которые разумно, без вреда для других абонентов, можно эффективно использовать.Схема телефонной приставки, которую я предлагаю на

Из книги Автономное электроснабжение частного дома своими руками автора Кашкаров Андрей Петрович

2.2. Простой электронный триггер для включения Квартирные звонки с дистанционным управлением (по радиоканалу) и выбором мелодий вносят в обыденную жизнь радиолюбителей новые варианты своего применения. Теперь, купив такое устройство не трудно дополнить его простой

Из книги Крыши. Устройство и ремонт автора Плотникова Татьяна Федоровна

3.10.2. Самый простой датчик влажности, который видел я Самый простой промышленный датчик влажности, который приходилось видеть, был создан компанией Philips, и стоил менее 1 USD.Внешний вид – две пластинки из нержавеющей стали с изолятором в виде тонкого (пластикового на вид)

Из книги автора

Из книги автора

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

Из книги автора

Простой французский способ Выполняется так же, как простой немецкий. Но при этом способе используют квадратную плитку со скошенными боковыми углами или шестиугольную. Плитки крепят к обрешетке гвоздями (рис. 44). Рис. 44. Укладка сланцевых плиток французским

Вступительная часть

Предпосылки для создания контроллера весьма банальны - был приобретен аквариум на 450 л, и к нему в дополнение шла крышка с установленными лампами, ЭПРА, кулерами, PH-электродом с усилителем, и управляющим всем этим многоканальным контроллером. Первое время все работало без сбоев, но потом начали умирать управляющие симисторы, сбрасываться текущее время, да и функционал не совсем удовлетворял возросшим требованиям. После длительного использования и анализа имеющегося контроллера было принято решение сделать свой управляющий орган, и продуман функционал будущего устройства:

1. Управление 8 каналами (+1 ШИМ канал):
- 4 канала освещения;
- компрессор;
- нагреватель;
- электроклапан системы CO2;
- помпа/электроклапан автодолива;
- кулера 12В (ШИМ).
2. Подключение 3-х температурных датчиков DS18B20.
3. Подключение электродов PH и Redox-потенциала.
4. Подключение датчика уровня воды (аналоговый датчик).
5. В качестве коммутирующего элемента использовать электромеханические реле.
6. Подключение 4-х строчного ЖКИ на контроллере HD44780.
7. Наличие часов реального времени DS1307Z.
8. Связь с ПК организовать 2 способами:
- радиомодуль, использующий Bluetooth HC-05 (основной канал);
- подключение по USB (резервный канал).
9. Номинальная мощность коммутируемой нагрузки 650 Вт.
10. Наличие электрических фильтров питающих напряжений и защитных элементов основных цепей устройства.
11. Промаркировать все разъемы и выводы подключений.
Возможности программного обеспечения для ПК:
- ручной режим управления нагрузкой;
- 4 автоматических режима (температурный режим, режим PH/CO2, режим вентиляции крышки, режим автодолива воды);
- использование 3-х таймеров на каждый канал, с возможностью по секундной установки интервалов;
- калибровка электродов;
- ограничивающие временные интервалы подсветки ЖКИ, работы кулеров и системы СО2;
- запись данных в энергонезависимую память контроллера и всевозможная индикация текущих параметров системы.

С некоторыми поправками данный функционал может быть отнесен к категории универсальных устройств. Это конечно не совсем корректно, т.к. аквариумные контроллеры можно разделить на 2 подгруппы – для пресноводных и морских обитателей. Различаются в данном случае и режимы освещения, и наличие различных электродов, определяющих параметры воды, и программные режимы, стабилизирующие эти параметры, и др. Аппаратная составляющая аквариумов так же весьма отличается. Освещение может быть организовано люминесцентными лампами, а могут быть использованы светодиоды или светодиодные ленты. IMHO – использование светодиодов более привлекательный подход, как с точки зрения получения необходимого спектрального состава, так и при организации управляющих режимов. Однако, использование качественных комплектующих, стабилизаторов тока, источников питания и вопрос отвода тепла делает этот подход более дорогостоящим. Ввиду чего, большое количество аквариумистов все еще использует люминесцентное освещение, и менять его пока не собираются. Различий может быть великое множество, ибо готовые решения приобретаются крайне редко, и большая часть аквариумов собраны под индивидуальные вкусы их владельцев. В данном случае рассматривались 3 аквариума, и были объединены/усреднены требования по оным. В итоге, получилась система для пресноводного аквариума (либо травника), с люминесцентным освещением, объемом до 500 л., автономным режимом работы, выводом необходимой информации на ЖКИ и подключением к ПК для конфигурации.

Аппаратная реализация

Исходя из личного опыта, опыта других разработчиков и вредности своего IMHO – конструкции типа «бутерброд», построенных на базе Arduino и иже с ним, стараюсь не использовать. Вообще и никогда. Это же касается и программного обеспечения (низкого или высокого уровня). Исключения составляют внешние библиотеки, собственноручно переработанные и прошедшие не одну сотню часов тестирования. Ну и разумеется стандартные либы, блокнот, компилятор, программатор/отладчик и осциллограф.

Аппаратная часть основана на микроконтроллере фирмы Atmel - ATmega32A, работающего от внешнего кварцевого резонатора 11.0592 MHz. Выбор обоснован наличием большого кол-ва флеш- и оперативной памяти, необходимым кол-вом выводов, дабы не чувствовать себя стесненным в средствах (в итоге было использовано ~80% ресурсов МК). Коммутация нагрузки реализована посредством электромеханического реле. В устройстве использовались реле герметичного исполнения фирмы OMRON, серия – G5LA. Получение текущего времени организовано посредством микросхемы DS1307Z + прецизионный термостабильный резонатор, заблаговременно снятый со швейцарского промышленного оборудования. Выбор был обусловлен наличием этой микросхемы и качественного резонатора. В другом случае предпочтительно использовать DS3231. Для управления кулерами используется ШИМ-сигнал. В качестве ключевого элемента используется полевой транзистор LR3714Z. Для вывода данных на ЖКИ используется 4-х битная шина, для коммутации подсветки используется транзистор FMMT717TA. Связь с ПК организована посредством радиоканала (RS232-Bluetooth HC05), либо преобразователя RS232-USB CP2102. Скорость передачи данных 9600 kbit/s. Фильтрация сетевого напряжения рассчитана на номинальную мощность ~650 Вт. Терминирование температурных датчиков DS18B20 необходимо производить в непосредственной близости от датчика. Для повышения надежности устройства использовался внешний супервайзер ADM690ANZ, отслеживающий тактирование МК и уровень питающего напряжения. Радиоканал реализован отдельным модулем, подключаемым на плату контроллера через 4 пиновый разъем. Присутствует всевозможная индикация (активность каналов, наличие питающих напряжений, тактирование МК, передача пакета данных).

Хотелось бы, конечно, использовать Wi-Fi подключение, с HTTP сервером. Но для этого необходимо иметь в распоряжении Ethernet MAC модуль, что тянет за собой также необходимость и DMA интерфейса, - а это уже задача не для AVR. Да и стоимость адекватного Wi-Fi модуля довольно высока. Не будем рассматривать цепочку из нескольких плат (об этом я писал вначале параграфа), или же дешевых китайских модулей, способных на все, но при этом отваливающихся каждые полчаса. И с ARM7TDMI на более свежую архитектуру все никак не осилю себя перейти. Да и смысл использовать ARM для такой задачи, где с лихвой хватает AVR. Только для Ethernet/Wi-Fi - не вижу смысла. В общем, это уже задача другого уровня. Для текущего автономного контроллера было принято решение ограничиться USB/Bluetooth и внешним супервайзером.

Для разработки устройства использовался программный продукт P-CAD 2006 SP2. Ниже приведена принципиальная схема устройства (кликабельно):


Печатная плата устройства была разработана под SMD-монтаж. Класс точности – 4. Используются корпуса TQFP44, QFN28, SOT23, TAN-A, TAN-B, SMA, 0805, 0603 и др. Плата имеет двухстороннюю реализацию. Общий вид печатной платы устройства приведен ниже (кликабельно):


Изготовление печатной платы было доверено китайским специалистам, ибо качество местных изготовителей оставляет желать лучшего. Какая именно фирма занималась производством платы уже сказать не смогу, т.к. заказывал я ее через товарища, к которому я просто «упал на хвост» во время его заказа, и отправил ему все необходимые файлы. Качеством «поднебесной» я был весьма впечатлен. Стоимость одной платы обошлась мне примерно в 20$. Так же очень порадовал предоставляемый сервис. Стоимость платы зависела от ее класса точности, размеров, и прочих заданных требований. В течение одного рабочего дня мой заказ был обработан, рассчитан и указана точная дата прибытия в мой город. В тот же день средства были уже переведены на их счет. И именно в указанный день мне пришло сообщение о доставки моей посылки. Обработка заказа, изготовление и доставка заняли чуть менее 2 недель. Ни один из отечественных производителей мне такое и близко не смог предложить (в рамках адекватной стоимости). Ниже приведено фото одной из полученных плат:

После напайки всех компонентов, прочистки ультразвуком от флюса и прошивки контроллера устройство приобрело следующий вид:

Для установки супервайзера предусмотрена 8-пиновая панелька. ADM690ANZ весьма чувствителен к флуктуациям питающего напряжения, и если у вас нет возможности установить качественный стабилизированный источник питания на 5В – лучше супервайзер не использовать. Иначе получите больше проблем, нежели пользы от его использования. Для переключения между USB и Bluetooth используется соответствующая перемычка.

Изначально, устройство планировалось устанавливать в крышку аквариума. Поэтому организация корпуса не предусмотрена. Однако, в дальнейшем, возможно, надобность в оном появится. Для отображения информации использовался 4-х строчный ЖКИ WH2004L-TMI-CTW, устанавливаемый на переднюю часть алюминиевой крышки. Во избежание наводок на индикатор, во время коммутации силовой нагрузки, сам индикатор необходимо изолировать от соприкасающихся металлических частей крышки, а шлейф, идущий от контроллера к экрану, - экранировать.

Ну и в завершении описания аппаратной составляющей ниже представлена фотография крышки аквариума. В ней установлен сам контроллер с ЖКИ, источник бесперебойного питания на 5В с аккумулятором, импульсный источник питания на 12В, 6 ЭПРА, плата усилителя для PH-электрода (основана на CA3140E), 2 80мм кулера и разъем для сетевого питания с простеньким входным фильтром.

Реализация связи с устройством

Основным каналом связи предусмотрен радиоканал Bluetooth (HC-05), USB-подключение – резервное. Устройство не имеет гальванической развязки между микроконтроллером и преобразователем уровней CP2102 (USART-USB). При подключении посредством USB необходимо убедиться, что источник электропитания, используемый для получения +5В, и питающее напряжение ПК включены в один узел электросети (розетку). В ином случае возможна некорректная работа устройства, выход из строя определенных элементов конструкции. Ниже приведена схема и печатная плата радиомодуля:

Программная реализация

Программное обеспечение состоит из 2 частей – низкого уровня (прошивка) и высокого уровня (программа для ПК). Для разработки низкоуровневой части использовался программный продукт WinAVR, версия компилятора GCC 4.3.3. Для организации управляющих подпрограмм был реализован диспетчера задач, основанный на автомате флагов. Было выделено несколько временных интервалов: 1 - 41ms, 2 - 167ms, 3 - 333ms, 4 - 1.34s, 5 - 2.67s, 6 - 10.6s. В первом временном интервале реализовано построчное отображение информации на ЖКИ. Во втором - опрос температурных датчиков (~ раз в 3 секунды), получение текущего времени, опрос АЦП и расчет значений электродов, с учетом калибровочных коэффициентов. В третьем временном интервале реализованы основные управляющие функции контроллера:

Обработка данных входящих пакетов;
- преобразование текущего времени в числовое значение (для удобства все временные значения в программе представлены в числовом виде HHMMSS);
- управление заданными каналами, в соответствии с выбранными режимами работы (раз в секунду);
- управление каналом PWM;
- обработка данных управляющих режимов (температурный режим, режим PH/CO2, режим вентиляции крышки, режим автодолива воды);
- установка ограничений временных интервалов (подсветка ЖКИ, работа кулеров и системы CO2);
- запись данных в EEPROM;
- анализ текущего состояния каждого из каналов, выбранных режимов с соответствующей индикацией;

Четвертый временной интервал - формирование тактового сигнала для супервайзера. В пятом интервале - отправка пакета данных о текущем состоянии датчиков, активности каналов и режимов управления, и др. информация для отображения в программе для ПК. Последний временной интервал используется для проверки состояния датчика уровня воды, при включенном режиме автодолива.

Проект состоит из нескольких файлов: main.c, hd44780.h, i2c.h, USART.h, Functions.h, ds18b20.c, delay.h, crc8.c. Библиотеки для работы с шиной 1-Wire были позаимствованы с открытого проекта на одном из немецких сайтов и переработаны под собственные нужды (убраны неиспользуемые функции и добавлено указание используемого порта и вывода МК для соответствующего датчика). Все остальные либы написаны с чистого листа.

Для отладки низкоуровневого программного обеспечения использовалось компьютерное моделирование устройства, посредством программного пакета Proteus 7.7 SP2. Ниже приведена собранная схема устройства:

Для разработки программного обеспечения высокого уровня использовался программный продукт Microsoft Visual Studio 2007. Основные возможности ПО представлены 4-мя закладками: отображение информации, режимы/события, ежедневные таймеры, калибровка электродов. Данные обновляются раз в 3 секунды. Для передачи данных используется метод транзакций. ПО отправляет пакет данных устройству, которое в свою очередь, после получения, отправляет принятый пакет обратно на ПК. Если отправленный и принятый пакеты совпадают - транзакция прошла успешно. Если же данные различаются, то текущий пакет данных отправляется заново. При многократном не совпадении отправленного и принятого пакета данных отображается ошибка соединения с устройством. Для передачи данных использовался строковый тип, что позволяет безошибочно определить начало/конец пакета, его тип и сами данные. Ниже представлен интерфейс программного обеспечения для ПК:

Полное описание работы программного обеспечения AquaController 2014 находится в справочных материалах, доступных через меню Помощь/Справка. Детальное описание устройства находится в файле «Техническое описание».

Примерная стоимость устройства, учитывая доставку комплектующих, ~100$

Это первая реализация проекта аквариумного контроллера. За более чем полгода не выявлено ни единого сбоя в его работе. Некоторые конструктивные и программные недочеты все же имеются, но этого пока недостаточно, для разработки следующего прототипа.

С учетом эксплуатации текущего контроллера, перечень того, что может быть дополнительно воплощено в последующем устройстве:

Аппаратная реализация на ARM Cortex;
- связь по Ethernet/Wi-Fi с организацией HTTP-сервера;
- наличие внешней клавиатуры для аварийного отключения или активации управляемых каналов;
- интеграция усилителя для PH и Redox электродов на плату контроллера;
- наличие управляемых каналов для светодиодной подсветки;
- управление дополнительными агрегатами (автокормушкой, системой подачи удобрения и прочее);
- увеличена номинальная мощность нагрузки;
- замена DS1307 на DS3231;
- возможность установки в один из стандартных корпусов.

Но пока это всего лишь планы на будущее, так как данный контроллер полностью удовлетворяет требованиям моего текущего аквариума.

Ниже загружена на github необходимая документация, программное обеспечение и исходники программ.

Собирая нано-банку уперся в вопрос отсутствия таймера включения-выключения света. Обзвонил магазины города и мне сказали, что в наличии нет и неизвестно когда будут. Обидно, однако.
Покопавшись дома среди железок, нашел электрический прибор от комаров с таймером и решил что это не плохая идея. Вот что получилось.

Для начала нам понадобятся:
1. Сам прибор. Я взял то что было, «Раптор».
2. Паяльник.
3. Канифоль и олово.
4. Кусачки.
5. Провод который идет к свету в крышке.

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

Просунем провод сквозь отверстия в нижней крышке и припаяем на плате вместо отсоединенных проводов.

Соберем крышку на место для безопасности и … и все. Можно использовать.

Теперь в назначенный час включаем прибор с помощью кнопочки на корпусе и 9-ть часов освещения вам обеспечено.
Чем хорош и чем плох:
1. Дешево и доступно.
2. Удобно если в вашем городе проблемно найти заводской таймер.
3. Свет включается и выключается в одно и то же время. Пример: включаем в 10.00 и он выключается в 19.00.
4. Включение производится только раз. Потом о приборе и его включении можно просто забыть. он сам включается и выключается в одно и то же время.
5. Неудобно то, что продолжительность освещения нельзя регулировать.
6. Неудобно и то что нельзя устраивать перерывы в освещении.
7. Если выключили свет в доме или вы выдернули прибор из розетки, то придется снова выставлять с утра.
8. Ну а большим плюсом является то, что собрать его сможет любой, не обладающий никакими знаниями об электричестве и таймерах.
К стати, если не умеете паять или нет паяльника, то можете отрезать провода от нагревательного элемента на большем расстоянии и вам останется их только прикрутить к проводам от освещения и за изолировать.
Думаю кому нибудь пригодится.
Удачи!

chesdenis 25 ноября 2015 в 13:02

Система автоматического управления аквариумом на Arduino

  • DIY или Сделай сам

Возникновение идеи создания аквариума

Так уж получилось, что я в основном занимался.NET программированием и изучил его в обход C++. Наверное, поэтому я так и не встретился с микросхемотехникой и микроконтроллерами, хотя желание познакомится с ними росло практически каждый год. Особенно, последние годы, когда я узнал про Arduino. Но надо было придумать ему практическое применение. И этот вопрос быстро решился.

В нашей комнате стоит аквариум, и каждый день нужно было лезть под стол и выключать рыбкам свет, а потом утром включать. Дополнительно рыбкам надо было включать обогреватель, когда им холодно, а выключать, когда им тепло. Иногда моя забывчивость приводила к гибели рыбок в аквариуме и приходилось покупать новых. Еще рыбкам нужно было периодически менять 2/3 воды. И для нашего аквариума эта процедура была очень долгой и неприятной.

Первым делом я посмотрел готовые решения по аквариумам. Их достаточно много. В основном это видеоролики на youtube. Также есть достаточно интересных статей на geektimes. Но для моей цели - изучение и знакомство с миром микросхемотехники, - это было слишком сложно, а подробного руководства «с нуля» в интернете не нашлось. Идею разработки аквариумного контроллера пришлось отложить до тех пор пока не будут изучены азы самой микроэлектроники.

Знакомство с микроэлектроникой

Я начал свой путь с готового набора для изучения Arduino. Наверное, каждый собирал нечто подобное, когда знакомился с данной платформой:

Обычная лампочка (светодиод), резистор на 220 Ом. Arduino управляет лампочкой по алгоритму на C++. Сразу оговорюсь, что купив любой готовый набор Arduino или его аналога нельзя собрать более-менее полезную вещь. Ну кроме пищалки или, скажем, домашнего термометра. Изучить саму платформу посредством уроков можно, но не более. Для полезных вещей придется мне пришлось освоить пайку, печатные платы, проектирование печатных плат и прочие прелести электроники.

Постройка своего первого прототипа аквариума

Итак, первое с чего я начал свой прототип аквариума - сформировал на бумаге требования к этому устройству.

Аквариум должен:

  1. Светиться утром, днем, вечером и ночью разными цветами;
  2. Включать рыбкам утром белый свет, днем яркость белого света увеличивать, вечером уменьшать (имитация дневного света) и ночью его выключать;
  3. Пузырьки воздуха(аквариумный компрессор) для рыбок должны появляться только вечером и выключаться ночью;
  4. Если рыбкам холодно, аквариум должен гореть синим цветом, если жарко то красным;
  5. Диапазоны температуры при выходе из которых должна срабатывать «световая сигнализация» должны быть настраиваемыми
  6. Аквариум должен всегда отображать дату и время;
  7. Время начала и конца промежутков дня должны быть настраиваемыми. К примеру, утро не всегда начинается в 9:00 AM;
  8. Аквариум должен отображать сведения о влажности воздуха и его температуре вне аквариума, а также выводить температуру воды внутри аквариума;
  9. Аквариум должен управляться с пульта.
  10. Экран с датой при нажатии на кнопку пульта должен подсвечиваться. Если в течении 5 секунд ничего не нажато, то гаснуть.
Я решил начать с изучения работы LCD и Arduino.

Создание главного меню. Работа с LCD

Для LCD я решил использовать библиотеку LiquidCrystal. Так совпало, что у меня в наборе помимо Arduino присутствовал LCD экран. Он мог выводить текст, цифры. Этого было достаточно и я приступил к изучению подключения данного экрана к Arduino. Основную информацию по подключению я брал отсюда . Там же есть примеры кода для вывода «Hello World».

Немного разобравшись с экраном я решил создать главное меню контроллера. Меню состояло из следующих пунктов:

  1. Основная информация;
  2. Настройка времени;
  3. Настройка даты;
  4. Температура;
  5. Климат;
  6. Подсветка;
  7. Устройства;
Каждый пункт это определенный режим вывода информации на текстовый экран LCD. Я хотел допустить возможность создания многоуровневого меню, где в каждом подуровне будут свои реализации вывода на экран.

Собственно, был написан базовый класс на C++, от которого будут наследоваться все остальные подменю.

Class qQuariumMode { protected: LiquidCrystal* LcdLink; public: // Чтобы экран не мерцал, была предусмотрена bool переменная isLcdUpdated. bool isLcdUpdated = false; // Выход из подменю или меню. void exit(); // Метод loop в каждом варианте подменю будет свой. Собственно, он и отвечает за вывод // текста на экран. Он будет вызываться из главного цикла программы контроллера. virtual void loop(); // Методы, которые помечены как virtual, будут переопределяться индивидуально в каждом // меню. virtual void OkClick(); virtual void CancelClick(); virtual void LeftClick(); virtual void RightClick(); };
К примеру, для меню «Устройства» реализация базового класса qQuariumMode будет выглядеть так:

#include "qQuariumMode.h" class qQuariumDevicesMode: public qQuariumMode { private: int deviceCategoryLastIndex = 4; //Варианты подменю в меню Устройства enum DeviceCategory { MainLight, // управление основным светом Aeration, // управление аэратором Compressor, // управление компрессором Vulcanius, // Управление вулканом Pump // Управление помпой }; DeviceCategory CurrentDeviceCategory = MainLight; char* headerDeviceCategoryText = NULL; // Ссылка на "драйвер", с помощью которого осуществляется управление устройством BaseOnOfDeviceHelper* GetDeviceHelper(); public: void loop(); void OkClick(); void CancelClick(); void LeftClick(); void RightClick(); };
Вот что получилось в результате реализации первого уровня меню:

Аппаратная часть. Нюансы подключения компонентов

Несколько слов хочется сказать про аппаратную часть аквариумного контроллера. Для нормальной работы контроллера мне пришлось приобрести:
  1. 1 x Arduino Uno/Mega. В последствии решил работать с Mego"ой;
  2. 1 x Часы реального времени, к примеру DS1307;
  3. 2 x Реле типа RTD14005, нужны для управления компрессором и аэрацией, т.к. оба работают от 220В переменного тока;
  4. 1 x Пьезопищалка;
  5. 1 x ИК приемник;
  6. 5 x Транзисторов IRF-530 MOSFET с N каналом. (3 для RGB ленты, 1 для белой ленты, 1 для водяной помпы);
  7. 1 x RGB светодиодная лента. Если планируется погружать светодиодную ленту в воду, то нужно ее изолировать от воды. У меня лента находится внутри силиконовой трубки и залита прозрачным герметиком;
  8. 1 x White светодиодная лента;
  9. 1 x LCD экран;
  10. 1 x Датчик температуры герметичный для измерения температуры воды. Я использовал DS18B20;
  11. 1 x Датчик температуры и влажности. Я использовал DHT11;
У каждого компонента свой тип подключения и свои драйверы для работы. Я не буду описывать нюансы подключения всех компонентов, так как их можно найти на сайте производителя или на форумах. Если вы планируете использовать те же компоненты, что и я - то менять исходный код вам не придется.

Порча компонентов

Будьте внимательны. Старайтесь сначала почитать про подключаемый компонент. Он должен эксплуатироваться именно в том диапазоне напряжения, для которого он был создан. Обычно это указано на сайте производителя. Пока я разрабатывал аквариумный контроллер, я уничтожил 2 герметичных датчика температуры и часы реального времени. Датчики вышли из строя из-за того, что я их подключил к 12В, а нужно было к 5В. Часы реального времени погибли из-за «случайного» короткого замыкания в цепи по моей вине.

Светодиодная лента RGB

Особые затруднения возникли со светодиодной лентов. Я попытался реализовать следующую схему:

При подключении к Arduino я использовал пины, которые поддерживают ШИМ (широтно-импульсную модуляцию). При одновременном включении на максимум напряжения всех 3 пинов у меня сильно грелась лента. В итоге, если оставить ее на час-другой, некоторые светодиоды переставали светиться. Я полагаю, что это происходило из-за выхода из строя некоторых резисторов. Еще один минус данной схемы - разная яркость светодиодной ленты для каждого из цветов. К примеру, если я ставлю максимальное напряжение на красном компоненте ленты, то я получаю условную яркость красной ленты в 255 единиц. Если я включаю одновременно красный и синий компоненты на максимум напряжения, то яркость будет равна 255+255 = 510 единиц, а цвет будет фиолетовым. В общем, такой вариант решения меня не устроил.

Было решено реализовать следующий алгоритм:

Void LedRgbHelper::Show(RGBColorHelper colorToShow) { // RGBColorHelper класс содержит сведения о доли каждого компонента в цвете. // Кроме того, содержит информацию о яркости цвета int sumColorParts = colorToShow.RedPart + colorToShow.GreenPart + colorToShow.BluePart; // доля каждого компонента в общем цвете float rK = 0; float gK = 0; float bK = 0; if (sumColorParts != 0) { float redPartAsFloat = (float)colorToShow.RedPart; float greenPartAsFloat = (float)colorToShow.GreenPart; float bluePartAsFloat = (float)colorToShow.BluePart; float sumColorPartsAsFloat = (float)sumColorParts; int brightness = colorToShow.Brightness; // определяем относительную яркость каждого компонента в цвете. rK = redPartAsFloat / sumColorPartsAsFloat; gK = greenPartAsFloat / sumColorPartsAsFloat; bK = bluePartAsFloat / sumColorPartsAsFloat; // определяем абсолютное значение компонента в цвете rK = rK*brightness; gK = gK*brightness; bK = bK*brightness; } uint8_t totalCParts = (uint8_t)rK + (uint8_t)gK + (uint8_t)bK; if (totalCParts <= 255){ // подаем напряжение на каждый компонент цвета. в сумме мы должны получить не более 255 единиц. analogWrite(RedPinNum, (uint8_t)rK); analogWrite(GreenPinNum, (uint8_t)gK); analogWrite(BluePinNum, (uint8_t)bK); } }
В таком варианте исполнения красный цвет и фиолетовый цвет имели одинаковую яркость. Т.е. красные светодиоды в первом случае светили с яркостью 255 единиц, а при фиолетовом цвете красный был с яркостью 127 единиц и синий с яркостью 127 единиц, что в итоге было приблизительно равно 255 единиц:

Светодиодная лента белая

Со светодиодной лентой наверное было проще всего. Единственный сложный момент - это обеспечение плавной смены яркости при смене времени суток.

Для реализации данной задумки я применил линейный алгоритм изменения яркости белой светодиодной ленты.

Void MainLightHelper::HandleState() { if (!IsFadeWasComplete) { unsigned long currentMillis = millis(); if (currentMillis - previousMillis > 50) { previousMillis = currentMillis; switch (CurrentLevel) { case MainLightHelper::Off: { // Если заявлено выключенное состояние, то снижаем яркость белого света на одну единицу за цикл. if (currentBright != 0) { if (currentBright > 0) { currentBright--; } else { currentBright++; } } else { // В случае полного выключения, останавливаем анимацию затухания белого цвета. currentBright = 0; IsFadeWasComplete = true; } break; } case MainLightHelper::Low: case MainLightHelper::Medium: case MainLightHelper::High: { // В случае установки уровня белого света, постепенно увеличиваем или уменьшаем яркость за один шаг цикла if (currentBright != CurrentLevel) { if (currentBright > CurrentLevel) { currentBright--; } else { currentBright++; } } else { currentBright = CurrentLevel; IsFadeWasComplete = true; } } break; } // подаем напряжение нужной величины для установки яркости белого цвета. analogWrite(PinNum, currentBright); } } }

Пульсация «вулкана»

Идея реализации пришла мне случайно. Я хотел просто включать и выключать декоративный вулкан с помощью подачи низкого напряжения и высокого напряжения на транзистор. В магазине для рыбок я присмотрел хороший вулкан с выводной трубкой для компрессора и светодиодом, изолированном от воды.

Он поставлялся с адаптером, на выходе которого 12В постоянного тока, а на входе - 220 В переменного. Адаптер мне оказался не нужен, так как управление питанием и яркостью вулкана я реализовал через Arduino.

Сама пульсация вулкана была реализована следующим образом:

Long time = 0; int periode = 10000; void VulcanusHelper::HandleState() { if (IsActive){ // time - аргумент cos в связке с указанным периодом. // остальные коэффициенты - деформация функции и смещение по оси ординат time = millis(); int value = 160 + 95 * cos(2 * PI / periode*time); analogWrite(PinNum, value); } else { analogWrite(PinNum, 0); } }
Вулкан отлично подсвечивает аквариум в вечернее время, а сама пульсация смотрится очень красиво:

Помпа. Замена воды в аквариуме

Водяная помпа помагает быстро поменять воду в аквариуме. Я приобрел помпу, которая работает от постоянного тока 12В. Управление помпой осуществляется через полевой транзистор. Сам драйвер для устройства умеет две вещи: включить помпу, выключить помпу. При реализации драйвера я просто унаследовался от базового класса BaseOnOfDeviceHelper и ничего дополнительно в драйвере не определял. Весь алгоритм работы устройства вполне может реализовать базовый класс.

Помпу протестировал на стенде:

Хотя помпа работала нормально, я наткнулся на одну неочевидную вещь. Если выкачивать воду в другой резервуар, то начнет действовать закон сообщающихся сосудов. В результате я стал виновником потопа в комнате, потому как если выключить помпу - вода все равно будет идти в другой резервуар, в случае если его уровень воды находится ниже уровня воды в аквариуме. В моем случае именно так и было.

Инфракрасный порт и желание его заменить

Управление аквариумом через инфракрасный порт я осуществил по примеру предварительного обучения. Суть примера в следующем: при включении контроллера в сеть я опрашиваю поочередно действия left, right, up, down, ok. Пользователь сам выбирает, какие кнопки пульта он привязывает к каждому из действий. Плюс данной реализации - возможность привязать любой ненужный пульт дистанционного управления.
Обучается аквариум через метод Learn, суть которого отображена ниже:

Void ButtonHandler::Learn(IRrecv* irrecvLink, LiquidCrystal* lcdLink) { // Инициализируем прием инфракрасного сигнала с датчика irrecvLink->enableIRIn(); // В эту переменную помещаются результаты декодирования сигнала decode_results irDecodeResults; ... ... while (true) { // Если пришли результаты и их можно декодировать if (irrecvLink->decode(&irDecodeResults)) { // продолжаем принимать сигналы irrecvLink->resume(); // Пробуем декодировать сигнал с пульта. if (irDecodeResults.bits >= 16 && irDecodeResults.value != 0xC53A9966// fix for Pioneer DVD) { lcdLink->setCursor(0, 1); // Выводим на экран декодированное значение в формате HEX lcdLink->print(irDecodeResults.value, HEX); // Запоминаем в оперативной памяти Arduino полученный сигнал irRemoteButtonId = irDecodeResults.value; ... ...
В дальнейшем я пришел к выводу, что пульт дистанционного управления это неудобно. Просто потому что его надо искать и это лишнее устройство в доме. Лучше управление реализовать посредством мобильного телефона или планшета. У меня зародилась идея использовать микрокомпьютер Raspberry PI, поднять на ней ASP.NET MVC 5 веб-приложение через Mono и NancyFX. Далее использовать фреймворк jquery mobile для кроссплатформенности веб-приложения. Через Raspberry общаться с Arduino посредством WiFi, или LAN. В этом случае можно даже отказаться от LCD экрана, ведь всю нужную информацию можно посмотреть на смартфоне или планшете. Но этот проект пока только в голове.

Печатная плата и ее изготовление

Так или иначе я пришел к тому, что надо изготавливать печатную плату. Произошло это после того, как на моем стенде появилось такое количество проводов, что при сборке готового устройства часть из них стала отключаться от случайного надавливания других проводов. Это происходит незаметно для глаз и может привести к непонятным результатам. Да и внешний вид такого устройства оставлял желать лучшего.

Сборка на монтажных платах(используется Arduino Uno):

Я разработал однослойную печатную плату в программе Fritzing. Получилось следующее(используется Arduino Mega):

Самое противное при изготовлении печатной платы это было сверление. Особенно когда я старался создать печатную плату типа Shield, т.е. она одевалась на Arduino. Просверлить тонким сверлом больше 50 отверстий - это очень нудное занятие. А самое сложное - это забрать у жены ее новый утюг и уговорить купить лазерный принтер.

Кстати, если кто боится лазерно-утюжной технологии, то сразу скажу - это очень просто. У меня получилось с первого раза:

Сама сборка тоже оказалось простой - достаточно было припаять основные компоненты на плату:

Но не смотря на это, я первый и последний раз создавал печатную плату в домашних условиях. В дальнейшем буду заказывать только на заводе. И скорее всего придется освоить что-то потяжелее чем Fritzing.