Схема управления освещением с любого ИК-пульта реализована следующим образом:
- При нажатии на кнопку ИК-пульта, он отправляет пакет закодированных и промодулированных данных на ИК-светодиод, а при удержании кнопки, еще и пакеты повтора.
- Невидимый инфракрасный свет от ИК-светодиода попадает на Trima-модуль ИК-приёмник, где преобразуются в демодулированные электрические импульсы.
- Библиотека iarduino_IR постоянно считывает и раскодирует импульсы с ИК-приёмника (используя второй аппаратный таймер Arduino)
- В коде loop мы сверяем раскодированные библиотекой данные с назначенными устройству (лампе) и если они совпали, то меняем состояние («1»/«0») на входе Trema-модуля Твердотельное реле, следовательно, включаем или выключаем устройство (лампу).
Устройство может быть полезным, если назначить неиспользуемые кнопки телевизионного пульта (например цветные кнопки телетекста) для управления освещением в комнате.
Вместо ламп накаливания, Вы можете подключить любое устройство сети ~220 В, с током потребления до 2 А.
Нам понадобится:
- Arduino х 1шт.
- ИК-пульт дистанционного управления x 1шт. (подойдёт любой телевизионный ИК-пульт)
- Trema-модуль ИК-приёмник х 1шт.
- Trema-модуль Твердотельное реле х 3шт.
- Trema Shield х 1шт.
- Устройства (лампы), которыми мы будем управлять х 3шт.
Для реализации проекта нам необходимо установить библиотеку:
- Библиотека iarduino_IR для работы с ИК-приёмопередатчиками
ВАЖНО: библиотека использует второй аппаратный таймер,
НЕ ВЫВОДИТЕ СИГНАЛЫ ШИМ НА 3 ИЛИ 11 ВЫВОД!
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE.
Видео:
Схема подключения:
В данной схеме используются только цифровые модули, их можно подключать к любым (как цифровым так и аналоговым) выводам Arduino. Для примера, мы подключили все модули к аналоговым выводам. Не все знают, что аналоговые выводы Arduino могут работать как обычные цифровые выводы, позволяющие получать (от ИК-приёмника) и передавать (на твердотельные реле) цифровые сигналы в виде логических «0» и «1».
Если Вы будете подключать устройства к другим выводам, то их номера нужно указать во второй (объявление объекта IR) и третей (объявление массива pinRelay) строках скетча. Код программы написан так, что вы можете подключить столько реле, сколько есть свободных выводов у вашей Arduino, просто перечислив номера выводов в третей строке скетча (объявление массива pinRelay).
Не устанавливайте Trema-модуль ИК-приёмник рядом с источниками яркого света. Он может препятствовать приёму слабого инфракрасного света от ИК-пульта.
Алгоритм работы:
- При старте, скетч последовательно назначает код кнопки ИК-пульта каждому твердотельному реле. Сначала мигает светодиод и замыкается цепь твердотельного реле вывод которого указан первым. Если нажать на любую кнопку ИК-пульта, то код данной кнопки присвоится этому реле и начнет мигать следующее, и так, пока всем реле не будут назначены кнопки ИК-пульта.
- После назначения кнопок, все реле находятся в выключенном состоянии. Если нажать кнопку ИК-пульта, то включится реле которому присвоен код данной кнопки. Если повторно нажать на указанную кнопку, то реле выключится. Устройство не отреагирует на нажатие кнопок, код которых не присваивался ни одному реле.
- Если Вы не хотите присваивать коды кнопок при каждом старте, то явно укажите их при объявлении массива varRelay, а из кода setup удалите циклы for и while.
- Узнать код каждой кнопки можно написав следующую строку: if(IR.check()){Serial.println(IR.data);}
Код программы:
#include <iarduino_IR_RX.h> // подключаем библиотеку для работы с ИК приёмником iarduino_IR_RX IR(A5); // объявляем объект IR для работы с ИК приёмником (с указанием любого вывода к которому подключён ИК приёмник) const uint8_t pinRelay[] = {A1,A2,A3}; // объявляем массив с указанием номеров любых выводов (цифровых или аналоговых) к которым подключены твердотельные реле const uint8_t allRelay = sizeof(pinRelay); // объявляем константу передавая её количество элементов в массиве pinRelay (количество реле) uint32_t varRelay[allRelay]; // объявляем массив с кодами (командами) ИК-приёмника включающими реле bool modRelay[allRelay]; // объявляем массив с состояниями реле uint8_t setRelay; // объявляем переменную с количеством реле, для которых записана команда с ИК-приёмника void setup(){ IR.begin(); // инициализируем работу с ИК приёмопередатчиком for(uint8_t i=0; i<allRelay; i++){ // проходим по всем выводам, к которым подключены реле pinMode(pinRelay[i], OUTPUT); // переводим вывод очередного реле в режим работы на выход digitalWrite(pinRelay[i], LOW); // устанавливаем логический «0» на указанном выводе varRelay[i] = 0; // сбрасываем код команды для очередного реле modRelay[i] = 0; // сбрасываем состояние очередного реле } setRelay = 0; // сбрасываем количество реле, для которых записана команда while(setRelay<allRelay){ // если есть реле, для которых не указана команда digitalWrite(pinRelay[setRelay], millis()/1000%2); // чередуем вывод логических уровней (1/0) на выводе реле которое ожидает получения кода if(IR.check()){ // если принят информационный пакет (без учета пакетов повтора) varRelay[setRelay]=IR.data; // сохраняем команду для очередного реле digitalWrite(pinRelay[setRelay], LOW); // устанавливаем логический «0» на указанном выводе setRelay++; // увеличиваем значение количества реле, для которых установлена команда с ИК-приёмника } } } void loop(){ if(IR.check()){ // если принят информационный пакет (без учета пакетов повтора) for(uint8_t i=0; i<allRelay; i++){ // проходим по всем выводам, к которым подключены реле if(varRelay[i]==IR.data){ // если обнаружено совпадение кода ИК-приемника с кодом присвоенным реле modRelay[i]=!modRelay[i]; // меняем состояние (на противоположное) в ячейке массива modRelay[i] digitalWrite(pinRelay[i], modRelay[i]); // выводим состояние ячейки массива modRelay[i] на вывод pinRelay[i] } } } }
Обсуждение