Меню

Ардуино розетка с таймером

Записки программиста

Собираем крафтовую розетку с таймером на базе Arduino

22 декабря 2017

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

Важно! Работа с переменным током высокого напряжения смертельно опасна. Если вы решите повторять действия, описанные далее, будьте предельно осторожны.

Примечание: Пользуясь случаем, я хотел бы поблагодарить пользователей форума EasyElectronics.ru с никами STT, BusMaster и Кот495 за то, что проконсультировали меня о некоторых нюансах работы с переменным током.

Спрашивается, зачем делать свое устройство, если можно просто купить готовое?

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

Свою розетку с таймером я собрал из следующих компонентов:

  • Клон Arduino Nano с разъемом Micro USB (2.82$);
  • Китайский экранчик 1602 с I2C адаптером (1.75$);
  • Роторный энкодер (0.52$);
  • Реле с двумя контактными наборами RT424005 (3.07$);
  • Две пары разъемов XT60 (0.66$);
  • Ненужное зарядное устройство с USB-выходом (0.00$);
  • Повербанк, полученный бесплатно на конференции (0.00$);
  • Некоторое количество проводов, термоусадок, двустороннего скотча, болтов и гаек M3, кусок макетки, и прочая мелочь (0.00$);

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

Повербанк тоже валялся без дела. Если лишнего повербанка у вас нет, вместо него можно воспользоваться Li-Ion аккумулятором форм-фактора 18650 в сочетании с платой на базе чипа TP4056 и каким-нибудь повышающим DC/DC преобразователем на ваш выбор. Как использовать эти компоненты ранее было подробно рассказано в заметке Паяем крафтовый повербанк с солнечной панелью. Вообще-то говоря, не всякий повербанк способен заряжаться от сети и одновременно заряжать подключенное к нему устройство. Поэтому в общем случае использовать аккумулятор, TP4056 и повышающий преобразователь DC/DC будет более правильно.

Отмечу также, что повербанк нужен исключительно для того, чтобы часы на устройстве не сбрасывались при отключении электричества в доме. Если для вас это не является проблемой (например, есть ИБП), то можно обойтись и без повербанка.

Названные компоненты были помещены в корпус и соединены таким образом:

Корпус я спроектировал во FreeCAD и распечатал на 3D-принтере RepRap Prusa i3 пластиком PLA. Высчитывать с точностью до миллиметра, где должны находится отверстия для крепления экранчика, мне было лень. Поэтому эти отверстия я просверлил дрелью уже после того, как корпус был напечатан. Разъемы XT60 были закреплены с помощью термоклея.

Заметьте, что реле впаяно в макетку. Так сделано по той причине, что ножки у реле очень хрупкие, и если припаяться к ним напрямую, они быстро отломаются (я проверял!). Если вы решите использовать другое реле, убедитесь, что оно рассчитано на достаточно большой ток, хотя бы 8 А. Проверьте также, что выбранное вами реле является моностабильным. То есть, при пропадании питания на катушке реле должно автоматически разрывать цепь.

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

Софтверная часть не представляет очень уж большого интереса, тем более, что я не сильно заморачивался с качеством кода. Использование экранчиков 1602 с I2C интерфейсом ранее подробно рассматривалось в заметке Об использовании экранчиков 1602 с I2C-адаптером. Что же касается части кода, отвечающей за время, она в существенной части была позаимствована из проекта часов на микроконтроллере ATmega328P. Действительно новым для нас здесь является разве что работа с роторным энкодером, поэтому ее и рассмотрим.

Читайте также:  Розетки для интернета сат 3

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

Как видите, сигнал достаточно просто декодировать. Если по фронту сигнала с контакта A на контакте B сигнал высокий или по спаду сигнала с контакта A на контакте B сигнал низкий, значит пользователь вращает ручку по часовой стрелке. Если же наоборот, по фронту сигнала с контакта A на контакте B сигнал низкий, а по спаду — высокий, значит ручка вращается против часовой стрелки.

Как это часто бывает в мире Arduino, декодирование сигнала от энкодера уже реализовано в библиотеке Rotary. Пример ее использования:

Rotary rot ( 3 , 2 ) ;

// rotory interrupt
PCICR | = ( 1 PCIE2 ) ;
PCMSK2 | = ( 1 PCINT18 ) | ( 1 PCINT19 ) ;
sei ( ) ;
>

ISR ( PCINT2_vect ) <
unsigned char result = rot. process ( ) ;
if ( result == DIR_NONE ) <
// do nothing
> else if ( result == DIR_CW ) <
/* do something . */
> else if ( result == DIR_CCW ) <
/* do something else . */
>
>

В окончательном виде получившееся устройство выглядит так:

