Скидки, ограниченное предложение! Полный список акционных товаров

Урок 31. Управление освещением с ИК-пульта

Необходимые детали
Видео уроки

Схема управления освещением с любого ИК-пульта реализована следующим образом:

  • При нажатии на кнопку ИК-пульта, он отправляет пакет закодированных и промодулированных данных на ИК-светодиод, а при удержании кнопки, еще и пакеты повтора.
  • Невидимый инфракрасный свет от ИК-светодиода попадает на Trima-модуль ИК-приёмник, где преобразуются в демодулированные электрические импульсы.
  • Библиотека iarduino_IR постоянно считывает и раскодирует импульсы с ИК-приёмника (используя второй аппаратный таймер Arduino)
  • В коде loop мы сверяем раскодированные библиотекой данные с назначенными устройству (лампе) и если они совпали, то меняем состояние («1»/«0») на входе Trema-модуля Твердотельное реле, следовательно, включаем или выключаем устройство (лампу).

Устройство может быть полезным, если назначить неиспользуемые кнопки телевизионного пульта (например цветные кнопки телетекста) для управления освещением в комнате.

Вместо ламп накаливания, Вы можете подключить любое устройство сети ~220 В, с током потребления до 2 А.

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

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

  • Библиотека iarduino_IR для работы с ИК-приёмопередатчиками
    ВАЖНО: библиотека использует второй аппаратный таймер,
    НЕ ВЫВОДИТЕ СИГНАЛЫ ШИМ НА 3 ИЛИ 11 ВЫВОД!

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

Видео:

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

В данной схеме используются только цифровые модули, их можно подключать к любым (как цифровым так и аналоговым) выводам Arduino. Для примера, мы подключили все модули к аналоговым выводам. Не все знают, что аналоговые выводы Arduino могут работать как обычные цифровые выводы, позволяющие получать (от ИК-приёмника) и передавать (на твердотельные реле) цифровые сигналы в виде логических «0» и «1».

Если Вы будете подключать устройства к другим выводам, то их номера нужно указать во второй (объявление объекта IR) и третей (объявление массива pinRelay) строках скетча. Код программы написан так, что вы можете подключить столько реле, сколько есть свободных выводов у вашей Arduino, просто перечислив номера выводов в третей строке скетча (объявление массива pinRelay).

Схема управления освещением на Arduino через ИК-пульт

Не устанавливайте 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]
      }
    }
  }
}

Ссылки:

Обсуждение

Присоединяйся

Другие уроки

На главную