Wi-Fi пульт

Опубликовал | 08.12.2018

Пост некрофилии, сейчас все пользуются sonoff и прочими готовыми модулями. Но почти 3 года назад мне понадобился пульт для управления ресивером триколор (нтв+ и пр.) из разных комнат.
Разводка у меня сделана так, что сигнал с ресивера подмешивается в общий кабель (телемак md-105m), т.е. можно смотреть спутник из любой комнаты, но только тот канал, что включен на ресивере. Нужно было переключать каналы находясь в другой комнате.
Для этого в продаже имеются радиопульты, но ценник на них по моему мнению сильно завышен, да и таскать его с собой из комнаты в комнату неудобно.
В итоге был собран wi-fi пульт на ESP-07 и ардуино mini, управление со смартфона, ir диод с любого старого пульта или радиомагазина. Но с течением времени я начал забывать как я все это собрал))) Поэтому описываю процедуру, пока совсем не забыл:

esp прошиваем по старой инструкции с этого топика: mysku.ru/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).



После установки жмем на шестеренку, вводим ip из начала рассказа (192.168.0.77), потом «ок» и опять жмем шестеренку.

может за давностью лет что и забыл, пишите, поправлю.

p.s. про облачные сервисы (Blink и т.п.) не писать, ешьте их сами)

Планирую купить 0 Добавить в избранное 0

(c) 2017 Источник материала

Рекламные ссылки