Идея создания универсального ИК пульта из Arduino появилась после вечерних работ в серверной. При приезде, мы отключили кондиционер, поработали и уехали домой. Где-то после 4 часов, приходит уведомление, что температура в серверной выше 27 градусов. В итоге – неприятная поездка обратно в серверную, зимой, в 22 часов вечера, чтобы просто нажать одну кнопку на пульту кондиционера. Именно поэтому я решил сделать ИК пульт именно из Arduino, потому что его можно подключить к сети, и отправлять сигналы включение кондиционера через интернет.

Для этой задачи нужно собрать следующие модули и компоненты:
1. Контроллер Arduino Pro Mini 5V (можно брать другой);
2. Ethernet-модуль Enc28j60 5v (этот же модуль я использовал в статье Подключение второго Ethernet порта к Raspberry PI);
3. Инфракрасный передатчик;
4. Инфракрасный приемник.
Для удобства, я взял два контроллера Arduino Pro Mini (на одном я собрал приемник сигнала, другой как раз будет использоваться как IR-пульт).

Собираем приемник IR сигнала.

Первым делом, узнаем распиновку инфракрасного приемника. Плюс приемника подключаем к пину VCC, минус подключаем к GND. Сигнальный провод подключаем к 4 пину (цифровой выход).
Для приема сигнала, будем использовать скетч для примеров IRrecvDump, библиотеки IRremote. Соответственно перед работой, библиотеку нужно скачать и установить. Открываем скетч IRrecvDump, проверяем номер пина у переменной RECV_PIN, должен стоять тот, к которому Вы подключили сигнальный провод к Arduino. В нашем случае, этот рядок должен иметь такой вид int RECV_PIN = 4;. Загружаем в контроллер, открываем монитор порта CTRL+SHIFT+M, подносим пульт, и нажимаем любую клавишу. На экране должны появиться символы. Я советую записать себе код у формате Raw, так как HEX формат может не полностью приняться управляющим устройством (в моем случае, при передаче сигнала в HEX формате, кондиционер не производил никаких действий).
Итак, после первого шага, мы собрали принимающее устройство IR сигнала, и записали код сигнала определенной кнопки (в моем случае – кнопка включение кондиционера), переходим ко втором шаге.

Собираем передатчик IR сигнала.

Подключение IR передатчика к Arduino производится следующим образом: минус передатчика подключаем к пину GND. Плюс подключаем к 3 пину (цифровой выход). Причем, номер пина указан в самой библиотеке IRremote, и выставить другой пин в самом скетче нельзя. Поэтому внимательно удостоверьтесь в том, что плюс передатчика подключен правильно. Так же, желательно, плюс к пину подключать через резистор 180 Ом, чтобы не спалить передатчик (я не использовал).
Открываем скетч для примеров IRsendRawDemo, библиотеки IRremote, находим обьявление одномерного массива irSignal[], где указан код сигнала у формате Raw, и заменяем на свой. Например: unsigned int irSignal[] = {4400,4350, 550,1550, 550,500, 550,1600, 550,1550, 550,500, 550,550, 550,1550, 550,500, 550,550, 550,1550, 550,500, 550,550, 550,1550, 550,1600, 550,500, 550,1550, 550,1600, 550,500, 550,500, 550,1600, 550,1550, 550,1600, 550,1550, 550,1600, 550,500, 550,1550, 550,1600, 550,500, 550,500, 550,550, 550,500, 550,500, 550,500, 550,1600, 550,500, 550,500, 550,1600, 550,1550, 550,550, 550,500, 550,1550, 550,550, 550,1550, 550,1550, 550,550, 550,500, 550,1550, 550,1600, 550};.
Проверяем скетч на ошибки, и загружаем его в контроллер. После загрузки, каждые 5 секунд, arduino будет отправлять сигнал. Если поднести его к управляющему устройству, должно произойти какие-то изменение (в моем случае – включение кондиционера). Если нет изменений, проверьте, работает ли сам передатчик: включите камеру на телефоне, и наведите на передатчик. Каждые 5 секунд, передатчик должен засветиться. Если передатчик работает – проверяйте правильность ввода Raw кода сигнала в скетч передатчика. Если передатчик не светится, проверьте подключение и работоспособность передатчика (возможно, Вы подключили передатчик без резистора, и он сгорел, или подключили слишком большой резистор). Переходим к третьему шагу.

Подключаем Arduino к Интернету.

Общая суть всей затеи, это на контролере поднять web сервер, и при отправки GET запроса на Arduino, создать событие включение кондиционера. Для подключение Arduino к сети Интернет, используем модуль Enc28j60. Подключаем его к контроллеру по следующей схеме:
Arduino — Enc28j60
10 — CS
11 — SI (ST)
12 — SO
13 — SCK
5V — 5V
GND — GND
Хочу остановиться на такой проблеме: сам чип модуля Enc28j60 работает с напряжением 3.3V. Я использую контроллер Arduino Pro Mini 5V, соответственно и модуль Enc28j60 я использую с штатным стабилизатором AMS1117. То есть, по идеи, я могу сразу подавать питание к пину на Enc28j60 — 5V, и все будет нормально. Но при таком подключении, у меня модуль отказывался работать! Потеряв более полдня на танцы с бубном, решил попробовать подключить питание на пин 3.3v, с использованием еще одного стабилизатора AMS1117, и все заработало. Как оказалось, штатный стабилизатор вышел из строя.
Итак, после подключения модуля к контроллеру, нужно скачать еще одну библиотеку ETHER_28J60, и установить.
Создаем новый скетч, и вставляем следующий код

#include <enc28j60.h>
#include <etherShield.h>
#include <ETHER_28J60.h>
#include <ip_arp_udp_tcp.h>
#include <net.h>
#include <IRremote.h>
IRsend irsend;
static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};
static uint8_t ip[4] = {192, 168, 4, 45};
static uint16_t port = 80;
ETHER_28J60 e;
void setup()
{
  e.setup(mac, ip, port);
}
void loop()
{
  int khz = 38;
  unsigned int irSignal[] = {4400,4350, 550,1550, 550,500, 550,1600, 550,1550, 550,500, 550,550, 550,1550, 550,500, 550,550, 550,1550, 550,500, 550,550, 550,1550, 550,1600, 550,500, 550,1550, 550,1600, 550,500, 550,500, 550,1600, 550,1550, 550,1600, 550,1550, 550,1600, 550,500, 550,1550, 550,1600, 550,500, 550,500, 550,550, 550,500, 550,500, 550,500, 550,1600, 550,500, 550,500, 550,1600, 550,1550, 550,550, 550,500, 550,1550, 550,550, 550,1550, 550,1550, 550,550, 550,500, 550,1550, 550,1600, 550};
  char* params;
  if (params = e.serviceRequest()){
    e.print("<H1>Web Remote</H1>");
    e.print("<A HREF='?cmd=power'>Power</A></br>");
    if (strcmp(params, "?cmd=power") == 0) irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz);
e.respond();
  }
}

Как видим из кода, у нас статический IP 192.168.4.45, при переходе по ссылке http://192.168.4.45/, увидим web-страницу, где будет всего две строчки: первая Web Remote, вторая – ссылка на http://192.168.4.45/?cmd=power. Перейдя по ссылке, сработает событие включение кондиционера. Плюс в модели нашего кондиционера, что код для включения один, а код для выключения другой. Именно поэтому, можно отправлять несколько GET запросов на http://192.168.4.45/?cmd=power, для перестраховки включения кондиционера.

Ссылки для скачивания библиотек:
IRremote
ETHER_28J60