Новый Год встретили, а Рождество еще не наступило, мы зашевелились - Таня занялась вязанием и своими вязальными семинарами, а я откопал старый Redmi Note 4 и думаю: “Что это телефон пропадает, сделаю-ка я из него универсальный пульт”. Занялся. Снял на компьютере коды пульта телевизора, коды для подсветки штор. Бар работает на блютуз, сделаю на следующие новогодние каникулы; сейчас, всё равно, не успею. Ну, думаю, заодно и ёлку подключу к пульту. Коды для включения-выключения придумаю, микроконтроллер запрограммирую. Перебрал удлинитель, сделал выход на реле для подключения к контроллеру. Малость попаял, пристегнул к ёлке датчик, понюхал канифоли, собрал все в кучу. Написал программу для ёлки. В смартфон загрузил все коды. VK, 2024.01.08
В этом материале начнем разбирать, как сделать инфракрасный пульт из смартфона для управления домашней техникой, а именно, в моём конкретном случае, универсальный пульт для управления телевизором, подсветкой штор и включением-выключением Новогодней ёлки и сделаем первый шаг в этом направлении.
Для реализации проекта понадобится следующее:
смартфон, имеющий источник инфракрасного излучения (в моем случае использовался Redmi Note 4);
универсальный пульт дистанционного управления. В настоящее время их существует множество: Galaxy Universal Remote, Samsung Universal TV Remote, Universal Remote for Smart TVs и т.д. Можно использовать любой пульт, который позволяет самостоятельно формировать наборы кодов для управления оборудованием. Я использовал установочный файл приложения Galaxy Universal Remote v4.1.3 (3.92 МБ);
среда разработки скетчей и их загрузки в контроллер - IDE Arduino 1.8.18 или более поздней версии;
контроллер (например, Arduino UNO);
ИК-датчик VS1838B, приёмник инфракрасных сигналов на частоте 38 кГц (или модуль KY-022 с инфракрасным датчиком)


Существует несколько протоколов кодирования инфракрасных импульсов. Например, дома у меня обнаружились пульты с протоколом Samsung, Nec и даже один “неопределенный” протокол. Неопределенный протокол - это протокол с точки зрения программной библиотеки IRremote 3.5.2, которую я использовал в экспериментах.
Все протоколы изучать не будем, принцип их действия схож, немножечко посмотрим только на первую 8-разрядную версию протокола NEC, а затем доверимся библиотеке IRremote.

Для передачи данных используется несущая частота 38 кГц. Идут импульсы -прерываются - идут импульсы -прерываются. Если длительность паузы совпадает с длительностью импульсов - это ноль, если длительность паузы равна трем длительностям сигнала - это единичка.
Ну, а далее протоколами (в том числе и NEC) рассматриваются наборы нулей и единиц, как обычно в компьютерной жизни.

Посылка сигналов состоит из стартового импульса и четырех байтов данных – адрес, инвертированное значение адреса, команда, инвертированное значение команды. Адрес и команда передаются дважды для повышения надежности.
Данные передаются младшим битом вперед. Каждый бит начинается с пачки импульсов несущей частоты. Длительность пачки равна 560 мкс. Как уже сказано, путем изменения временного интервала между пачками импульсов осуществляется кодирование нулей и единиц. При передаче логической единицы интервал от начала текущей до начала следующей пачки импульсов составляет 2.25 мс, а при передаче логического нуля – 1.12 мс.
Стартовый импульс представляет собой пачку импульсов несущей частоты длительностью 9 мс. После подачи стартового импульса следует пауза в 4.5 мс.
Посылка, содержащая адрес и команду передается однократно, но при удержании кнопки пульта дистанционного управления через каждые 110 мс излучается код повтора – пачка импульсов несущей частоты длительностью 9мс, пауза в 2.25 мс и пачка импульсов длительностью 560 мкс.
Первая задача, которая стоит перед нами - это подобрать набор кодов для загрузки в пульт. Для её решения соберем схему на базе Arduino Uno и напишем программный скетч для её работы.