Конечно же, на ум приходит множество возможных улучшений. Например, можно добавить функцию управления по Bluetooth или же при помощи SMS. Не помешало бы также вывести на корпус индикацию процесса зарядки и текущего состояния аккумулятора. Где-нибудь сбоку стоило бы добавить кнопку полного отключения, например, на случай длительной транспортировки устройства. Возможность отключения подсветки экранчика была бы не лишней, так как подсветка довольно яркая и может, помимо прочего, мешать спать. Часы на кварцевом резонаторе не слишком точны, раз в пару месяцев их приходится подводить. В связи с этим стоит рассмотреть использование внешних часов реального времени. Ну и в целом получившаяся конструкция довольно громоздка, уродлива и сложна для повторения, не говоря уже о том, что микроконтроллер подошел бы и более простой, например, ATtiny2313. Так что, не лишено смысла сделать нормальную плату.

Как обычно, исходники прошивки и STL-файлы корпуса вы найдете на GitHub.

А что вы думаете об описанном проекте и какие идеи по его улучшению есть у вас?

Источник

Урок 39. Реле времени: управление устройствами по таймеру

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

Каждый из четырёх каналов нашего реле времени может выдавать не только логические уровни (1/0 — вкл/выкл), но и сигналы ШИМ (включать приборы на определённую мощность).

В реле времени имеется 20 таймеров (их количество можно уменьшить или увеличить до 128, указав нужное число в строке 16 скетча). Один таймер включает только одно устройство (канал) на заданный промежуток времени, не влияя на работу остальных устройств (каналов). Каждому устройству (каналу) можно назначить несколько таймеров, следовательно, включать и выключать каждое из устройств можно несколько раз в сутки и на разную мощность. При отключении питания, таймеры реле не сбиваются, так как их настройки хранятся в энергонезависимой памяти Arduino. Текущее время также не сбивается, так как оно берётся из модуля часов реального времени, который снабжен батарейкой.

Реле времени можно использовать для включения освещения по времени в доме, квартире, на даче, на производстве и т.д. Можно использовать для включения по времени вентиляции, котлов, обогревателей, полива газонов, систем очистки дачных бассейнов и т.д. Еще одним преимуществом реле времени является создание эффекта присутствия, например, Вас нет дома, но свет утром и вечером включается, а днём и ночью выключается, утром включается радио или телевизор, а ночью включается ночник. Это может заставить задуматься нежелательных «гостей», что дом обитаем и делать там нечего.

Нам понадобится:

  • Arduino Uno х 1шт.
  • Дисплей LCD1602 I2C зелёный или синий x 1шт.
  • Trema I2C HUB прямоугольный или квадратный x 1шт.
  • Trema модуль — RTC (часы реального времени) x 1шт.
  • Trema модуль — энкодер x 1шт.
  • Trema Shield x 1шт.

Для реализации проекта нам необходимо установить библиотеки:

  • LiquidCrystal_I2C для работы с символьными ЖК дисплеями.
  • iarduino_Encoder_tmr для работы с энкодерами через аппаратный таймер.
  • iarduino_RTC для работы с модулями реального времени.
  • Библиотеки EEPROM, Wire и pgmspace используемые в скетче, входят в стандартный набор Arduino IDE.
Читайте также:  Niessen телефонная розетка подключение

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE .

Видео:

Схема подключения:

Trema модуль RTC и дисплей LCD1602 I2C подключаются к аппаратной шине I2C через Trema I2C HUB, а Trema энкодер можно подключать к любым (цифровым или аналоговым) выводам Arduino, их номера указываются в скетче (в примере использованы выводы D4, D7 и D8). Для удобства подключения используется Trema Shield.

Приборы подключаются к каналам 1-4:
  • Маломощные приборы с питанием 5 В постоянного тока до 20 мА можно подключать напрямую к одному из каналов.
  • Приборы с питанием до 30 В постоянного тока подключаются через силовой ключ.
  • Приборы с питанием от сети 220 В переменного тока подключаются через твердотельное или электромеханическое реле.

Алгоритм работы:

Режим просмотра времени: При включении питания на индикаторе отображается текущее время, дата и день недели. Номера включённых каналов отображаются в правом верхнем углу дисплея.

Меню: Для входа в меню нужно нажать на энкодер. Далее поворачивая экодер вправо или влево можно выбрать разделы «ТАЙМЕРЫ», «ЧАСЫ», «ВЫХОД», для входа в требуемый раздел нужно опять нажать на энкодер.

Меню>часы: В данном разделе меню, поворачивая энкодер вправо или влево, можно выбрать разделы «ВРЕМЯ», «ДАТА», «ВЫХОД», для входа в требуемый раздел нужно нажать на энкодер.

Меню>часы>время: Этот раздел меню предназначен для установки текущего времени. Устанавливаемый в данный момент параметр времени (часы, минуты, секунды) должен мигать. Выбор значения осуществляется поворотом энкодера, а переход к следующему значению, нажатием на энкодер.

