Аквариумный контроллер своими руками. Таймер розеточный механический. Светодиодная лента RGB

Для Андроид 07.04.2019
Для Андроид

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

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

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

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

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

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

Таймер для аквариума – гаджет, который используется в аквариумистике уже довольно давно. Данное устройство (его называют также «реле времени») автоматизирует некоторые процессы и значительно облегчает жизнь аквариумистов.

Разновидности

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

Механический таймер.

Точнее будет называть такие устройства электромеханическими. Они имеют низкую стоимость и просты в настройке. Конструктивно представляет собой евророзетку с регулятором. Если таймер становится не нужен, можно передвинуть рычажок на корпусе, и он превратится в обычную розетку. В таком таймере время выставляется поворотом циферблата на корпусе. Одно деление на шкале обычно равняется 30 минутам. Недостатки механических таймеров: возможность программирования только на сутки, при пропадании электричества таймер иногда сбивается, некоторые модели громко тикают как старый будильник.

Электронный таймер.

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

Начнем с банального и самого простого: — «Как часто нужен таймер в аквариумистике? Как его лучше использовать?»

Таймер сам включит или выключит тот или иной прибор.
Например, включит утром свет в аквариуме, а вечером выключит.
Включит компрессор для подачи воздуха или электроклапан для подачи СО2 (углекислого газа) в нужное нам время.

Представим ситуацию с освещением – нам нужно рано утром на работу или учебу, а за окном ещё темно, включив резко свет в аквариуме мы можем вызвать «тихую» панику в среде аквариумных обитателей.
Желательно светильник в аквариуме включать, когда дневной свет от окна, заполнит комнату и рыбки уже проснутся. А как это можно сделать в зимние дни, когда светает поздно, а мы уже давно ушли из дома на работу\учебу? Или допустим вечером пошли в кинотеатр, или на спектакль, засиделись в гостях — кто выключит свет в аквариуме без нашего участия? Уезжаем на дачу, или в отпуск, кто будет включать и выключать свет в аквариуме?

Все знают, что аквариум, это природная среда и свет в нём должен соответствовать правильному световому дню (8-12 часов освещения). При этом необходимо избежать либо постоянно включенного или выключенного светильника.

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

Имея сразу несколько таймеров, упрощаем задачу ещё больше.
Второй таймер будет отвечать за работу компрессора. В нужное время включит и выключит его. В некоторых аквариумах, при определенном количестве рыб и растений, аэрация требуется круглосуточной. Работая без перерыва многие компрессоры, быстро выходят из строя, выработав весь свой ресурс. Таймер можно запрограммировать так, что в течение суток он сможет давать отдых компрессору. Например – три часа в сутки, в разное время, через каждые 7 часов работы. Очень удобно. Вариант: компрессор отдыхает с 12 ч. до 13 ч., потом с 20 ч. до 21, потом с 4 ч. до 5 ч.

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

Таймер для аквариума (своими руками)

В аквариуме постоянно нужно поддерживать определенные параметры, обеспечивающие благоприятное существование рыб. Такие показатели, как температура воды и освещенность можно регулировать при помощи фотореле и термостатов. Но, для обеспечения периодичности кормления рыб в аквариуме и насыщения воды кислородом при помощи аэратора требуется таймер. Кроме того, требуется кормушка специальной конструкции, позволяющей автоматически точно дозировать количество корма в аквариуме.
Кинематическая схема кормушки аквариума приводится на рисунке 1. Контейнер, в который засыпается некоторый запас корма представляет собой трубу, установленную на коробчатом основании. В противоположных стенках этого основания сделаны круглые отверстия по диаметру трубы — контейнера. Отверстия смещены относительно друг друга на величину собственного диаметра трубы.
Внутри коробчатого основания с минимальным зазором размещен дозатор корма (или плашка), способная перемещаться в продольном направлении. В ней сделано отверстие по диаметру трубы-контейнера. Толщина плашки (а так же и толщина внутреннего пространства коробчатого основания) выбрана так, чтобы объем цилиндрической емкости (камеры), образованной отверстием в дозаторе был равен объему одноразовой порции корма, — суточной норме для рыб в аквариуме.
Работает кормушка следующим образом. В исходном состоянии дозатор находится в таком положении, как показано на рис. 1. То есть, его камера находится непосредственно под контейнером для заполнения сыпающимся вниз кормом. Теперь, если привести плашку в движение согласно направлению, показанному на рис. 1 стрелкой, то заполненное кормом камера переместиться влево и окажется над отверстием для выхода корма, которое сделано в нижней стенке коробчатого основания, через которое содержимое камеры высыпается в аквариум.
Затем, дозатор перемещается обратно и её уже пустая камера снова заполняется кормом. Таким образом, получается своеобразная шлюзовая система, в которой роль шлюзовой камеры выполняет камера в дозаторе.
Теперь о «сопутствующих деталях» таймера.
Для перемещения дозатора используется электромагнит с рычагом — толкателем. Положение опоры выбрано так, чтобы хода нижнего конца толкателя было достаточно для необходимого перемещения плашки, при котором камера в дозаторе перемещается от отверстия под контейнером и становится над отверстием для выхода корма. Для возврата плашки в исходное положение, после выключения электромагнита, служит возвратная пружина, действующая на сжатие.

