Универсальный дистанционный пульт
с ESP8266.

ESP8266 - universal remote control with a daily schedule /v3.3 - 27 июля 2016/   zip (zip).
(универсальный пульт дистанционного управления с ежедневным расписанием)

plan

Я задумал сделать универсальный пульт для управления устройствами по каналам IR и Wifi, чтобы можно было управлять бытовой техникой с мобильного телефона или компьютера, используя WiFi-соединение или инфракрасный излучатель.

Начну я, пожалуй, с конца.

Что получилось в итоге:

  • - формирование различных html страничек с функциями пультов управления;
  • - размещение единого пульта управления для разных однотипных устройств;
  • - сканирование и хранение IR команд для различных бытовых устройств;
  • - генерация IR кодов и передача со встроенного излучателя;
  • - ретрансляция IR кодов через WiFi на другие ESP модули; (Ver 3.0)
  • - управление WiFi модулями;
  • - получение информации от других ESP8266 модулей через WiFi;
  • - возможность формирования макро команд управления устройствами;
  • - исполнение команд по расписанию на любой день года. (Ver 2.6)

Что требуется:

Hardware/железо Software/программы Описание
ESP8266 12E #include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <pgmspace.h> //PROGMEM
 
IR приемник #include <IRremoteESP8266.h> GPIO2 (pin D4)
IR излучатель #include <IRremoteESP8266.h> GPIO0 (pin D3)
SD card модуль #include <SD.h>
#include <SPI.h>
  PIN GPIO
sck d5 14
miso d6 12
mosi d7 13
cs d8 15
RTC (DS1302) #include <Time.h>
#include <TimeLib.h>
#include <DS1302RTC.h>
скачать

В качестве транзистора я использовал n-p-n средней мощности (КТ817), на базу сигнал подключил через сопротивление 100 ом, а в коллекторе сопротивление 30 ом. В моих условиях этого оказалось вполне приемлемо, хотя я готов был уменьшить сопротивление до 18 ом.

maket

Справа фото рабочего макета с использованием motor shield для DevKit ESP8266.

Для тех кто собирается работать с DevKit, рекомендую такую макетницу, удобно подключаться к ножкам, кроме того к модулю лекго подключать внешний источник питания и имеется выключатель питания.

Теперь все по порядку.

Формирование пультов

pults

Пульты могут быть самые разные. На рисунке представлены пульты для разных устройств, например, G-Rail - IR пульт для штор, а ESP8266 - управление самим микроконтроллером.

Особо стоит выделить три пульта:
- MACRO, у которого под каждой кнопкой макрокоманды;
- панель ESP8266 - управление собственным контроллером;
- панель Daily (см. команды по расписанию) - расписание на день (когда какая команда будет исполнена);

Можно достаточно легко построить пульт или панель управления под свои требования, выбрав в качестве шаблона любой из заложенных в программе пультов. Если в этом нужна помощь, то откройте страницу "Как править html".

mp3Организация загрузки html страничек.

Страничка каждого пульта условно разбита на две части:

  • шапка - файлы const static char header[0..13]
  • пульт - файлы const static char pult_Name[0..NN]

Шапка страничек для всех одна и содержит стили CSS, функции javascript и меню пультов. Это общая, а потому и самая объемная часть каждой страницы.

Перва часть (шапка) заканчивается строкой с комментарием <!--end-->. Это позволяет, при необходимости, без труда найти границу частей в html странице.

В тегах пульта обязательно должен быть объект с id="pult" title="pult_Name". Удобнее всего это делать в первой же таблице, например:

<table id="pult" title="SAMSUNG" width="176" border="0">

Каждая кнопка пульта имеет свой уникальный для данного пульта id, который при сканировании IR сигнала от этой кнопки сформирует имя raw файла с кодовой последовательностью. Логичнее всего присваивать id кнопке ее значение. Так, если на кнопке реального пульта написано "exit", то присваиваем кнопке id=exit:

<div class="but" id=exit onclick="... ">exit</div>

После обилия картинок хочу еще раз подчеркнуть, что все html страницы с изображениями пультов храняться в памяти ESP8266, SD card нужна только для записи и хранения кодов и команд.

 

Пульты для однотипных устройств.

Многие устройства разных производителей, например телевизоры, имеют функционально очень схожие пульты, хотя кодировка клавиш разная. В программе имеется возможность создания пультов для групп однотипных устройств.