Меню>часы>дата: Этот раздел меню предназначен для установки текущей даты и дня недели. Устанавливаемый в данный момент параметр даты (день, месяц, год, день недели) должен мигать. Выбор значения осуществляется поворотом энкодера, а переход к следующему значению, нажатием на энкодер.

Меню>таймеры: В данном разделе меню, поворачивая энкодер вправо или влево, можно выбрать один из установленных таймеров (для их редактирования) или разделы «НОВЫЙ ТАЙМЕР», «СТЕРЕТЬ ВСЕ ТАЙМЕРЫ», «ВЫХОД», для входа в требуемый раздел нужно нажать на энкодер. Установленные таймеры отображаются в виде строки из времени их старта/сброса и номера канала «00:00-00:00-0».

Меню>таймеры>новый таймер: Выбор данного раздела приведёт к созданию нового таймера, на экране отобразится надпись «НОВЫЙ ТАЙМЕР СОЗДАН» после чего Вам будет предложено ввести время старта/сброса и указать номер канала (который будет включаться данным таймером). Данный раздел меню недоступен если установлены все таймеры.

Меню>таймеры>стереть все таймеры: Выбор данного раздела приведёт к удалению всех таймеров, на экране отобразится надпись «ВСЕ ТАЙМЕРЫ УДАЛЕНЫ». Данный раздел меню недоступен если нет ни одного установленного таймера.

Меню>таймеры>00:00-00:00-0: Вместо «00:00-00:00-0» будет строка из времени старта/сброса таймера и номера канала которым он управляет. Данный раздел меню предназначен для редактирования выбранного таймера, поворачивая энкодер вправо или влево, можно выбрать разделы «ВРЕМЯ И КАНАЛ», «ПОВТОРЫ», «УРОВЕНЬ СИГНАЛА», «СТЕРЕТЬ ТАЙМЕР», «ВЫХОД», для входа в требуемый раздел нужно нажать на энкодер.

Меню>таймеры>00:00-00:00-0>время и канал: Этот раздел меню предназначен для установки (редактирования) времени старта/сброса таймера и номера канала которым он управляет. Устанавливаемый в данный момент параметр (час старта, минута старта, час сброса, минута сброса, номер канала) должен мигать. Выбор значения осуществляется поворотом энкодера, а переход к следующему значению, нажатием на энкодер.

Меню>таймеры>00:00-00:00-0>повторы: Этот раздел меню предназначен для установки (редактирования) повторов таймера по дням недели, в которые он должен срабатывать. Под устанавливаемым в данный момент параметром (ПН, ВТ, СР, ЧТ, ПТ, СБ, ВС) должен мигать курсор. Поворот энкодера устанавливает или сбрасывает стрелочку под устанавливаемым параметром, если она установлена значит в этот день недели таймер будет срабатывать, иначе он срабатывать не будет. Переход к следующему дню недели осуществляется нажатием на энкодер.

Меню>таймеры>00:00-00:00-0>уровень сигнала: Этот раздел меню предназначен для установки (редактирования) уровня сигнала на выбранном канале при срабатывании таймера. Выбор уровня сигнала от 5% до 100% осуществляется поворотом энкодера с шагом 5%, а нажатие на энкодер приведёт к выходу из данного раздела.

Меню>таймеры>00:00-00:00-0>стереть таймер: Выбор данного раздела приведёт к удалению выбранного таймера, на экране отобразится надпись «ТАЙМЕР УДАЛЕН».

Примеры:

Создание таймера который по будням, между 18:00 и 20:00, будет включать 4 канал с уровнем сигнала 100%:
  • Нажмите на энкодер для входа в меню.
  • Поворачивайте энкодер пока не увидите раздел «ТАЙМЕРЫ» и войдите в него нажав на энкодер.
  • Поворачивайте энкодер пока не увидите раздел «НОВЫЙ ТАЙМЕР» и войдите в него нажав на энкодер.
  • Введите «18:00-20:00 к4». Выбор значений осуществляется поворотом энкодера, а переход к следующему — нажатием.
  • Поворачивайте энкодер пока не увидите раздел «ПОВТОРЫ» и войдите в него нажав на энкодер.
  • Установите галочки под «ПН, ВТ,СР,ЧТ,ПТ» . Установка осуществляется поворотом энкодера, а переход — нажатием.
  • Поворачивайте энкодер пока не увидите раздел «УРОВЕНЬ СИГНАЛА» и войдите в него нажав на энкодер.
  • Установите значение «100%». Выбор значения осуществляется поворотом энкодера, а установка — нажатием.
  • Поворачивайте энкодер пока не увидите раздел «ВЫХОД» и выйдите из редактирования таймера нажав на энкодер.
  • Поворачивайте энкодер пока не увидите раздел «ВЫХОД» и выйдите из раздела «ТАЙМЕРЫ» нажав на энкодер.
  • Поворачивайте энкодер пока не увидите раздел «ВЫХОД» и выйдите из «МЕНЮ» нажав на энкодер.