Принципиальная схема таймера показана на рисунке 2.
Таймер управляет кормушкой и аэратором аквариума. Периодичность кормления рыб в аквариуме выбрана 24 часа, а периодичность работы аэратора — 2,5 часа. Эти параметры заданы «жесткой логикой» и в процессе эксплуатации не регулируются.
Таймер выполнен по цифровой схеме из тактового мультивибратора и многоразрядного двоичного счетчика. Частота тактового генератора 32768 Гц стабилизирована часовым кварцевым резонатором Q1. Конденсаторы С1 и С2 служат для подстройки частоты этого мультивибратоpa в небольших пределах с целью калибровки точности хода таймера.
Импульсы с выхода мультивибратора на микросхеме D1 поступают на счетчик, составленный из трех микросхем К561ИЕ16. На микросхеме D3 выполнен предварительный делитель на 16384, на выходе которого (выв. 3) образуются импульсы с периодом в 0,5 секунды.
Далее следует схема из последовательно включенных счетчиков D4 и D5, счет которых схемой «монтажное ИЛИ» на диодах VD3-VD7 ограничен до 172800. Что соответствует 24-м часам. То есть, через 24 часа после начала работы на резисторе R3 возникает импульс, который устанавливает все счетчики таймера на нулевую отметку.
Этот же импульс устанавливает RS-триггер D2.3-D2.4 в единичное состояние. Высокий логический уровень с выхода D2.3 поступает на ключ на VT1, который включает реле К1. А это реле, в свою очередь, подает питание на электромагнит автоматической кормушки. Спустя полсекунды на выводе 9 D4 возникает единица, которая возвращает триггер в нулевое положение и, тем самым, выключает электромагнит кормушки.
Так повторяется каждые 24 часа. Для периодического включения аэратора используются импульсы с вывода 7 D5 следующие с периодом около 2,5 часа. Эти импульсы периодически открывают ключ на VT2, а он посредством К2 включает питание аэратора.
Питается схема таймера аквариума от универсального источника. В гнездо Х1 включается источник постоянного тока напряжением 12-14V (можно использовать сетевой адаптер от старого принтера или сканера). А резервная батарея G1 служит на случай отключения электричества. В этом случае, от неё питаются только микросхемы, но не обмотки реле. Разделяют цепи питания диоды VD1 и VD2.
Происходит это так: в нормальном режиме напряжение на Х1 поступает от источника и составляет 12-14V, что больше номинального напряжения батареи G1. Поэтому диод VD1 закрыт, a VD2 открыт и питание происходит только от сетевого источника. Если сетевой источник таймера отключить (или отключилась электросеть), то напряжение на конденсаторах С3 и С4 начинает медленно падать и спустя некоторое время становится ниже чем напряжение G1. Диод VD2 закрывается, a VD1 открывается и начинается питание микросхем от G1.
Кнопка S1 служит для сброса таймера на начало отсчета. Её рекомендуется нажать после включения таймера. А включить таймер нужно в то время, когда обычно происходит кормление рыб в аквариуме. После этого каждые сутки кормление будет происходить именно в это время.
В таймере в качестве электромагнитных реле К1 и К2 используются реле КУЦ-1 от систем дистанционного управления старых отечественных телевизоров. Можно использовать и другие реле с обмоткой на 12V.
Электромагнит кормушки сделан из тягового реле стартера автомобиля ВАЗ. Катушка электромагнита перемотана. Вся старая обмотка, выполненная толстым проводом удалена, а вместо неё намотана новая, тонким проводом ПЭВ 0,12 до заполнения каркаса.
Электромагнит питается непосредственно от электросети. При намотке катушки нужно если не мотать виток к витку, то хотя бы равномерно распределяя намоточный провод. Концы обмотки нужно вывести с разных сторон каркаса и обеспечить надлежащее изолирование.
Рычаг-толкатель и опору можно так же использовать от этого же тягового реле. Недостаток такого электромагнита в его большой массе и избыточной силе, а так же необходимости перемотки. Поэтому его можно заменить каким-то более подходящим, если это возможно. Корпус основания выполнен из фанеры,
дозатор — ламинированная ДСП,
трубчатый контейнер можно сделать из отрезка пластиковой водопроводной трубы.
Все размеры зависят от объема одноразовой порции корма. Пружина от тягового реле стартера.

