Дистанционное управление светом

Соберем один из элементов умного дома - светильник управляемый пультом дистанционного управления (ДУ).
Будем включать свет при нажатии на кнопку пульта.
Соберем макет согласно рисунку, подключив приемник в разъем №6 на шилде, при этом сигнал будет поступать на порт контроллера №10.

 

Перед тем как приступить к решению основной задачи, напишем тестовую программу, чтобы выяснить какой код соответствует выбранной кнопке.

//Подключаем библиотеку
#include <IRremote.h>

//Задаем порт, к которому подключен приемник
IRrecv irrecv (10);
decode_results results;

void setup() {
  // Если данные пришли
  if (irrecv.decode(&results)) {
    //Переводим данные из двоичного в шестнадцатиричный формат
    String code = Ыекштп(results.value, HEX);
    //Отправляем принятые данные в консоль
    Serial&println(code);
    //Принимаем следующую команду
    irrecv&resume();
  }
}

Загрузив программу в контроллер и нажав на кнопку пульта ДУ, в терминале увидим код, соответствующий этой кнопке (у нас ff38c7). Если нажать на кнопку и удерживать ее, вы увидите другой код - ffffffff. Это код удержания и он одинаков для всех кнопок.
Доступ к приятым данным получаем через свойство value переменной results. Если вывести полученное значение прямо в консоль, без дополнительных преобразований, то вы увидите число записанное в двоичной форме, а именного 16726215.
Работать с кодом в таком виде можно, но это не очень удобно. Чтобы перевести число в шестнацатеричный формат, в строке 21 была создана переменная code имеющая тип String. Во время создания переменной этого типа можно перевести ее значение из двоичной и шестнацатеричную фору, передав в качестве второго аргумента HEX.
Теперь зная код выбранной кнопки, напишем программу управления светодиодом.

//Подключаем библиотеку
#include <IRremote.h>

#define LED_PIN 9
int state = LOW;

//Задаем порт, к которому подключен приемник
IRrecv irrecv (10);
decode_results results;

void setup() {
  //Настройка входов/выходов
  pinMode(LED_PIN, OUTPUT);
  //Запускаем прием
  irrecv.enableIRIn();
}

void loop() {
  //Если данные пришли
  if (irrecv.decode(&results)) {
    //Переводим данные из двоичного в шестнацатиричный формат
    String code = String(result.value, HEX);

    //усли нажата выбранная кнопка
    if (code == "ff38c7") {
      state = digitalRead(LED_PIN);
      //Меняем состояние светодиода на противоположное
      digitalWrite(LED_PIN, !state);
    }

    //Принимаем следующую команду
    irrecv.resume();
  }
  //Ждем 100мс
  delay(100);
}

На основе этого макета, заменив светодиодный модуль на релейный, можно управлять не только освещением, но и многими бытовыми приборами.