В памяти ESP8266 хранятся html страницы с образами различных пультов. Для одинаковых по назначению пультов может быть организована группа, использующая один и тот же образ пульта, но под разными именами: Sony, Panasonic, JVC и т.д.

Так, в проекте за один из групповых пультов выбран пульт samsung. Это значит, что при выборе любого из этой группы пульта (Sony, JVC, Panasonic и др. телевизионные пульты), в браузер будет загружена страничка пульта "samsung", но после загрузки, по запросу браузера, сервер изменит имя пульта. Рассмотрим этот процесс по шагам:

select

Например, мы выберем из выпадающего меню пульт Sony [1]. Сервер начнет формировать страничку 192.168.0.128/sony [2]. Так как сервер загружает образ пульта из группы, то сначала мы увидим надпись "wait", а потом сервер присвоит имя пульта "sony" [3] - пульт готов к работе с кодами Sony.

Это позволяет существенно экономить память и модифицировать интерфейс. В качестве примера в программе создана такая группа для телевизионных пультов.

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

<output id="pultname"><span>wait</span></output>    В этой записи ничего менять не надо!

Необходимо, при создании группы, внести изменения в программу. Это не сложно. Рассмотрим создание группы на базе пульта samsung

  
if (priem == "sony" || priem == "panasonic" || priem == "jvc" || priem == "lg" || priem == "philips" || priem == "samsung") {
   for (int i = 0; i < 3; i++) индекс указателя массива всегда с нуля!!!
   {
    mess = html_samsung[i];
    client.print(mess);
    delay( 10 );
  }
}
  

