Wi-Fi пульт

  • Цена: $1.42
  • Пост некрофилии, сейчас все пользуются 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).

    Дополнительная информация
    Wi-Fi пульт

    Wi-Fi пульт

    Wi-Fi пульт

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

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

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

Оцените статью