Схема данного контроллера для аквариума обеспечивает контроль температуры воды и управление освещением, по заданному временному графику. В контроллере аквариума предусмотрено также и ручное управление (включение/выключение) фильтра и компрессора.

Это особенно полезно во время чистки аквариума, не нужно выдергивать шнур фильтра из розетки, а можно просто нажать кнопку на контроллере.

Описание аквариумного контроллера

Аквариумный контроллер построен на микроконтроллере PIC16F677. Прошивка, скорее всего, должна подойти и для микроконтроллеров более высокого уровня из этой группы. Работа схемы была проверена и на микроконтроллере PIC16F690. Измерение температуры обеспечивает цифровой температурный датчик DS18B20 с разрешением 0,5 гр. Цельсия.

Отсчет времени организован с помощью микросхемы DS1302 – контроллера реального времени. В случае отключения электроэнергии, к 8 ножке DS1302 (вывод резервного питания) подключен конденсатор C8. Его емкости хватает более чем на 3 дня для того чтобы не произошел сброс времени.

Все управление осуществляется четырьмя кнопками: «СВЕТ» (S) «ОБОГРЕВ» (Т) «КОМПРЕССОР» (V) и «ФИЛЬТР» (F). Короткое нажатие будет включать/выключать соответствующий канал. Возможно переключение между ручным и автоматическим режимом управления. Это относится только к освещению и обогреву. Включение/ выключение компрессора и фильтра осуществляется только в ручном режиме. Обогрев в автоматическом режиме удерживает необходимую заданную температуру воды в аквариуме.

Управление освещением: первое нажатие включает свет, второе отключает, треть переводит управление освещением в автоматический режим. Для установки времени включения/выключения света, необходимо нажать кнопку (S) и удерживать ее более 4 секунд.

Сначала устанавливается время включения. Короткими нажатиями кнопки (S) происходит переход от одного разряда индикатора к другому, значение каждого можно менять кнопками V (+) и F (-). Далее, продолжительным нажатием кнопки (S) значение сохраняется и происходит переход в настройки времени выключения. Здесь порядок настройки такой же. Еще одним долгим нажатием происходит переход в исходное состояние.

Установка температуры практически такое же. Продолжительное нажатие кнопки (Т) позволяет перейти в режим установки необходимой температуры воды в аквариуме. Изменение величины с шагом 0,5 гр. Цельсия осуществляется кнопками V (+) и F (-). После установки продолжительное нажатие кнопки (Т) переводит контроллер в основной режим.

Установка значения реального времени осуществляется одновременным и продолжительным нажатием двух кнопок (S) и (T). Далее все то же самое, как и при настройке освещения. Все значения хранятся в EEPROM, и при отключении питания нет необходимости все заново настраивать.

Индикация состояния каждого канала – графическая. Каждый канал обозначается своей буквой: «СВЕТ» (S) «ОБОГРЕВ» (Т) «КОМПРЕССОР» (V) и «ФИЛЬТР» (F). Если буква на экране заглавная, то это означает, что канал включен, если же прописная, то выключен.

Еще под каждым из выше перечисленных каналов прописывается либо буква А (автоматический режим — automatic) либо буква М (ручной режим – manual). Так же на индикатор выводится дата, время и фактическая температура воды в аквариуме.

Для удобства силовая часть контроллера сделана отдельно и подключена к основной плате TP-проводом с разъемом RJ-45. Трансформатор для блока питания подойдет любой с выходом на вторичной обмотке — 9 В и токе не менее 400 мА.

(скачено: 465)

http://www.tosi.cz/elektro/akvarium.html

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

Предпосылки для создания контроллера весьма банальны - был приобретен аквариум на 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 необходимая документация, программное обеспечение и исходники программ.

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.



Рекомендуем почитать

Наверх