Схема простая. На макетной плате размещаем инфракрасный датчик VS1838B. Соединяем сигнальный контакт со вторым цифровым входом контроллера, соединяем “земли” сенсора (датчика) и контроллера и подаем 5В с контроллера на датчик. Вся основная работа будет делаться в программе. Для подбора кодов будем подавать команды с пульта телевизора и с пульта освещения штор. Для включения/выключения ёлочной гирлянды придумаем или подберем свои коды.
Изучение смартфонного приложения Galaxy Universal Remote показало, что можно добиться совместимости с IRremote через набор кодов в формате ProntoHEX. Поэтому и будем подбирать коды в соответствии с данным форматом.
/** Arduino UNO ************************************* *** MakeProntoHex.ino ***
* (this file is based on ReceiveDump.cpp by MIT License, Armin Joachimsmeyer)
*
* Вывести коды полученного инфракрасного сигнала в формате ProntoHEX
*
* v2.1, 05.03.2024 Автор: Труфанов В.Е.
* Copyright © 2023 tve Дата создания: 30.12.2023
**/
#include <Arduino.h>
#include "PinDefinitionsAndMore.h"
#include <IRremote.hpp>
void setup()
{
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
// Инициируем приёмник (объект IrReceiver). Параметрами, передаваемыми в метод
// begin, являются номер порта (пин) на плате Arduino, к которому подключён
// выход датчика и константа ENABLE_LED_FEEDBACK, которая включает ретрансляции
// кода, полученного от датчика на светодиод.
// Используйте константy DISABLE_LED_FEEDBACK для отмены ретрансляции сигнала.
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
Serial.println();
}
void loop()
{
// Если пришел IR-код
if (IrReceiver.decode())
{
// Отмечаем, что пришел сигнал на контакт
Serial.print(F("Принят IR-сигнал на контакте ")); Serial.println(IR_RECEIVE_PIN);
// Если буфер переполнен, то выводим предупреждающее сообщение
if (IrReceiver.decodedIRData.flags & IRDATA_FLAGS_WAS_OVERFLOW)
{
Serial.println(F("Обнаружено переполнение буфера"));
Serial.print(F("Сделайте значение RAW_BUFFER_LENGTH более "));
Serial.println(F(STR(RAW_BUFFER_LENGTH) " в " __FILE__));
}
else
// Выводим информацию по IR-сигналу
{
// Выводим общую информацию по сигналу от нажатой кнопки
IrReceiver.printIRResultShort(&Serial);
// Выводим последовательность Pronto HEX функцией compensateAndStorePronto()
String ProntoHEX = F(""); String ProntoHEXi = F("");
if (int size = IrReceiver.compensateAndStorePronto(&ProntoHEX))
{
ProntoHEXi += F("ProntoHEX:");
Serial.println(ProntoHEXi.c_str());
}
else ProntoHEX += F("ProntoHEX не сформировался!");
Serial.println(ProntoHEX.c_str());
Serial.println();
}
// Готовим прием следующего значения
IrReceiver.resume();
}
}
// ****************************************************** MakeProntoHex.ino ***
После аккуратной и терпеливой работы со скетчем, пультом для телевизора (протокол Samsung), пультом управления светодиодной лентой для шторы в гостиной (протокол NEC) и выбора последовательностей кодов для включения/выключения ёлочной гирлянды сформировался список кодов для загрузки в универсальный пульт Galaxy Universal Remote v4.1.3.
Shtora Vkl
0000 006D 0022 0000 0193 00AE 0018 0016 0018 0016 001A 0016 0018 0016 0018 0016 001A 0016 0018 0016 0018 0016 001A 0041 0018 0041 001A 0041 001A 0041 0018 0041 001A 0041 001A 0041 0018 0041 0018 0018 0018 0016 0018 0016 0018 0016 001A 0014 001A 0016 0018 0041 001A 0016 0018 0041 001A 0041 0018 0043 0018 0041 001A 0041 0018 0041 001A 0016 0018 0041 0018 06C3
Shtora RED
0000 006D 0022 0000 018B 00AE 0018 0018 0016 0016 001A 0016 0016 0018 0018 0016 0018 0016 0018 0018 0016 0016 0018 0043 0018 0041 0018 0041 001A 0043 0018 0043 0016 0041 001A 0043 0016 0043 0018 0016 0018 0018 0016 0018 0016 0043 0018 0043 0018 0014 001A 0043 0016 0018 001A 0041 0018 0043 0016 0041 001A 0016 0018 0016 0018 0043 0018 0016 0018 0043 0016 06C3
Shtora YELLOW
0000 006D 0022 0000 0191 00AC 0018 0016 001A 0014 001A 0016 0018 0016 0018 0016 001A 0014 001A 0016 0018 0016 001A 0041 0018 0043 0018 0041 001A 0041 0018 0043 0018 0041 001A 0041 0018 0043 0018 0016 0018 0016 001A 0016 0018 0041 001A 0043 0018 0014 001A 0016 0018 0016 0018 0041 0018 0041 001A 0043 0018 0016 001A 0016 0018 0041 001A 0043 0018 0041 001A 06C3
Shtora GREEN
0000 006D 0022 0000 0189 00AE 0018 0016 0018 0016 0018 0016 0018 0016 0018 0016 0018 0016 0018 0016 0018 0016 0018 0043 0016 0043 0018 0041 0018 0043 0018 0041 0018 0041 001A 0041 0018 0041 0018 0041 001A 0016 0018 0016 0018 0041 0018 0041 001A 0016 0016 0043 0018 0016 0018 0016 0018 0041 0018 0041 001A 0016 0018 0016 0018 0041 0018 0016 0018 0041 0018 06C3
Shtora FLASH
0000 006D 0022 0000 0191 00AE 0018 0016 0018 0016 001A 0016 0018 0016 001A 0014 001A 0016 0018 0016 001A 0014 001A 0041 001A 0041 0018 0041 001A 0043 0018 0041 0018 0043 0018 0043 0018 0041 001A 0041 001A 0041 0018 0016 0018 0016 0018 0043 0018 0016 001A 0016 0018 0016 001A 0016 0018 0016 0018 0041 001A 0041 0018 0016 0018 0041 001A 0041 0018 0041 0018 06C3
Shtora AUTO
0000 006D 0022 0000 0191 00AC 0018 0016 0018 0016 001A 0016 0018 0016 0018 0016 001A 0016 0018 0016 0018 0016 001A 0041 0018 0043 0018 0041 0018 0043 001A 003F 0018 0041 001A 0041 001A 0041 0018 0041 001A 0041 0018 0043 0018 0041 001A 0016 0018 0016 0018 0016 0018 0016 0018 0016 0018 0016 001A 0014 001A 0016 0018 0041 001A 003F 001A 0041 001A 0041 0018 06C3
Shtora FADE7
0000 006D 0022 0000 0189 00AC 0018 0018 0018 0014 001A 0016 0016 0018 0018 0014 001A 0016 0018 0016 0018 0014 001A 0041 0018 0043 0016 0043 0018 0043 0018 0041 0018 0041 001A 0041 0018 0041 0018 0041 001A 0041 0018 0041 0018 0018 0016 0016 001A 0014 0018 0018 0018 0014 001A 0016 0018 0016 0018 0014 001A 0041 0018 0041 0018 0043 0018 0041 0018 0043 0018 06C3
Shtora QUICK
0000 006D 0022 0000 0193 00AE 001A 0016 0018 0016 001A 0016 0018 0016 0018 0016 0018 0016 0018 0016 001A 0014 001A 0043 0018 0041 001A 0041 001A 0041 0018 0043 0018 0041 001A 0041 001A 0041 001A 0041 001A 0041 0018 0043 0018 0016 0018 0043 0018 0016 0018 0016 001A 0016 0018 0018 0018 0016 001A 0016 0018 0043 001A 0014 001A 0041 001A 0041 001A 0041 0018 06C3
Shtora SLOWLY
0000 006D 0022 0000 0191 00AE 0018 0016 0018 0016 001A 0016 0018 0016 001A 0014 001A 0016 0018 0016 001A 0014 001A 0041 001A 0041 0018 0041 001A 0043 0018 0041 0018 0043 0018 0043 0018 0041 001A 0041 001A 0041 0018 0016 0018 0016 0018 0043 0018 0016 001A 0016 0018 0016 001A 0016 0018 0016 0018 0041 001A 0041 0018 0016 0018 0041 001A 0041 0018 0041 0018 06C3
Ogoni Vverh
0000 006D 0022 0000 018D 00AC 001A 0014 001A 0016 0018 0014 0018 0018 0018 0014 001A 0016 0018 0016 0018 0016 0018 0041 001A 0041 0018 0041 0018 0043 0018 0041 0018 0041 001A 0041 0018 0041 001A 0014 001A 0014 001A 0041 0018 0041 0018 0041 001A 0016 0016 0043 0018 0016 0018 0041 001A 0041 0018 0016 0018 0016 0018 0016 001A 003F 0018 0018 0016 0043 0018 06C3
Ogoni Vniz
0000 006D 0022 0000 0191 00AC 0018 0018 0018 0016 0018 0016 0018 0018 0016 0016 001A 0016 0018 0016 0018 0018 0018 0041 001A 0041 0018 0041 001A 0041 001A 0041 0018 0043 0018 0041 0018 0041 001A 0041 0018 0018 0016 0041 001C 003F 0018 0043 001A 0014 001A 0041 0018 0016 001A 0014 001A 0043 0018 0016 0018 0016 001A 0018 0016 0043 0018 0016 001A 0041 001A 06C3
Shtora DIY4
0000 006D 0022 0000 018F 00AC 0018 0016 0018 0016 001A 0014 0018 0018 0018 0014 001A 0016 0018 0016 0018 0016 0018 0041 0018 0043 0018 0041 001A 0041 0018 0041 0018 0041 001A 0041 0018 0043 0018 0016 0018 0016 0018 0016 0018 0041 001A 0016 0018 0016 0018 0016 0018 0016 0018 0041 001A 0041 0018 0041 0018 0016 0018 0043 0018 0041 0018 0043 0018 0041 0018 06C3
TV ON/OFF
0000 006D 0022 0000 00B0 00AA 0018 003D 0016 003F 0016 0041 0016 0014 0014 0016 0014 0016 0018 0012 0014 0016 0018 003F 0014 0041 0014 0041 0014 0016 0018 0012 0014 0016 0014 0016 0014 0016 0018 0012 0014 0041 0016 0014 0016 0014 001A 0011 0016 0016 0014 0016 0014 0014 0016 0041 0016 0014 0018 003F 0014 0041 0016 003F 0016 0041 0014 0041 0016 0041 0014 06C3
TV GROMCHE
0000 006D 0022 0000 0159 00A8 0016 0041 0014 0016 0016 0016 0016 0014 0016 0016 0016 0014 0016 0016 0016 0016 0014 0016 0018 003F 0016 003F 0016 0041 0018 003F 0016 0041 0014 0041 0016 0041 0016 0041 0016 0041 0018 0012 0016 0041 0016 0014 001A 0012 0016 0041 0018 0012 0016 0016 0014 0016 0016 0041 0016 0016 0014 0041 0016 0041 0016 0016 0014 0041 0018 06C3
TV TISHE
0000 006D 0022 0000 0157 00AA 0016 0041 0016 0016 0014 0016 0016 0016 0016 0014 0016 0016 0018 0012 0016 0016 0016 0016 0014 0041 0016 0041 0016 0041 0014 0041 0016 0041 0018 003F 0016 003F 0016 0041 0016 0041 0016 0041 0014 0041 0016 0016 0016 0014 0016 0041 0016 0016 0014 0016 0016 0016 0018 0012 001A 0012 0016 0041 0014 0041 0016 0016 0016 003F 0016 06C3
TV +
0000 006D 0022 0000 0159 00A8 0016 0041 0016 0014 0016 0016 0016 0016 0018 0012 0016 0016 0018 0012 0016 0016 0014 0016 001A 003D 0018 003F 0014 0041 0016 0041 0016 0041 0018 003F 0014 0041 0016 0041 0016 0016 0014 0016 0018 003F 0016 0014 0016 0016 0018 0012 0016 0016 0018 0014 0014 0041 0016 0041 0018 0014 0014 0041 0016 0041 0016 0041 0014 0041 0016 06C3
TV -
0000 006D 0022 0000 0157 00AA 0018 003F 0016 0014 0018 0014 0018 0012 0018 0014 0018 0012 0018 0014 0018 0012 0018 0014 0018 003F 0018 003D 0018 003F 0018 003F 0018 003F 0016 003F 0018 003F 0018 003F 0018 0012 0018 003F 0018 0014 0016 0014 0018 0014 0018 0012 0016 0016 0018 0012 0016 0041 0018 0014 0016 003F 0018 003F 0018 003F 0018 003F 0016 003F 0018 06C3
TV INFO
0000 006D 0022 0000 0157 00AA 0016 0041 0016 0016 0014 0016 0016 0016 0014 0016 0016 0016 0014 0016 0016 0016 0016 0014 0016 0041 0016 0041 0016 0041 0014 0041 0016 0041 0016 0041 0014 0041 0016 0041 0016 0016 0014 0016 0016 0041 0016 0014 0016 0016 0016 0041 0014 0016 0016 0016 0016 0041 0014 0041 0016 0016 0014 0041 0016 0041 0016 0016 0014 0041 0016 06C3
IYO +
0000 006D 0022 0000 0193 00AE 0018 0018 0016 0016 001A 0016 0018 0018 0016 0016 001A 0016 0016 0018 0018 0016 0018 0043 0018 0043 0016 0043 0018 0041 0018 0043 0018 0043 0018 0043 0018 0041 0018 0018 0018 0016 0018 0043 0018 0016 0018 0043 0018 0016 0018 0016 0018 0018 0018 0041 0018 0041 001A 0016 0018 0043 001A 0016 0018 0043 0018 0043 0016 0043 0018 06C3
IYO -
0000 006D 0022 0000 017F 00AC 0018 0016 0018 0016 0018 0016 0016 0018 0016 0016 0018 0016 0016 0018 0016 0016 0018 0041 0018 0043 0016 0043 0018 0041 0016 0043 0016 0041 001A 0041 0018 0041 0018 0016 0016 0018 0018 0016 0016 0016 0016 0043 0016 0018 0016 0018 0016 0018 0016 0041 0018 0043 0016 0043 0016 0043 0016 0018 0016 0043 0018 003F 0018 0041 0018 06C3
Как эти коды встроить в универсальный пульт, сделанный из смартфона, можно посмотреть в следующем материале: “Был смартфон - стал ещё и пульт”.