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

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

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

#include "IRremote.h"
IRrecv irrecv(10); // указываем вывод, к которому подключен приемник
decode_results results;

void setup() {
  Serial.begin(9600); // выставляем скорость COM порта
  irrecv.enableIRIn(); // запускаем прием
}

void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
    Serial.println( results.value, HEX ); // печатаем данные
    irrecv.resume(); // принимаем следующую команду
  }
}

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

#include "IRremote.h"

#define LED_PIN 9

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

void setup() {
  Serial.begin(9600); // выставляем скорость COM порта
  irrecv.enableIRIn(); // запускаем прием
  pinMode(LED_PIN, OUTPUT); 
}

void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
    Serial.println( results.value, HEX ); // печатаем данные
   
    switch ( results.value ) {
    case 0xFF18E7: // кнопка вверх
        digitalWrite( LED_PIN, HIGH );
        break;
    case 0xFF4AB5: // кнопка вниз
        digitalWrite( LED_PIN, LOW );
        break;
    }  
    irrecv.resume(); // принимаем следующую команду
  }
}

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