Однажды мне захотелось сделать не робота и не игрушку а что-либо полезное в домашнем хозяйстве. Контроллер Ардуино, подключенный через модули реле способен управлять даже высоковольтными проводами.
Этот факт натолкнул меня на мысль создать «умный удлиннитель» — эдакий блок розеток, позволяющий включать и выключать отдельные розетки (а значит и электроприборы, включенные в них) на расстоянии, при помощи пульта дистанционного управления. Итак, поехали!
Список необходимых деталей со ссылками для заказа:
Контроллер Arduino Nano
Для уменьшения размера конструкции, а также с целью удешевления конструкции был выбран именно Nano. Чтобы по неосторожности не испортить контроллер, заказал Arduino Nano сразу с припаянными ногами. Цена 2,49$ плюс 1.68$ доставка
Реле
Модули реле заказал по цене 0.53$ за штуку, плюс доставка 1.39$ за пакет.
Нужно заказать столько штук, сколько розеток надо подключить. В моём случае две.
ИК-пульт с приёмником
Модуль приёмника инфракрасного пульта и сам пульт в одном лоте заказал по цене 0,78$ плюс 1,8$ за доставку. В комплекте есть три соединительных провода и запасной фотодиод. Пульт питается от батарейки CR2025, но в комплект батарейка не входит! Купите батарейку отдельно!
Была мысль использовать вместо инфракрасного пульта пульт-радиопередатчик со своим модулем-радиоприёмником, но во-первых он дороже, во-вторых, сложнее в подключении. А главное — я собирался в будущем использовать несколько таких удлиннителей в разных комнатах квартиры. И в этом случае нажатый радио-пульт в одной комнате включал бы розетки во всех комнатах квартиры! Конечно таких случайностей допускать нельзя.
Дополнительно
Я не стал учитывать стоимость соединительных проводов. Поштучно они не продаются, но есть разные наборы по разным ценам, а для сборки этого устройства понадобится гораздо меньше чем целый набор. Тем более всегда есть способ сэкономить и приколхозить свои провода!
Также у меня в настоящий момент нет в наличии модулей питания, преобразующих 220 вольт в необходимые для Ардуино 5 вольт. Поэтому на первое время я решил питать всю схему при помощи обычной зарядки для смартфона, через гнездо Micro-USB. Соответственно, и цену модуля питания в первой версии статьи я не учитываю.
Ну и пока не включал цену самих розеток и силовых проводов, необходимых для сборки самого удлиннителя. Их стоимость в магазинах вашего города может отличаться, да и опять же, под рукой могут найтись и старые.
Общие расходы
Общая стоимость деталей — 4,33$, доставки — 4,87$
Итого вместе с доставкой – 9,2$.
Подключение
Подключал я по следующей схеме. Провода чёрного цвета — земля, красного — +5вольт, жёлтые провода — сигнальные. Справа от контроллера — приёмник ИК-пульта, слева — реле.
Внимательно читайте надписи на контактах при подключении компонентов! Расположение контактов на ваших модулях может отличаться
Все компоненты питаются от одних и тех же проводов земля и +5вольт. Сигнальные провода реле нужно подключать к цифровым ногам 3 и 13, приёмник пульта — к 12.
ВНИМАНИЕ!
После полевых испытаний на схеме обнаружилась ОШИБКА! Плюсовой провод на плате нужно подключать к Ардуино не на ногу VIN а на ногу 5V!
Галерея
Скетч
const int rele1 = 3; // Реле подключены на ноги 3 и 13
const int rele2 = 13;
int RECV_PIN = 12; // Приёмник ИК-пульта подключен на ногу 12
#include <IRremote.h>
long i= 0;
int pos1= 0; // Начальные положения обеих релюшек — выключено
int pos2= 0;
IRrecv irrecv(RECV_PIN); //Создаем объект получения сигнала с определенного порта
decode_results results; //Переменная, хранящая результат
void setup()
{
pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Начинаем прием ИК-сигналов
digitalWrite(rele1, HIGH); // Выключаем релюшки
digitalWrite(rele2, HIGH);
}
void loop()
{
if (irrecv.decode(&results)) //При получении сигнала…
{
i=results.value;
Serial.println(i);
if (i == 16738455) //…Сработало первое реле
{
Serial.println(«Подошло 1»);
if (pos1 == 0)
{
pos1=1;
digitalWrite(rele1, LOW);
}
else
{
pos1=0;
digitalWrite(rele1, HIGH);
}
}
if (i == 16750695) //…Сработало второе реле
{
Serial.println(«Подошло 2»);
if (pos2 == 0)
{
pos2=1;
digitalWrite(rele2, LOW);
}
else
{
pos2=0;
digitalWrite(rele2, HIGH);
}
}
irrecv.resume(); // Получаем следующее значение
}
}