Таймер
Сегодня расскажу, как сделать таймер на несколько каналов своими руками. В основе таймера лежит Arduino и шилд с часами реального времени DS3231. Кому интересно, прошу под кат.
Предыстория:
В один прекрасный день я заметил, что потёк мой маленький аквариум. Потёк по шву снизу. Так как покупал я его, чтобы набраться опыта, то решено было не пытаться чинить, а купить нормальный большой аквариум. После недолгих поисков я купил нормальный аквариум через интернет магазин (в офф-лайн магазинах подобный аквариум стоил на 2-3 тыс. дороже). Пока обустраивал аквариум, пока запускал его, выяснилась одна отрицательная черта. Лампы в аквариуме светили слишком ярко. Для рыб и растений они, конечно, работали нормально, но аквариум находился в спальне (а стоит зима с поздними рассветами!) — свечение от ламп по утрам заливало комнату и мешало моим домочадцам наслаждаться объятиями Морфея. Поначалу я подумал просто выставить
таймер, который остался у меня от прошлого аквариума, на другое время, но в этом случае приходилось кормить рыб вечером, что меня не устраивало.
Второй мыслью было поставить ещё один таймер и светодиодную ленту, но, подумав немного, решил собрать таймер сам, так как все компоненты имелись в наличии.
Первоначально таймер хотел строить по следующей схеме:
Блок питания 5В — Arduino – часы DS3231 –шилд реле. Но от этой схемы отказался практически сразу. Причин было несколько:
1) по затратам сборка подобного таймера сопоставима с таймером, купленном в магазине
2) бездарно пропадает вычислительная мощь компонентов.
3) много времени уйдет на постройку таймера
Если говорить простым языком, то если и собирать таймер, то с такими функциями, которых нет в обычных таймерах, иначе вообще нет смысла браться за подобную затею.
Так, цель ясна. Теперь, как нас давно учили в институте на основах научно технического творчества, подменяем одну функцию устройства на другую. По большому счёту, функций у нас не так много:
1) Включение/выключение света
2) Управление
3) Количество каналов регулирования светом
4) Другие функции (цвет, размер, дизайн… на ум больше ничего не приходит)
Начнём с конца списка.
— Количество каналов – можно подключать разные каналы в разные моменты времени, тем самым делая освещённость аквариума ярче или темнее.
— Управление таймером не самая важная функция. Так как таймер строится по принципу «работать долго и автономно без всякого вмешательства», то функция управления носит второстепенный характер. То есть один раз запрограммировать, и таймер работает. Конечно, функцию перепрограммирования нужно оставить, чтобы в случае чего подправить времена вкл/выкл.
— Теперь про функцию включения света. А почему бы не сделать включение света плавным, как в диммерах. Для этого практически все есть в Arduino, небольшая обвязка в виде силовых цепей и полноценный диммер-канал готов.
Ну вот, теперь более или менее вырисовывается таймер, который я хочу сделать. В связи с тем, что в новом аквариуме стоят люминесцентные лампы, то управлять ими приходится через реле, а вот светодиодными лентами я буду управлять Arduino, через ШИМ.
Вот схема, по которой я собирал таймер
Немного пояснений к схеме.
С левой части Arduino у неё есть три канала:
— на цифровых выходах (D3, D5) – ШИМ управляют светодиодными лентами HL1, HL2.
— цифровой выход D7 управляет реле, которое коммутирует 220В (люминесцентные лампы).
В качестве питания я использовал
блок питания на 12В, 1А . Не помню, для чего и когда я его покупал в офф-лайне, но подошел он в корпус идеально. Питание на Arduino я брал с преобразователя LM2596M (настроил его на 5В), хотя на самом деле, как я сейчас понимаю, можно было ограничиться «кренкой» на 5В и конденсатором.
Часы DS3231 подключаются к стандартным портам SDA(A4) и SCL(А5). Первоначально в планах были задуманы три кнопки, которые цепляются к аналоговому входу А0, но в дальнейшем пришлось от них отказаться по причине нехватки места в корпусе (об этом напишу позже). Кнопками задумывалось управлять следующими функциями:
1) Все каналы включить
2) Все каналы выключить
3) Установка времени часам (например, в субботу в 12:00, если вдруг часы будут сильно убегать).
По схеме, вроде, все понятно. Ещё немного времени уделю каналам и перейду к реализации.
С каналом, который управляет реле, сложностей не возникло. Схема типовая, транзистор подойдёт любой, который может коммутировать токи от 100 мА.
С каналами, которые управляют светодиодными лентами, пришлось повозиться. Вся загвоздка была в выборе силового транзистора. Он должен обеспечивать коммутацию токов до 1А, при этом падение напряжения на нем должно быть минимальным, иначе он будет греться, а нагрев нам ни к чему. Для испытаний был собран стенд на макетной плате, где я тестировал транзисторы, которые нашёл у себя в рабочем столе. В идеале, можно было бы взять что-то типа IRFZ44N, но для сборки таймера решил использовать по максимуму компоненты, которые у меня уже были в наличии. В столе нашёл несколько полевиков NDP7060. По даташиту у него сопротивление канала при очень большом токе составляло всего 0,013 Ом. На испытаниях он вообще не нагрелся. Было решено ставить их в схему.
Перед сборкой таймера нужно было сначала выбрать корпус, чтобы на основе его проектировать другие компоненты системы. Поход по электронным магазинам показал, что выбор есть, но цены одного корпуса сопоставимы с ценой готового таймера. И тут я вспомнил, что когда делал свою
метеостанцию, то я заказывал пару корпусов. После непродолжительных поисков в квартире, в которой идёт ремонт, корпус был найден. Все бы хорошо, но размеры его были маловаты. Я уже хотел отказаться от этого корпуса, но потом решил собирать все компоненты в корпусе по частям. То есть будет несколько плат, а соединяться они будут проводами. Минус этого метода — большое количество проводов и сложность в отладке. Плюс – маленькие размеры.
Вот такой корпус я решил использовать
Немного опишу основные компоненты.
Arduino mini
На муське много обзоров данной платы. Я покупаю ее дешевизны (около 100 руб.) и малого размера. Все основные интерфейсы у нее присутствуют, следовательно, нет смысла переплачивать тройную цену за Arduino Uno или Arduino nano. Единственный минус — это необходимость использования внешнего преобразователя USB – COM. Но покупка подобного преобразователя с платой обойдется все равно дешевле, чем большая плата.
Немного фотографий Arduino nano
Часы реального времени DS3231
Почему я выбрал именно этот RTC, а не DS1307??? Да потому что имею печальный опыт использования DS1307 в своей
метеостанции и больше с ними связываться не хочу. В прошлый раз мне в комментариях написали, что лучше было использовать DS3231, вместо DS1307, так как в DS3231 встроенный кварц и термостабилизация. Еще одной особенность платы DS3231 — это ее высокая точность хода.
Заказывал часы давно, а вот испытать пришлось их недавно. Не обошлось, конечно, без ложки дегтя, хотя об этом чуть ниже.
Пришли часы в обычном конверте
Внутри в слое пупырки лежали часы в антистатическом пакете
С одной стороны была распаяна угловая линейка контактов
Батарейки не было, так как почте Китая и Гонконга запретили к пересылке литиевые батарейки. В часах используется стандартная батарейка CR2032.
Линейку контактов пришлось выпаять и припаять не угловую с другой стороны.
Корпус
В корпусе было решено сделать розетку, чтобы в нее можно было вставить вилку от освещения аквариума. Данное решение заметно уменьшает полезный объем корпуса, в котором можно разместить электронику, но я хотел создать максимально универсальное устройство.
Розетку взял обычную встраиваемую (у меня осталась от ремонта).
Выкручиваем среднюю часть. Выкидываем окантовку. С одной стороны пришлось обрезать каркас розетки, чтобы розетка вплотную встала в корпус.
В корпусе прикладываем розетку, карандашом намечаем отверстие
Здесь на фотографии видно, что я уже пристроил плату от блока питания 220/12В.
Далее дрелью делал много отверстий по намеченному контуру и крупным напильником дорабатывал основное отверстие. Прикручиваем основу розетки, а к ней сверху винтом центральную накладку.
Вот что получилось
На последней фотографии видно, что на центральной накладке есть два углубления. Не знаю, для чего они (кстати, с другой стороны есть аналогичные вырезы). Это, конечно, портит немного эстетический вид, но я решил не заморачиваться с поиском герметика в цвет розетки, чтобы заделать эти вырезы.
Далее проектирование самой схемы. После того, как я собрал все основные компоненты, я попробовал примерить, как они сидят в корпусе. Оказалось, все печально. Нужно было делать минимум 2 платы.
В Sprint-Layout примерял различные компоненты. В итоге, скомпоновал две платы:
Изготовил платы путем травления фольгированного текстолита в хлорном железе.
Платы с установленными компонентами
Все компоненты в корпусе
Как видно на фотографиях, корпус забит под завязку, проводов много. Долезть до какого-либо компонента проблематично, а порой и просто невозможно.
Вот так выглядит собранный таймер
При проектирование плат допустил несколько ошибок.
1) не развел линию сброса для программатора. Раньше у меня был преобразователь USB – COM, который имел 4 выхода VCC, TX, RX, GND. Для программирования я тогда просто нажимал сброс на Arduino, и программа нормально заливалась. Сейчас купил нормальный преобразователь USB – COM, но про остальные линии забыл. В результате, пришлось на Arduino припаивать угловой контакт и выводить соединяющий провод из корпуса. После программирования и удачного тестирования этот провод можно просто выдернуть из корпуса.
2) не учёл ширину направляющих внутри корпуса. В результате, пришлось ставить коннекторы меньшего размера или вообще без корпуса.
Первое включение.
Включил в сеть, внутри загорелась куча лампочек. Светодиод на Arduino заморгал (который висит на D13). Попытался залить свою программу мигания светодиодом – все прошло успешно.
Дальше пошло обычное программирование. После этого я решил закрыть корпус, ведь вроде все работало. Закрыл, пытаюсь загрузить программу – ничего не выходит. Раскручиваю корпус, подключаю питание. Питающий светодиод на Arduino горит, но как-то слабо. Пытаюсь еще раз залить программу, ничего не выходит. После долгих поисков (основную мою работу никто не отменял), я нашел, что провода, которые подходят к основному блоку питания, натянулись и не обеспечивали надежный контакт на плате. По-простому говоря, я просто выдавил крышкой эти провода. После восстановления контакта (хорошо пропаял) и нормальной укладки провода, Ardiuno не заработала. Пришлось ее вытаскивать и подключать к макетке. Что я с ней только не делал, но оживить ее не смог. В итоге, просто взял новую Arduino.
Программирование продвигалось нормально до того момента, когда нужно было подключать RTC. Как я писал раньше, без ложки дегтя не обошлось. Заливаю стандартную программу опроса часов, а программа никаких данных не присылает. Что за фигня??? Начинаю пробовать все демонстрационные программы, которые идут в комплекте со средой разработки Arduino. В результате программа висит. Ладно. Загружаю программу сканер I2C. Она по-любому должна выдать два адреса, так как в шилде RTC на шине I2C висят часы DS3231 и память 24С32. И программа виснет на первом адресе. Опять разбираю свое устройство. На макетке подключаю Arduino к RTC, еще раз пробую заливать разные программы – результат нулевой. Начинаю экспериментировать с проводками I2C (SDA и SCL). При отключении провода SDA все программы начинают работать, но естественно, по шине ничего не предают. То ли я попалил шилд, когда Arduino питался от информационных цепей, то ли он был уже бракованный, я теперь не знаю. На тот момент я отложил устройство на неопределенный срок, так как в наличии свободного модуля RTC у меня не было, а заказанные уже давно три модуля RTC застряли между Китаем и Россией. Через недельку, когда прошли уже все разумные и не разумные сроки прихода посылки с тремя модулями RTC, я решил поковыряться в существующем RTC (все равно он нерабочий). Я подумал, что если не работает шина I2C, то, возможно, одно из устройств (память или часы) просто коротят SDA. И если это устройство выпаять, то другое должно заработать. По началу, решил выпаять память (она мне не нужна была). Шанс того, что шилд заработает, 50/50. Взял фен с тонкой насадкой, прогрел память и аккуратно пинцетом удалил микросхему.
Подключаю Arduino к RTC на макетке, заливаю программу сканер I2C – часы откликаются на адресе 0х68. Пробую задать время, часы нормально идут, без признаков отставания. Значит, во всем была виновата память 24С32.
Собираю все опять в корпус и начинаю писать основную программу таймера.
Вскоре была написана основная версия программы. Но в связи с тем, что процессы, которыми управляет таймер, слишком растянуты во времени, то и отладка программы заняла очень много времени.
Описание программы:
Вначале инициализирую массивы, в которые заношу время включения/выключения каналов, а также время работы диммеров. Для рабочих и выходных дней массивы разные.
В теле программы один раз в минуту текущее время сравнивается со временем из массивов. Происходит определение, к какому интервалу принадлежит текущее время, и в зависимости от этого интервала выполняется определенное действие (вкл/выкл основного канала освещения или диммера).
Информацию для отладки выводим в СОМ порт. Вот пример лога (здесь для отладки я использовал интервалы 5 минут, чтобы оценить, как будут переключаться каналы)
Немного пояснений. Вначале показываю время, потом номер интервала, следом состояние каналов.
Вроде, все написал, кроме испытаний в боевых условиях, то есть на аквариуме.
Для аквариума я взял две светодиодные ленты. Концы лент тщательно герметизировал с помощью термоусадки. Ленты прикрепил рядом с основными лампами, а провода аккуратно вывел в тумбочку под аквариумом.
На последней фотографии виден синий провод. Пока оставил его для программирования.
Первое включение было в 20:30 в воскресенье.
В 21:00 отработало переключение основных ламп на светодиодные ленты.
В 21:20 отработал первый диммер на выключение (лента плавно гасла в течение четырех минут).
Потом в 21:30 отработал второй диммер на выключение (вторая лента также гасла в течение четырех минут).
Вроде, программа отлично отработала, но не тут-то было. В понедельник утром в назначенное время 6:15 светодиодная лента не включилась. Отвел ребенка в школу и выяснил, что лента включилась в 8 часов и отработала программу за выходной день. После просмотра кода я понял, что когда задавал время, то выставил неправильный день недели. Плюс ко всему, жена раскритиковала расписание. Мои аргументы, что раньше в то же время включался свет в маленьком аквариуме, ее не убедили.
В итоге, пришлось корректировать расписание и задавать точное время. На раннее утро оставил всего одну светодиодную ленту. Вторая лента включается намного позже, а основной свет — в 9:00.
В принципе, это все, что хотел написать. Сначала планировал снять видео, но решил, что смотреть 4 минуты, как гаснет светодиодная лента, не слишком увлекательно :-).
Код программы выложил на
Яндекс.диск.
Устройство отработало больше недели. Функционал устройства меня полностью устраивает. За время работы были отключения света в квартире, таймер отработал штатно по заданному алгоритму.
Плюсы и минусы, думаю, не стоит описывать, так объективно мне сложно дать оценку своему устройству.
А Arduino nano (http://arduino.cc/en/Main/arduinoBoardNano) имеет на борту преобразователь USB-COM. И по стоимости pro mini + преобразователь примерно равны стоимости nano. По размерам mini, конечно, чуток поменьше.
Я как человек ленивый таки бы схему сделал проще, на unl2003 модуле
выходы можно параллельно включать получаем тот же 1а, и для реле даже диод не нужен.
спасибо за обзор, было интересно.
www.apiskomplekt.ru/katalog.php?lvl=21.3
искать в электротоварах.
Сам недавно купил ардуинку и обвес разный, пока только светодиодами мигаю и сенсоры изучаю. надеюсь запала хватит на что то большее.
во сколько обошлась полная комплектация таймера? 1500… 2000р… или 3000р?
(конролеры — блоки питания — реле -программаторы — корпуса — платы)
.
что-то мне кажется что это просто хобби(когда на цену уже не смотрят главное сделать)
не о какой экономии тут нет и речи (если сравнить с заводским таймером)
.
собрал ты всё аккуратно что радует
P.S.S
я бы всёже добавил модуль контроля внешнего света…
чтобы освещение не включалось когда его достаточно
P.S.
светодиодные ленты в силиконе под крышкой аквариума очень быстро выходят из строя (расслаиваются)
RTC DS3231 — 4.3$
LM2596 — 1.24$
корпус — около 10$
БП — 4,29$
провода, клеммы, транзисторы, платы, резисторы и т.д. — бесплатно :)
итого 23,5$ (примерно 750 руб.)
Что имеем в наличии:
— коробка, которая заменяет три таймера. по размерам коробка соизмерима с размерами заводского таймера.
— три канала управления. В теории можно расширить количество каналов.
— плавное включение и выключение каналов.
Можно ли купить три заводских таймера с похожими функциями за 24$ ???
Я свой старый таймер покупал за 13$
провода, клеммы, транзисторы, платы, резисторы и т.д. — бесплатно :)это хорошо что есть в заначке:)… но если нет… то
пара полевиков каждый по 140-270р
+ изготовление платы
и если не ошибся вы покупали два комплекта контролеров… что уже не 4$
плюс ещё преобразователь интерфейса… от 300р
.
от сюда следует что ну не как в 750р тут не впишешся :((
кстати заводские устройства что ты ранее использовал имеют графический дисплей и им не нужен ПК для смены программы
.
всёже считаю что это в даном случии хобби :)
обзор и описание процесса сборки и наладки конечно отличный !!
(кстати ты случаем ещё гдето на специлизированых форумах не пишешь про свои сборки устройств ?)
P.S.
я в своё время купил на скидках INTERSTEP SP 206 за 460р
(два независимых таймера + зарядка 5а\2А) очень удобно
(хотя он и дорогой если без скидок брать)
Взять ходовой IRFZ44 — 25 руб за штуку.
Изготовление платы: 60 руб. за хлорное железо, которое хватит на изготовление с сотню таких плат + 100 руб за кусок фольгированного текстолита, который в 2-3 раза превышает размеры плат.
Два комплекта контроллеров… да, моя вина, но опять же, у меня есть шанс восстановить сломанный. Друг выдвинул идею, что потерлись фьюзы. Нужен параллельный программатор, чтобы восстановить их. Если все сложится, то восстановлю ардуинку.
Преобразователь интерфейса стоит 4,42$ и к тому же, он не для этого проекта покупался.
Если покупать все с нуля, то думаю в 1000 руб. уложиться можно.
Я писал в обзоре, что ввод программы, для таймера функция вторичная. Я практически уверен, что на 99% больше не буду менять программу в своем новом устройстве, как и не менял ее на прошлом заводском таймере (программировал один раз при запуске).
А я и не говорил, что штампую подобные устройства для продажи :). Любые самоделки, это хобби. Просто у некоторых хобби — это поморгать светодиодом на ардуине и закинуть все это электронное барахло в ящик, другие находят более рациональное применение этим вещам.
Хоть и ни буя не понял, букафф многа.
Меня максимум на что хватило, так это дома редуктора на ГВС и ХВС дома запилить. (не электроника голая механика)
ЗЫ люто плюсую.
А еще можно вот такое оптоэлектронное реле применить, управляется логическими уровнями, токи сами выбирайте.
Транзисторы — для ленты вполне хватит IRLML2502, IRLML0030 — управляются логическими уровнями а токи тянут вполне нормальные, места занимают крайне мало.
И еще — появилась вот такая интересная ардуина Цены у китайцев на них очень вкусные :-)
Параллельный программатор не нужен. Нужен для начала стандартный последовательный программатор ISP, его можно сделать из модуля USB-COM если он собран на микросхеме FT232.
Вот статья easyelectronics.ru/skorostnoj-avr-usb-programmator-na-ft232rl-bez-vspomogatelnogo-kontrollera.html хотя, если фьюзы слетели начисто то да, нужен параллельный.
Ух, сколько написал… А хотел просто "+" поставить :-)
По поводу транзисторов и оптоэлектронного реле. Возможно они лучше, но я собирал из деталей, которые были в наличии, чтобы минимизировать свои затраты.
Ардуино понравилась, взял на заметку.
Было бы интересно заменить всю подсветку в аквариуме вот на такие штуки тогда и яркость можно плавно регулировать и безопаснее, в виду отсутствия 220В и крышка аквариума легче будет.
спасибо.
Я только причины трудов этих не уловил:
Мои рыбы ложатся спать и встают вместе с хозяевами. Два раза в сутки щелкнуть выключателем — дело нехитрое. Что я делаю не так?
Я же написал, что аквариум стоит в спальне. Я встаю рано, жена еще спит. Включать с утра основной свет аквариума, равносильно включить в спальне основное освещение.
Жена в дикретном отпуске, и ее подъем с утра зависит от того, как проснется ребенок. Перекладывать на нее обязанности включения света и кормление рыб я не хочу.
А если допустим задержаться в гостях, то кто у вас будет выключать свет в аквариуме?
Спать я ложусь несколько позже того времени, когда можно вернуться откуда-то, даже задержавшись. Рыбы привыкли уже. Более того, если ночью-вечером выключить свет в аквариуме, но оставить в комнате, они пытаются стенки аквариумные лбами вынести :) Что-то им не так в этом случае.
Из серии обзоров, которые почитаешь — поумнеешь.
Жаль только, что опусы в виде «купила труселя, фото на мне» у местной аудитории в большем почёте.
Даешь автоматическую кормушку рыбок? ;-)
или еще хуже — уехать в отпуск на неделю, то кто же будет их кормить? Просить соседа или родсвенника — не выход.
Если уезжать в отпуск, то все равно приходиться просить родственников присмотреть за кошкой, цветами и рыбками
Оффтоп
Есть задача сделать хронометраж для автосоревнований (автослалом, кольцевые гонки), с возможностью засекать два таймера с точностью до сотых долей секунды от двух пар фотоэелементов (либо ИК датчиков), с передачей результатов на компьютер. На чем лучше это все собрать? Достаточно ли самой платы, или дополнительные модули надо ставить? В общем буду признателен знающим людям чтобы направили в нужное русло.
Если этот вывод завести на прерывание и в обработчике прерывания считать импульсы, то можно достичь определенной точности.
Если выставить частоту 4096Гц и активировать выход 32к в момент старта, то точность отсчета можно достичь 1/4 мс (ваш диапазон перекрывается в 40 раз).
Кстати, разводку часов проверяли на соответствие рекомендациям Далласа? Мои (на DS1307) уходят на пару минут в месяц. Дешевый кварц, разводка, как мне удобнее… И вот результат.
На модуле 1307, внешний кварц, там нет термостабилизации, отсюда такой результат. В микросхеме DS3231 кварц встроенный и термостабилизация присутствует, следовательно разводка платы, не сильно влияет на ход часов(я бы сказал, что совсем не влияет). За все время (чуть больше 2 недель) часы идут точно, ну может быть есть расхождение +0,5 сек. Если подсчитать, то часы за год будут иметь максимум расхождения 24 секунды. Меня такой параметр более чем устраивает.
например как на Tiny RTC I2C