Предположим, что в программе прописан пульт "group1", а нам надо, чтобы привызове пультов pult_1 и pult_2 был отображен именно пульт group1. Для этого в программе, вслед вышеуказанного фрагмента, надо написать:

  
else{
  if (priem == "pult_1" || priem == "pult_2") {
  for (int i = 0; i < ?; i++) //индекс указателя массива всегда с НУЛЯ!!!
   {
    mess = html_group1[i];
    client.print(mess);
    delay( 10 );
  }
}
  

Знак вопроса - это число на сколько строковых переменных разбита страничка пульта group1. И, конечно, в страничке group1 должен быть тег output:   <output id="pultname"><span>wait</span></output>

Сканирование IR кодов youtube

rec

Для сканирования IR кода достаточно в браузере выбрать пульт и там же в меню выбрать режим "Scan". Перед сканированием следует кликнуть на кнопку пульта в браузере, чтобы программа запомнила имя пульта и имя сканируемой кнопки. Теперь, при нажатии на физическом устройстве кнопки, программа запишет код нажатой кнопки на SD.

Последовательно выбирая в браузере кнопки и сканируя коды, нажимая соответствующие кнопки на реальном пульте, программа создает raw файлы для каждой кнопки и записывает их на SD карту.

Сканирование кодов лучше производить при включенном COM терминале, для контроля. При каждом сканировании на терминал выводится восьмизначный шестнадцатеричный код, например F4BA2988, который при повторном нажатии должен быть таким же. Шестнадцатеричный код фиксируется в общем файле пульта pult_name.txt, и больше нигде не используется.

Имя пульта и имя кнопки можно вводить и через терминал:

Чтобы программа приняла имя пульта, например, ABC, надо написать: pult=ABC.

В этом случае название кнопок придется вводить вручную, заканчивая символом "/", после которого могут быть комментарии.

Если странички нового пульта еще нет, то лучше воспользоваться имеющимся пультом в программе, например SONY, предварительно переместив папку SONY с SD карты в какой-нибудь архив. После этого при сканировании вашего пульта будет снова создана папка SONY, куда и запишутся все отсканированные коды. По завершению сканирования, следует переименовать папку под будущее название вашего пульта и вернуть на место из архива папку Sony. Если Вы не забыли вписать имя нового пульта в выпадающее меню, то можете испытать работу нового пульта под новым названием.

Это удобно, потому что не надо каждый раз при сканировании вводить через терминал имена кнопок, а просто выбирать их в браузере.

Я полностью отказался от сформированных протоколов в библиотеке IRremote.h для фирменных пультов (JVC, SONY, NEC и прочее) и записываю только RAW массивы. Так что можно подумать и об оптимизации самой библиотеки.

Сканирование каждой кнопки имеет смысл производить дважды, чтобы сравнить полученный шестнадцатеричный код. Если код повторяется, то запись, скорее всего, прошла без помех.

На терминале COM порта отображается вся необходимая информация во время сканирования.

COM терминал описание
jvc : jvc=rec=1 разрешить сканирование
.............
jvc : menu
выбрана кнопка menu
..../test - проверка введен комментарий
....type -1 (32 bits) len 68
button: menu; cod(HEX): 66BF40E8
IR/jvc/jvc.txt
====IR command is ready====
отсканирована кнопка menu
.............
jvc : info
выбрана кнопка info
....type -1 (32 bits) len 68
button: info; cod(HEX): 71C83AA6
IR/jvc/jvc.txt
====IR command is ready====
отсканирована кнопка info
.type -1 (32 bits) len 79
button: info; cod(HEX): 12A2F3D
IR/jvc/jvc.txt
-=file removed=-
====IR command is ready====
отсканирована кнопка info
такая запись была - перезаписано
........../ сброшен комментарий
....type -1 (32 bits) len 68
button: info; cod(HEX): 3BCD58C8
IR/jvc/jvc.txt
-=file removed=-
====IR command is ready====
отсканирована кнопка info
такая запись была - перезаписано
....type -1 (32 bits) len 68
button: info; cod(HEX): 3BCD58C8
IR/jvc/jvc.txt
-=file removed=-
====IR command is ready====
отсканирована кнопка info
такая запись была - перезаписано
.........................
jvc : ok
выбрана кнопка ok
...................../ok 2016 введен комментарий ok 2016
..type -1 (32 bits) len 68
button: ok; cod(HEX): 8AF13528
IR/jvc/jvc.txt
====IR command is ready====
отсканирована кнопка ok
Чтобы сбросить комментарий, надо ввести в терминале один символ "/".
Строка -=file removed=- обозначает, что на SD карте файл с кодами этой кнопки уже существовал, и он перезаписан.

Весь процесс сканирования записан в файле этого пульта IR/jvc/jvc.txt.

menu=66bf40e8;32;38;68/test - проверка
info= 71c83aa6;32;38;68/test - проверка
info= 12a2f3d;32;38;79/test - проверка
info=3bcd58c8;32;38;68/
info=3bcd58c8;32;38;68/
ok=8af13528;32;38;68/ok 2016

Каждое сканирование прописано одной строкой. Сначала записано имя кнопки, затем прописан код команды, разрядность (32 бит), частота (38кгц), и длина raw последовательности (68 байт).

Из записи видно, что после кнопки "menu" комментарий не обновлялся. При сканированием кнопки "info" комментарий был сброшен. Кнопка сканировалась 4 раза, причем, первые два со сбоем.

IR коды и файлы для SD

Для каждого пульта на SD карте программа автоматически создает, если ее нет, папку с именем пульта, например, JVC. В эту папку записывается текстовый файл с именем пульта, например, JVC.txt, в котором фиксируется весь процесс сканирования кнопок пульта. Этот файл можно редактировать и даже удалить, он предназначен для контроля сканирования.

Отсканированные коды записываются в папку пульта в виде бинарных файлов с расширением raw. Для каждой кнопки свой файл: key_name.raw, где key_name имя кнопки, заданное при сканировании.

Файл (.raw) - это кодовая последовательность для формирования IR сигнала, в которой каждый байт определяет длительность импульса или паузы. Содержимое этого файла нельзя посмотреть в текстовых редакторах. Можно использовать, например, HEDIT.exe

file

Следует помнить, что сколько бы раз не сканировалась кнопка под одним и тем же именем, raw файл будет один и содержать код последнего сканирования.

IR коды - ретрансляция.

Последнее, что удалось реализовать, это ретрансляцию IR команд на другие модули через WiFi канал. Это снимает все пространственные ограничения с IR управления, а в сочетании с возможностью работы универсального пульта по расписанию, макисмально расширяет функции устройства. Поскольку ретрансляция IR команд может иметь самостоятельное значение, описание пульта и его возможностей вынесено на отдельную страницу.

Это была первая часть описания универсального пульта на базе ESP8266 E-12Q.

Во второй части рассмотрены: управление модулями через WiFi, организация запросов и обмена данными, организация макрокоманд и работа с часами реального времени.   Продолжение ...

Hosted by uCoz