Читайте также:  Купе проводников есть розетка

Теперь на экране отображается текущее время, дата и день недели, а по будням, с 18:00 до 20:00 в правом верхнем углу экрана будет отображаться цифра 4, при этом на 4 канале будет установлен уровень логической «1» (сигнал ШИМ со 100% заполнением). На остальных каналах будет уровень логического «0».

Создание таймера который между 19:00 и 21:00 каждого дня, будет включать 3 канал с уровнем сигнала 50%:
    Повторите все шаги из предыдущего примера, но:
  • Вместо «18:00-20:00 к4» введите «19:00-21:00 к3» .
  • Вместо «ПН, ВТ, СР, ЧТ, ПТ» установите галочки под всеми днями недели «ПН, ВТ, СР, ЧТ, ПТ, СБ, ВС».
  • Вместо «100%» установите уровень сигнала «50%».

После того как Вы установите два таймера (из 1 и 2 примера): По будням с 18:00 до 19:00 в правом верхнем углу экрана будет отображаться цифра 4, при этом на 4 канале будет установлен уровень логической 1 (сигнал ШИМ со 100% заполнением). По будням с 19:00 до 20:00 в правом верхнем углу экрана будет отображаться цифра 3 и 4, при этом на 3 канале будет установлен сигнал ШИМ с 50% заполнением, а на 4 канале будет установлен уровень логической «1» (сигнал ШИМ со 100% заполнением). По будням с 20:00 до 21:00 и в выходные с 19:00 до 21:00, в правом верхнем углу экрана будет отображаться цифра 3, при этом на 3 канале будет установлен сигнал ШИМ с 50% заполнением.

Примечание:

Включение и выключение устройств осуществляется по установленным таймерам только в режиме просмотра времени. Это сделано для того, чтобы устройства «случайно» не включились во время редактирования текущей даты, времени или таймера.

Код программы:

Библиотека iarduino_Encoder_tmr использует второй аппаратный таймер, НЕ ВЫВОДИТЕ СИГНАЛЫ ШИМ НА 3 ИЛИ 11 ВЫВОД!

Источник



Digitrode

цифровая электроника вычислительная техника встраиваемые системы

«Умная» розетка на основе Arduino своими руками

Данный проект позволит вам самостоятельно собрать «умную» розетку, управляемую с компьютера. Основу такой розетки составляют популярная плата Arduino Uno и твердотельное реле.

В первую очередь нужно собрать приведенную ниже схему твердотельного реле на основе оптопары MOC3041 и некоторыми дополнительными компонентами. MOC3041 представляет собой простой недорогой оптрон со светодиодом и фотодиодом. Затем подключите плату Arduino к разъему J1 собранного силового переключателя. Для управления реле мы задействуем линию ввода/вывода D12. Входные разъемы J2 будут представлять собой непосредственно розетку для подключения высокого напряжения 220 В переменного тока, а к разъемам J3 будет подключаться нагрузка, в данном случае лампа. Внимание: будьте предельно осторожны при работе с сетевым напряжением! При контакте с незащищенной кожей оно может вызвать непоправимые повреждения, ожоги или даже летальный случай!

Теперь подключите плату Arduino Uno к вашему компьютеру через порт USB, скопируйте нижеприведенный код в Arduino IDE и загрузите его в Arduino. Этот скетч довольно прост. Он считывает через последовательный порт символ в ASCII-кодировке и меняет логическое состояние линии D12/ При получении «1» линия D12 переходит в высокое логическое состояние (реле замыкается), при «2» в низкое (реле размыкается).

Плата Arduino Uno спроектирована таким образом, что у программного обеспечения имеется возможность сброса этой платы, когда она соединена с компьютером. Одна из линий аппаратного управления потоком данных (DTR) на ATmega8U2 подключена к линии сброса ATmega328 через конденсатор 100 нф. Когда на этой линии появляется низкий логический уровень, микросхема сбрасывается. Программное обеспечение использует эту функцию, чтобы вы могли программировать Arduino по одному нажатию кнопки в Arduino IDE. Но здесь есть некоторые неприятные для нас моменты — плата сбрасывается каждый раз, когда она подключается программно к компьютеру. К счастью, на Arduino Uno есть дорожка RESET-EN, перерезав которую можно отключить автоперезапуск. Чтобы снова включить его, достаточно просто запаять контактные площадки этой дорожки.

В качестве альтернативы аппаратному решению проблемы с автосбросом можно воспользоваться программными решениями. Например, установить терминал HTERM или попробовать гугловский монитор последовательной передачи данных Chrome Browser Serial Port Monitor.

Источник