Пост некрофилии, сейчас все пользуются sonoff и прочими готовыми модулями. Но почти 3 года назад мне понадобился пульт для управления ресивером триколор (нтв+ и пр.) из разных комнат.
Разводка у меня сделана так, что сигнал с ресивера подмешивается в общий кабель (телемак md-105m), т.е. можно смотреть спутник из любой комнаты, но только тот канал, что включен на ресивере. Нужно было переключать каналы находясь в другой комнате.
Для этого в продаже имеются радиопульты, но ценник на них по моему мнению сильно завышен, да и таскать его с собой из комнаты в комнату неудобно.
В итоге был собран wi-fi пульт на ESP-07 и ардуино mini, управление со смартфона, ir диод с любого старого пульта или радиомагазина. Но с течением времени я начал забывать как я все это собрал))) Поэтому описываю процедуру, пока совсем не забыл:
esp прошиваем по старой инструкции с этого топика:
mySKU.me/blog/aliexpress/37815.html
содержимое init.lua (автозапуск):
кавычки оставляем, в них пишем имя сети, пароль, ну и прочие настройки, если отличаются от 192.168.0.Х. Запомнить что назначили в wifi.sta.setip({ip=«192.168.0.77», т.к. потом этот адрес нужно будет указать в приложении смартфона:
Дополнительная информация
wifi.setmode(wifi.STATION)
wifi.sta.config("имясети","пароль")
wifi.sta.connect()
wifi.sta.setip({ip="192.168.0.77",netmask="255.255.252.0",gateway="192.168.0.1"})
print("ESP8266 mode is: " .. wifi.getmode())
print("The module MAC address is: " .. wifi.ap.getmac())
print("Config done, IP is "..wifi.sta.getip())
dofile ("main.lua")
содержимое main.lua (сам скетч esp):
Дополнительная информация
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
conn:on("receive", function(client,request)
local buf = "";
local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
if(method == nil)then
_, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
end
local _GET = {}
if (vars ~= nil)then
for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
_GET[k] = v
end
end
local _info,_up,_guide,_left,_ok,_right,_f,_down,_exit,_button1,_button2,_button3,_button4,_button5,_button6,_button7,_button8,_button9,_last,_button0,_mute,_menu,_mail,_on,_red,_green,_yellow,_blue = "",""
if(_GET.pin == "ok")then
_ok = " selected=true";
uart.write(0,"a");
end
if(_GET.pin == "up")then
_up = " selected=true";
uart.write(0,"b");
end
if(_GET.pin == "left")then
_left = " selected=true";
uart.write(0,"c");
end
if(_GET.pin == "right")then
_right = " selected=true";
uart.write(0,"d");
end
if(_GET.pin == "down")then
_down = " selected=true";
uart.write(0,"e");
end
if(_GET.pin == "exit")then
_exit = " selected=true";
uart.write(0,"f");
end
if(_GET.pin == "info")then
_info = " selected=true";
uart.write(0,"g");
end
if(_GET.pin == "guide")then
_guide = " selected=true";
uart.write(0,"h");
end
if(_GET.pin == "f")then
_f = " selected=true";
uart.write(0,"i");
end
if(_GET.pin == "button1")then
_button1 = " selected=true";
uart.write(0,"j");
end
if(_GET.pin == "button2")then
_button2 = " selected=true";
uart.write(0,"k");
end
if(_GET.pin == "button3")then
_button3 = " selected=true";
uart.write(0,"l");
end
if(_GET.pin == "button4")then
_button4 = " selected=true";
uart.write(0,"m");
end
if(_GET.pin == "button5")then
_button5 = " selected=true";
uart.write(0,"n");
end
if(_GET.pin == "button6")then
_button6 = " selected=true";
uart.write(0,"o");
end
if(_GET.pin == "button7")then
_button7 = " selected=true";
uart.write(0,"p");
end
if(_GET.pin == "button8")then
_button8 = " selected=true";
uart.write(0,"q");
end
if(_GET.pin == "button9")then
_button9 = " selected=true";
uart.write(0,"r");
end
if(_GET.pin == "last")then
_last = " selected=true";
uart.write(0,"s");
end
if(_GET.pin == "button0")then
_button0 = " selected=true";
uart.write(0,"t");
end
if(_GET.pin == "menu")then
_menu = " selected=true";
uart.write(0,"u");
end
if(_GET.pin == "mute")then
_mute = " selected=true";
uart.write(0,"v");
end
if(_GET.pin == "mail")then
_mail = " selected=true";
uart.write(0,"w");
end
if(_GET.pin == "on")then
_on = " selected=true";
uart.write(0,"x");
end
if(_GET.pin == "red")then
_red = " selected=true";
uart.write(0,"g");
end
if(_GET.pin == "green")then
_green = " selected=true";
uart.write(0,"y");
end
if(_GET.pin == "yellow")then
_yellow = " selected=true";
uart.write(0,"z");
end
if(_GET.pin == "blue")then
_blue = " selected=true";
uart.write(0,"]");
end
client:send(buf);
client:close();
collectgarbage();
end)
end)
Если делаем своё приложение (см ниже), то кнопки обзываем в соответствии с родным пультом ресивера, каждой кнопке назначаем букву, цифру или символ в соответствии с таблицей:
Дополнительная информация
Таблица символов:
a = 97
b = 98
c = 99
d = 100
e = 101
f = 102
g = 103
h = 104
i = 105
j = 106
k = 107
l = 108
m = 109
n = 110
o = 111
p = 112
q = 113
r = 114
s = 115
t = 116
u = 117
v = 118
w = 119
x = 120
y = 121
z = 122
0 = 48
1 = 49
2 = 50
3 = 51
4 = 52
5 = 53
6 = 54
7 = 55
8 = 56
9 = 57
' = 39
, = 44
— = 45
. = 46
/ = 47
: = 58
= = 61
[ = 91
\ = 92
] = 93
` = 96
В моём сделано для триколора gs9305 так (если команды устраивают, не важно для какого пульта, то можно оставлять как есть):
т.е. если esp видит нажатие кнопки «ok» на ардуинку отправляется «a», если нажимаем «up» — отправляется «b» и т.п., согласно таблице символов можно добавить свои.
Теперь надо прошить ардуино, скетч такой (нужны библиотеки IRremote.h и IRremoteInt.h):
Дополнительная информация
#include <IRremote.h>
#include <IRremoteInt.h>
IRsend irsend;
void setup()
{
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
int x = Serial.read();
{
if (x == 97) {
irsend.sendNEC(0x8C837, 32);
delay(40);
}
if (x == 98) {
irsend.sendNEC(0x88877, 32);
delay(40);
}
if (x == 99) {
irsend.sendNEC(0x848B7, 32);
delay(40);
}
if (x == 100) {
irsend.sendNEC(0x828D7, 32);
delay(40);
}
if (x == 101) {
irsend.sendNEC(0x8A857, 32);
delay(40);
}
if (x == 102) {
irsend.sendNEC(0x86897, 32);
delay(40);
}
if (x == 103) {
irsend.sendNEC(0x838C7, 32);
delay(40);
}
if (x == 104) {
irsend.sendNEC(0x8D827, 32);
delay(40);
}
if (x == 105) {
irsend.sendNEC(0x8EA15, 32);
delay(40);
}
if (x == 106) {
irsend.sendNEC(0x8C03F, 32);
delay(40);
}
if (x == 107) {
irsend.sendNEC(0x820DF, 32);
delay(40);
}
if (x == 108) {
irsend.sendNEC(0x8A05F, 32);
delay(40);
}
if (x == 109) {
irsend.sendNEC(0x8609F, 32);
delay(40);
}
if (x == 110) {
irsend.sendNEC(0x8E01F, 32);
delay(40);
}
if (x == 111) {
irsend.sendNEC(0x810EF, 32);
delay(40);
}
if (x == 112) {
irsend.sendNEC(0x8906F, 32);
delay(40);
}
if (x == 113) {
irsend.sendNEC(0x850AF, 32);
delay(40);
}
if (x == 114) {
irsend.sendNEC(0x8D02F, 32);
delay(40);
}
if (x == 115) {
irsend.sendNEC(0x8827D, 32);
delay(40);
}
if (x == 116) {
irsend.sendNEC(0x830CF, 32);
delay(40);
}
if (x == 117) {
irsend.sendNEC(0x8708F, 32);
delay(40);
}
if (x == 118) {
irsend.sendNEC(0x818E7, 32);
delay(40);
}
if (x == 119) {
irsend.sendNEC(0x8BA45, 32);
delay(40);
}
if (x == 120) {
irsend.sendNEC(0x800FF, 32);
delay(40);
}
if (x == 121) {
irsend.sendNEC(0x8B847, 32);
delay(40);
}
if (x == 122) {
irsend.sendNEC(0x858A7, 32);
delay(40);
}
if (x == 93) {
irsend.sendNEC(0x87887, 32);
delay(40);
}
}
}
}
т.е. согласно приведенным выше кей кодам, при отправке с esp кода «a» на ардуино приходит «97», при отправке с esp «b» на ардуино приходит «98» и т.д.
Управление с ir происходит с ардуино, esp нужна нам только для отправки команд.
Т.е. например строка скетча
irsend.sendNEC(0x8C837, 32);
просто эмулирует нажатие кнопки на пульте, где 8C837 — код кнопки пульта (если NEC протокол, про остальные протоколы в гугл, там все есть).
Как узнать код кнопок обсосано в гугле давным-давно.
не буду переписывать чужие статьи, дам ссылку для примера (запрос поиска «Универсальный пульт на Arduino»), нужен будет ir приемник, я использовал от старого dvd плеера, потом припаял его обратно):
habr.com/post/254761/
Теперь о подключениях:
Соединяем uart дуины и есп так:
со стороны дуины — rx; со стороны esp — tx. Вторую пару не соединять!
Подключение ir led к дуине: "+" — на 3пин, землю — на землю.
tx ардуины не соединять с rx esp! иначе по каналу пойдет мусор!
Запихиваем все в корпус.
Ir диод размещаем в зоне приемника ресивера.
ESP с подложкой (5->3.3), питаем обе платы от сотовой зарядки на 5 вольт.
Теперь о приложении, делал я его в app inventor 2:
выкладываю как само приложение, так и исходник для экспорта, (lowresolution — для 3.5" телов), можно редактировать приложение под свой пульт (файл .aia).
drive.google.com/file/d/1O9hEsRdWiC9t31XlDq9_0xqIcnR0HJtY/view?usp=sharing
Дополнительная информация
После установки жмем на шестеренку, вводим ip из начала рассказа (192.168.0.77), потом «ок» и опять жмем шестеренку.
может за давностью лет что и забыл, пишите, поправлю.
p.s. про облачные сервисы (Blink и т.п.) не писать, ешьте их сами)
p.p.s. на момент построения устройства iremote на esp не работала, поэтому сделано через ардуино.
Спасибо.
Повторюсь, не знаю как сейчас, 3 года назад iremote на esp не фурычила) её усиленно допиливали, но я не стал ждать, поэтому не знаю, чем дело кончилось, так вышло быстрее и на 50р дороже)
1. Часы с анимацией адресуемой лентой. Пишут (сам правда не проверял) что ESP ее плохо обрабатывает, так как прерывания на работу с вафлей могут сбить «заполнение» ленты. По этому часы на на ардуине, а вот время они берут из инета по вафле через ESP.
2. Стрелочные индикаторы температуры/давления/co2/и т.д. для погодной станции. Прием данных с помощью ESP по вафле через MQTT от самой погодной станции, а вот шаговым двигателем стрелочных индикаторов рулит ардуина (без драйвера шагового двигателя), так как у нее нагрузочная способность выходов в 4 раза выше выше.
Ну и у меня драйвера из ардуин умные получились. принимают JSon, настраиваются конечные точки (физические в градусах и логические в реальном значении температуры), имеют собственное имя, можно повесить несколько таких «драйверов» на один UART выход ESP.
просто 10 строк простого (псевдо)кода написать для хорошего человека не жалко же, а выглядело бы красивее, чем всё, что вы написали до этого)
а вообще сейчас всё это как грязь стоит, экономически никакой разницы использовать один, три или десять мк в штучной поделке, зато ноги, вычислительная мощность и свободная флеш останется)
и в плане энергопотребления — на фоне вайфая, один дополнительный спящий мк совершенно ни на что не повлияет
esp8266.ru/forum/threads/ir-remote-biblioteka-dlja-upravlenija-texnikoj-po-ik-kanalu.252
Напомнило не к ночи Казус (ровно как и другие тусовки свидетелей K&R) — чувак полтора часа занимается обсером ардуиншиков с полным нулем в голове в плане конструктива.
github.com/markszabo/IRremoteESP8266
Ссылочка на библиотеку
github.com/markszabo/IRremoteESP8266
Если уж осилили Си для ардуино, почему бы не сделать это для ESP?
Чем городить избыточное и ненадежное железо c тормозным интерпретатором.
Опять же ни одной инструкции для не сильно разбирающихся людей навроде меня, чтоб не сильно вникая взять и сделать)
Выскажу только по поводу самой концепции… Управление по телефону — ну очень не юзабельно. Почему было не оставить родной пульт? По одной есп-шке в каждую комнату. с приемником ir и тупо дублирование принимаемых команд… Да, тогда придетя таскать пульт вкаждую комнату. Но ведь и телефон тоже? А завести в каждой комнате отдельный пульт проще, чем отдельный телефон :)
У моего телевизора есть родное приложение — пульт, работающий по сети. Установил — и управляй… да еше для «удобства» разные кнопки сгруппированы и разнесены на разные экраны… да еще… в общем — ставил я это приложение один раз — показалось хорошей идеей. Был неправ.
Даже case смотрелся бы красивее. А про организовать одну табличку, куда сложить все кодовые посылки по индексу — я вообще молчу.
А индусский — это когда бессмысленно излишне усложнено и запутано
Да, шахи по приметам — труЪ. Ибо с бородой.
Поэтому оптимизация кода и архитектура алгоритма — это далеко не пустые слова…
Надеюсь после этого придёт осознание термина coding art.
Хотя… «Мы сюда деградировать приходим, а не сложные ребусы разгадывать.»
Для этого, на мой взгляд, и прелесть таких обзоров.
В случае чего проще передёрнуть питание только esp, чем всего ресивера. Ну и с паяльником не надо бегать в случае замены ресивера.