• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Управление телевизором и другими устройствами c помощью смартфона

waskez

New member
Прекрасно, выложите потом свои наработки посмотреть?
Проект еще сырой, так как не определился - использовать SDK, Sming (у меня не работает) или PvSDK (надо изучать). На Raspberry Pi крутиться веб сервер node.js + mosca mqtt + mongodb + angularjs (пользовательский интерфейс для пульта и EPG).
1.JPG 2.JPG
 
Последнее редактирование:

waskez

New member
Коды кнопок пультов ДУ – Samsung TV и Motorola STB VIP 1003
Код:
static uint32_t remoteCodes[] =
{
        //////// SAMSUNG TV /////////
        0xE0E040BF, // POWER      [0]
        0xE0E0807F, // SOURCE     [1]
        0xE0E0D12E, // HDMI       [2]
        0xE0E020DF, // 1          [3]
        0xE0E0A05F, // 2          [4]
        0xE0E0609F, // 3          [5]
        0xE0E010EF, // 4          [6]
        0xE0E0906F, // 5          [7]
        0xE0E050AF, // 6          [8]
        0xE0E030CF, // 7          [9]
        0xE0E0B04F, // 8          [10]
        0xE0E0708F, // 9          [11]
        0xE0E08877, // 0          [12]
        0xE0E034CB, // TTX/MIX    [13]
        0xE0E0C837, // PRE-CH     [14]
        0xE0E0F00F, // MUTE       [15]
        0xE0E0E01F, // VOL +      [16]
        0xE0E0D02F, // VOL -      [17]
        0xE0E048B7, // CH +       [18]
        0xE0E008F7, // CH -       [19]
        0xE0E0D629, // CH-LIST    [20]
        0xE0E09E62, // SMART HUB  [21]
        0xE0E058A7, // MENU       [22]
        0xE0E0F20D, // GUIDE      [23]
        0xE0E0D22D, // TOOLS      [24]
        0xE0E0F807, // INFO       [25]
        0xE0E01AE6, // RETURN     [26]
        0xE0E0B44B, // EXIT       [27]
        0xE0E0A659, // LEFT       [28]
        0xE0E046B9, // RIGHT      [29]
        0xE0E006F9, // UP         [30]
        0xE0E08679, // DOWN       [31]
        0xE0E016E9, // OK         [32]
        0xE0E036C9, // A          [33]
        0xE0E028D7, // B          [34]
        0xE0E0A857, // C          [35]
        0xE0E06897, // D          [36]
        0xE0E014EB, // P.MODE     [37]
        0xE0E07689, // SRS        [38]
        0xE0E000FF, // DUAL I-II  [39]
        0xE0E0FC04, // E-MANUAL   [40]
        0xE0E07C83, // P.SIZE     [41]
        0xE0E0A45B, // AD/SUBT    [42]
        0xE0E0A25D, // REW        [43]
        0xE0E012ED, // FWD        [44]
        0xE0E052AD, // PAUSE      [45]
        0xE0E0926D, // REC        [46]
        0xE0E0E21D, // PLAY       [47]
        0xE0E0629D,  // STOP      [48]
        ///// MOTOROLA VIP-1003 //////
        0x1000085e, // POWER     [49]
        0x10003d56, // VOL-         [50]
        0x10004d57, // VOL+         [51]
        0x10006b57, // MUTE         [52]
        0x10001d54, // 0         [53]
        0x10005954, // 1         [54]
        0x10006955, // 2         [55]
        0x10007956, // 3         [56]
        0x10001c53, // 4         [57]
        0x10002c54, // 5         [58]
        0x10003c55, // 6         [59]
        0x10004c56, // 7         [60]
        0x10005c57, // 8         [61]
        0x10006c58, // 9         [62]
        0x10005b56, // BACK         [63]
        0x10004852, // CH-         [64]
        0x10003851, // CH+         [65]
        0x10006a56, // EPG         [66]
        0x10007c59, // INFO         [67] - jāpārbauda, nesakrīt checksum
        0x10005853, // LEFT         [68]
        0x10006854, // RIGHT     [69]
        0x10000f55, // OK         [70]
        0x10002f57  // PORTAL     [71]
};

static uint32_t digitCodes[] =
{
        0x10001d54, // 0         [53]
        0x10005954, // 1         [54]
        0x10006955, // 2         [55]
        0x10007956, // 3         [56]
        0x10001c53, // 4         [57]
        0x10002c54, // 5         [58]
        0x10003c55, // 6         [59]
        0x10004c56, // 7         [60]
        0x10005c57, // 8         [61]
        0x10006c58, // 9         [62]
};
 
Последнее редактирование:

waskez

New member
Использовал пример esp_mqtt с UDK
Код:
#define SAMSUNG_HDR_MARK     4500
#define SAMSUNG_HDR_SPACE     4500
#define SAMSUNG_BIT_MARK     560
#define SAMSUNG_ONE_SPACE     1690
#define SAMSUNG_ZERO_SPACE  560
#define SAMSUNG_RPT_SPACE     46000

#define MOTO_HDR_MARK        2640 // t*8
#define MOTO_HDR_SPACE        1980 // t*6
#define MOTO_T1                330 // t
#define MOTO_T2                660 //t*2
#define MOTO_REPEAT_MASK    0x800008
#define MOTO_GAP            73800

typedef struct
{
    char *ir_cmdName;
    int8_t ir_cmdLen;
    uint8_t idx;
    void (*ir_exeCmd)(uint8_t id);
}ir_commandType;

#define ir_cmdNum    74

ir_commandType ir_cmd[ir_cmdNum]={
  /////////// SAMSUNG TV ///////////
  {"tvpower", 7, 0, ir_exeCmdSamsung},
  {"tvsource", 8, 1, ir_exeCmdSamsung},
  {"tvhdmi", 6, 2, ir_exeCmdSamsung},
  {"tv1", 3, 3, ir_exeCmdSamsung},
  {"tv2", 3, 4, ir_exeCmdSamsung},
  {"tv3", 3, 5, ir_exeCmdSamsung},
  {"tv4", 3, 6, ir_exeCmdSamsung},
  {"tv5", 3, 7, ir_exeCmdSamsung},
  {"tv6", 3, 8, ir_exeCmdSamsung},
  {"tv7", 3, 9, ir_exeCmdSamsung},
  {"tv8", 3, 10, ir_exeCmdSamsung},
  {"tv9", 3, 11, ir_exeCmdSamsung},
  {"tv0", 3, 12, ir_exeCmdSamsung},
  {"tvttxmix", 8, 13, ir_exeCmdSamsung},
  {"tvprech", 7, 14, ir_exeCmdSamsung},
  {"tvmute", 6, 15, ir_exeCmdSamsung},
  {"tvvol+", 6, 16, ir_exeCmdSamsung},
  {"tvvol-", 6, 17, ir_exeCmdSamsung},
  {"tvch+", 5, 18, ir_exeCmdSamsung},
  {"tvch-", 5, 19, ir_exeCmdSamsung},
  {"tvchlist", 8, 20, ir_exeCmdSamsung},
  {"tvsmarthub", 10, 21, ir_exeCmdSamsung},
  {"tvmenu", 6, 22, ir_exeCmdSamsung},
  {"tvguide", 7, 23, ir_exeCmdSamsung},
  {"tvtools", 7, 24, ir_exeCmdSamsung},
  {"tvinfo", 6, 25, ir_exeCmdSamsung},
  {"tvreturn", 8, 26, ir_exeCmdSamsung},
  {"tvexit", 6, 27, ir_exeCmdSamsung},
  {"tvleft", 6, 28, ir_exeCmdSamsung},
  {"tvright", 7, 29, ir_exeCmdSamsung},
  {"tvup", 4, 30, ir_exeCmdSamsung},
  {"tvdown", 6, 31, ir_exeCmdSamsung},
  {"tvok", 4, 32, ir_exeCmdSamsung},
  {"tva", 3, 33, ir_exeCmdSamsung},
  {"tvb", 3, 34, ir_exeCmdSamsung},
  {"tvc", 3, 35, ir_exeCmdSamsung},
  {"tvd", 3, 36, ir_exeCmdSamsung},
  {"tvpmode", 7, 37, ir_exeCmdSamsung},
  {"tvsrs", 5, 38, ir_exeCmdSamsung},
  {"tvdual", 6, 39, ir_exeCmdSamsung},
  {"tvemanual", 9, 40, ir_exeCmdSamsung},
  {"tvpsize", 7, 41, ir_exeCmdSamsung},
  {"tvadsubt", 8, 42, ir_exeCmdSamsung},
  {"tvrew", 5, 43, ir_exeCmdSamsung},
  {"tvfwd", 5, 44, ir_exeCmdSamsung},
  {"tvpause", 7, 45, ir_exeCmdSamsung},
  {"tvrec", 5, 46, ir_exeCmdSamsung},
  {"tvplay", 6, 47, ir_exeCmdSamsung},
  {"tvstop", 6, 48, ir_exeCmdSamsung},
  //////// MOTOROLA STB VIP-1003 /////////
  {"stbpower", 8, 49, ir_exeCmdMotorola},
  {"stbvol-", 7, 50, ir_exeCmdMotorola},
  {"stbvol+", 7, 51, ir_exeCmdMotorola},
  {"stbmute", 7, 52, ir_exeCmdMotorola},
  {"stb0", 4, 53, ir_exeCmdMotorola},
  {"stb1", 4, 54, ir_exeCmdMotorola},
  {"stb2", 4, 55, ir_exeCmdMotorola},
  {"stb3", 4, 56, ir_exeCmdMotorola},
  {"stb4", 4, 57, ir_exeCmdMotorola},
  {"stb5", 4, 58, ir_exeCmdMotorola},
  {"stb6", 4, 59, ir_exeCmdMotorola},
  {"stb7", 4, 60, ir_exeCmdMotorola},
  {"stb8", 4, 61, ir_exeCmdMotorola},
  {"stb9", 4, 62, ir_exeCmdMotorola},
  {"stbback", 7, 63, ir_exeCmdMotorola},
  {"stbch+", 6, 64, ir_exeCmdMotorola},
  {"stbch-", 6, 65, ir_exeCmdMotorola},
  {"stbepg", 6, 66, ir_exeCmdMotorola},
  {"stbinfo", 7, 67, ir_exeCmdMotorola},
  {"stbleft", 7, 68, ir_exeCmdMotorola},
  {"stbright", 8, 69, ir_exeCmdMotorola},
  {"stbok", 5, 70, ir_exeCmdMotorola},
  {"stbportal", 9, 71, ir_exeCmdMotorola},
  //////////////////////////////////////
  {"powerall", 8, 0, ir_exeCmdPowerBoth}
};

static void ICACHE_FLASH_ATTR mark(uint32_t us)
{
    GPIO_OUTPUT_SET(LED_GPIO, 1);
    os_delay_us(us);
}

static void ICACHE_FLASH_ATTR space(uint32_t us)
{
    GPIO_OUTPUT_SET(LED_GPIO, 0);
    os_delay_us(us);
}

static void ICACHE_FLASH_ATTR sendSamsung(uint32_t data)
{
    uint32_t tmpData = 0;
    uint8_t r;
    uint8_t i;

    for (r = 0; r < 2; r++)
    {
        tmpData = data;

        mark(SAMSUNG_HDR_MARK);
        space(SAMSUNG_HDR_SPACE);
        for (i = 0; i < 32; i++)
        {
            if (tmpData & TOPBIT)
            {
                mark(SAMSUNG_BIT_MARK);
                space(SAMSUNG_ONE_SPACE);
            }
            else
            {
                mark(SAMSUNG_BIT_MARK);
                space(SAMSUNG_ZERO_SPACE);
            }
            tmpData <<= 1;
        }
        mark(SAMSUNG_BIT_MARK);
        space(SAMSUNG_RPT_SPACE);
    }
}

static void ICACHE_FLASH_ATTR sendMotorola(uint32_t data)
{
    uint32_t tmpData = 0;
    uint8_t r;
    uint8_t i;

    for (r = 0; r < 3; r++)
    {
        if (r == 2)
        {
            tmpData = data + MOTO_REPEAT_MASK;
        }
        else
        {
            tmpData = data;
        }

        mark(MOTO_HDR_MARK); // pre-bit "1"
        space(MOTO_HDR_SPACE); // pre-bit "0"
        mark(MOTO_T2); // start-bit "1"

        for (i = 0; i < 32; i++) // 32 baiti
        {
            if (tmpData & TOPBIT) // 1 is mark, then space
            {
                mark(MOTO_T1);
                space(MOTO_T1);
            }
            else // 0 is space, then mark
            {
                space(MOTO_T1);
                mark(MOTO_T1);
            }
            tmpData <<= 1;
        }
        space(MOTO_GAP);
    }
}

static int16_t ICACHE_FLASH_ATTR ir_cmdSearch(int8_t cmdLen, uint8_t *pCmd)
{
  int16_t i;

  if(cmdLen == 0)
  {
    return 0;
  }
  else if(cmdLen > 0)
  {
     for(i=0; i < ir_cmdNum; i++)
     {
         //os_printf("%d len %d\r\n", cmdLen, ir_cmd[i].ir_cmdLen);
         if(cmdLen == ir_cmd[i].ir_cmdLen)
         {
             //os_printf("%s cmp %s\r\n", pCmd, ir_cmd[i].ir_cmdName);
             if(os_memcmp(pCmd, ir_cmd[i].ir_cmdName, cmdLen) == 0) //think add cmp len first
             {
                 return i;
             }
         }
     }
  }
  return -1;
}

void ICACHE_FLASH_ATTR ir_exeCmdSamsung(uint8_t idx)
{
    sendSamsung(remoteCodes[idx]);
}

void ICACHE_FLASH_ATTR ir_exeCmdMotorola(uint8_t idx)
{
    sendMotorola(remoteCodes[idx]);
}

void ICACHE_FLASH_ATTR ir_exeCmdPowerBoth(uint8_t idx)
{
    sendSamsung(remoteCodes[0]);
    sendMotorola(remoteCodes[49]);
}

void mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len)
{
    int16_t cmdId;
    uint8_t cmdIdx;
    int digit;
    uint8_t i;

    char *topicBuf = (char*)os_zalloc(topic_len+1);
    char *dataBuf = (char*)os_zalloc(data_len+1);

    MQTT_Client* client = (MQTT_Client*)args;

    os_memcpy(topicBuf, topic, topic_len);
    topicBuf[topic_len] = 0;

    os_memcpy(dataBuf, data, data_len);
    dataBuf[data_len] = 0;

    INFO("Receive topic: %s, data: %s \r\n", topicBuf, dataBuf);

    //////////////////////////////////////////////////////////////
    // 1. Pārbaudam vai komanda sākas ar "ch"
    if(dataBuf[0] == 'c' && dataBuf[1] == 'h')
    {
        i = 2;
        while(dataBuf[i] != 0)
        {
            digit = dataBuf[i] - '0';
            //INFO("Digit: %d\r\n", digit);
            sendMotorola(digitCodes[digit]);
            i++;
        }
    }
    else
    {
        cmdId = ir_cmdSearch(data_len, dataBuf);
        if(cmdId != -1)
        {
            cmdIdx = ir_cmd[cmdId].idx;
            ir_cmd[cmdId].ir_exeCmd(cmdIdx);
        }
    }
    //////////////////////////////////////////////////////////////

    os_free(topicBuf);
    os_free(dataBuf);
}
 
Последнее редактирование:

anakod

Moderator
Команда форума
waskez, а почему Sming не заработал? Могу подсказать по его инсталляции, если есть какие-то проблемы.
 

waskez

New member
waskez, а почему Sming не заработал? Могу подсказать по его инсталляции, если есть какие-то проблемы.
Попробовал пример MqttClient_Hello, но ESP8266 не принимает и не отсылает данные:
Station configuration was updated to: xxxx
I'm CONNECTED
MQTT start connection
connect to: 192.168.0.113
TcpConnection::connect result:, 0
timeout updating: 70 -> 65535
subscription 'remote/cmd' registered
realloc 23 -> 169
OnConnected
TCP connected
onReadyToSendData: 0
TCP connection send: 40 (40)
TcpClient request completed
TCP sent: 40
onReadyToSendData: 2
TCP received: (null)
TCP connection closing
-TCP connection
Let's publish message now!
Let's publish message now!
 
Последнее редактирование:

anakod

Moderator
Команда форума
TCP sent: 40 говорит о том что данные были корректно отправлены. Правильно ли Вы их получаете\подписались на прием?
 

waskez

New member
TCP sent: 40 говорит о том что данные были корректно отправлены. Правильно ли Вы их получаете\подписались на прием?
В лог файле брокера следующие строки:

2015-05-17 19:45:02,894 INFO - Client esp8266 connected
2015-05-17 19:45:02,921 INFO - Client esp8266 disconnected

тоесть сразу отключается. В COM терминале через каждые 20 секунд: “Let's publish message now!”
 

Kutrik

New member
Я для управления телевизором использовал nodeMcu (https://github.com/nodemcu/nodemcu-firmware/blob/master/lua_examples/irsend.lua) и моё приложение под Андройд. Единственное чего не хватает, это чтение ИК кодов. Может кто подскажет как это реализовать. Я пробовал использовать gpio.trig, и получаю при этом список прерываний, но этот список отличается от того который я получаю на Ардуине. Знатоки помогите как прочитать ИК код в nodeMcu.
 

waskez

New member
Побаловался с ESP8266 Arduiono IDE, тот же проект, но без NE555:
Код:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char *ssid =  "xxx";     
const char *pass =  "xxx"; 

IPAddress server(192, 168, 0, 113);

#define TOPBIT             0x80000000

#define SAMSUNG_HDR_MARK     4500
#define SAMSUNG_HDR_SPACE     4500
#define SAMSUNG_BIT_MARK     560
#define SAMSUNG_ONE_SPACE     1690
#define SAMSUNG_ZERO_SPACE      560
#define SAMSUNG_RPT_SPACE     46000

#define MOTO_HDR_MARK        2640 // t*8
#define MOTO_HDR_SPACE        1980 // t*6
#define MOTO_T1            330 // t
#define MOTO_T2            660 //t*2
#define MOTO_REPEAT_MASK    0x800008
#define MOTO_GAP        73800

float cycle_duration; // The duration of one cycle in us

#define codesCount    74

unsigned int remoteCodes[] =
{
  //////// SAMSUNG TV /////////
  0xE0E040BF, // POWER      [0]
  0xE0E0807F, // SOURCE     [1]
  0xE0E0D12E, // HDMI       [2]
  0xE0E020DF, // 1          [3]
  0xE0E0A05F, // 2          [4]
  0xE0E0609F, // 3          [5]
  0xE0E010EF, // 4          [6]
  0xE0E0906F, // 5          [7]
  0xE0E050AF, // 6          [8]
  0xE0E030CF, // 7          [9]
  0xE0E0B04F, // 8          [10]
  0xE0E0708F, // 9          [11]
  0xE0E08877, // 0          [12]
  0xE0E034CB, // TTX/MIX    [13]
  0xE0E0C837, // PRE-CH     [14]
  0xE0E0F00F, // MUTE       [15]
  0xE0E0E01F, // VOL +      [16]
  0xE0E0D02F, // VOL -      [17]
  0xE0E048B7, // CH +       [18]
  0xE0E008F7, // CH -       [19]
  0xE0E0D629, // CH-LIST    [20]
  0xE0E09E62, // SMART HUB  [21]
  0xE0E058A7, // MENU       [22]
  0xE0E0F20D, // GUIDE      [23]
  0xE0E0D22D, // TOOLS      [24]
  0xE0E0F807, // INFO       [25]
  0xE0E01AE6, // RETURN     [26]
  0xE0E0B44B, // EXIT       [27]
  0xE0E0A659, // LEFT       [28]
  0xE0E046B9, // RIGHT      [29]
  0xE0E006F9, // UP         [30]
  0xE0E08679, // DOWN       [31]
  0xE0E016E9, // OK         [32]
  0xE0E036C9, // A          [33]
  0xE0E028D7, // B          [34]
  0xE0E0A857, // C          [35]
  0xE0E06897, // D          [36]
  0xE0E014EB, // P.MODE     [37]
  0xE0E07689, // SRS        [38]
  0xE0E000FF, // DUAL I-II  [39]
  0xE0E0FC04, // E-MANUAL   [40]
  0xE0E07C83, // P.SIZE     [41]
  0xE0E0A45B, // AD/SUBT    [42]
  0xE0E0A25D, // REW        [43]
  0xE0E012ED, // FWD        [44]
  0xE0E052AD, // PAUSE      [45]
  0xE0E0926D, // REC        [46]
  0xE0E0E21D, // PLAY       [47]
  0xE0E0629D,  // STOP      [48]
  ///// MOTOROLA VIP-1003 //////
  0x1000085e, // POWER       [49]
  0x10003d56, // VOL-       [50]
  0x10004d57, // VOL+       [51]
  0x10006b57, // MUTE       [52]
  0x10001d54, // 0       [53]
  0x10005954, // 1       [54]
  0x10006955, // 2       [55]
  0x10007956, // 3       [56]
  0x10001c53, // 4       [57]
  0x10002c54, // 5       [58]
  0x10003c55, // 6       [59]
  0x10004c56, // 7       [60]
  0x10005c57, // 8       [61]
  0x10006c58, // 9       [62]
  0x10005b56, // BACK       [63]
  0x10004852, // CH-       [64]
  0x10003851, // CH+       [65]
  0x10006a56, // EPG       [66]
  0x10007c59, // INFO       [67] - jāpārbauda, nesakrīt checksum
  0x10005853, // LEFT       [68]
  0x10006854, // RIGHT       [69]
  0x10000f55, // OK       [70]
  0x10002f57  // PORTAL       [71]
};

unsigned int digitCodes[] =
{
  0x10001d54, // 0
  0x10005954, // 1
  0x10006955, // 2
  0x10007956, // 3
  0x10001c53, // 4
  0x10002c54, // 5
  0x10003c55, // 6
  0x10004c56, // 7
  0x10005c57, // 8
  0x10006c58, // 9
};

typedef struct
{
   String cmdName;
   byte cmdLength;
   byte idx;
   void (*ir_exeCmd)(byte id);
} remoteCmd;

remoteCmd cmd[codesCount]
{
  /////////// SAMSUNG TV ///////////
  {"tvpower", 7, 0, ir_exeCmdSamsung},
  {"tvsource", 8, 1, ir_exeCmdSamsung},
  {"tvhdmi", 6, 2, ir_exeCmdSamsung},
  {"tv1", 3, 3, ir_exeCmdSamsung},
  {"tv2", 3, 4, ir_exeCmdSamsung},
  {"tv3", 3, 5, ir_exeCmdSamsung},
  {"tv4", 3, 6, ir_exeCmdSamsung},
  {"tv5", 3, 7, ir_exeCmdSamsung},
  {"tv6", 3, 8, ir_exeCmdSamsung},
  {"tv7", 3, 9, ir_exeCmdSamsung},
  {"tv8", 3, 10, ir_exeCmdSamsung},
  {"tv9", 3, 11, ir_exeCmdSamsung},
  {"tv0", 3, 12, ir_exeCmdSamsung},
  {"tvttxmix", 8, 13, ir_exeCmdSamsung},
  {"tvprech", 7, 14, ir_exeCmdSamsung},
  {"tvmute", 6, 15, ir_exeCmdSamsung},
  {"tvvol+", 6, 16, ir_exeCmdSamsung},
  {"tvvol-", 6, 17, ir_exeCmdSamsung},
  {"tvch+", 5, 18, ir_exeCmdSamsung},
  {"tvch-", 5, 19, ir_exeCmdSamsung},
  {"tvchlist", 8, 20, ir_exeCmdSamsung},
  {"tvsmarthub", 10, 21, ir_exeCmdSamsung},
  {"tvmenu", 6, 22, ir_exeCmdSamsung},
  {"tvguide", 7, 23, ir_exeCmdSamsung},
  {"tvtools", 7, 24, ir_exeCmdSamsung},
  {"tvinfo", 6, 25, ir_exeCmdSamsung},
  {"tvreturn", 8, 26, ir_exeCmdSamsung},
  {"tvexit", 6, 27, ir_exeCmdSamsung},
  {"tvleft", 6, 28, ir_exeCmdSamsung},
  {"tvright", 7, 29, ir_exeCmdSamsung},
  {"tvup", 4, 30, ir_exeCmdSamsung},
  {"tvdown", 6, 31, ir_exeCmdSamsung},
  {"tvok", 4, 32, ir_exeCmdSamsung},
  {"tva", 3, 33, ir_exeCmdSamsung},
  {"tvb", 3, 34, ir_exeCmdSamsung},
  {"tvc", 3, 35, ir_exeCmdSamsung},
  {"tvd", 3, 36, ir_exeCmdSamsung},
  {"tvpmode", 7, 37, ir_exeCmdSamsung},
  {"tvsrs", 5, 38, ir_exeCmdSamsung},
  {"tvdual", 6, 39, ir_exeCmdSamsung},
  {"tvemanual", 9, 40, ir_exeCmdSamsung},
  {"tvpsize", 7, 41, ir_exeCmdSamsung},
  {"tvadsubt", 8, 42, ir_exeCmdSamsung},
  {"tvrew", 5, 43, ir_exeCmdSamsung},
  {"tvfwd", 5, 44, ir_exeCmdSamsung},
  {"tvpause", 7, 45, ir_exeCmdSamsung},
  {"tvrec", 5, 46, ir_exeCmdSamsung},
  {"tvplay", 6, 47, ir_exeCmdSamsung},
  {"tvstop", 6, 48, ir_exeCmdSamsung},
  //////// MOTOROLA STB VIP-1003 /////////
  {"stbpower", 8, 49, ir_exeCmdMotorola},
  {"stbvol-", 7, 50, ir_exeCmdMotorola},
  {"stbvol+", 7, 51, ir_exeCmdMotorola},
  {"stbmute", 7, 52, ir_exeCmdMotorola},
  {"stb0", 4, 53, ir_exeCmdMotorola},
  {"stb1", 4, 54, ir_exeCmdMotorola},
  {"stb2", 4, 55, ir_exeCmdMotorola},
  {"stb3", 4, 56, ir_exeCmdMotorola},
  {"stb4", 4, 57, ir_exeCmdMotorola},
  {"stb5", 4, 58, ir_exeCmdMotorola},
  {"stb6", 4, 59, ir_exeCmdMotorola},
  {"stb7", 4, 60, ir_exeCmdMotorola},
  {"stb8", 4, 61, ir_exeCmdMotorola},
  {"stb9", 4, 62, ir_exeCmdMotorola},
  {"stbback", 7, 63, ir_exeCmdMotorola},
  {"stbch+", 6, 64, ir_exeCmdMotorola},
  {"stbch-", 6, 65, ir_exeCmdMotorola},
  {"stbepg", 6, 66, ir_exeCmdMotorola},
  {"stbinfo", 7, 67, ir_exeCmdMotorola},
  {"stbleft", 7, 68, ir_exeCmdMotorola},
  {"stbright", 8, 69, ir_exeCmdMotorola},
  {"stbok", 5, 70, ir_exeCmdMotorola},
  {"stbportal", 9, 71, ir_exeCmdMotorola},
  {"powerall", 8, 0, ir_exeCmdPowerBoth}
};

void callback(const MQTT::Publish& pub) {
  String command = pub.payload_string();
  byte cmdLen = pub.payload_len();
  byte i;
  int digit;
  if(cmdLen > 0)
  {
    if(command.startsWith("ch"))
    {
      String channel = command.substring(2);
      for(i=0; i < channel.length();i++)
      {
        digit = channel.substring(i, i+1).toInt();
        sendMotorola(digitCodes[digit]);
      }
    }
    else
    {
      for(i=0; i < codesCount; i++)
      {
        if(cmdLen == cmd[i].cmdLength)
        {
          if(cmd[i].cmdName == command)
          {
            cmd[i].ir_exeCmd(cmd[i].idx);
            break;
          }
        }
      }
    }
  }
  Serial.print(pub.topic());
  Serial.print(" => ");
  Serial.println(pub.payload_string());
}

PubSubClient client(server);

void bitbangOutput(int time)
{
  int loops = round(time/(cycle_duration));
  float half_cycle = cycle_duration/2;
  int i=0;
  for(i=0; i<loops; i++)
  {
    digitalWrite(2, LOW);
    delayMicroseconds(half_cycle);
    digitalWrite(2, HIGH);
    delayMicroseconds(half_cycle);
  }
}
void ir_exeCmdSamsung(byte idx)
{
  sendSamsung(remoteCodes[idx]);
}
void ir_exeCmdMotorola(byte idx)
{
  sendMotorola(remoteCodes[idx]);
}
void ir_exeCmdPowerBoth(byte idx)
{
  sendSamsung(remoteCodes[0]);
  sendMotorola(remoteCodes[49]);
}

void mark(int time)
{
   bitbangOutput(time);
}

void space(int time)
{
   delayMicroseconds(time);
}

void sendMotorola(unsigned int data)
{
  cycle_duration=(float)1000/36;
  unsigned int tmpData = 0;
  byte r;
  byte i;

  for (r = 0; r < 3; r++)
  {
    if (r == 2)
    {
      tmpData = data + MOTO_REPEAT_MASK;
    }
    else
    {
      tmpData = data;
    }
 
    mark(MOTO_HDR_MARK); // pre-bit "1"
    space(MOTO_HDR_SPACE); // pre-bit "0"
    mark(MOTO_T2); // start-bit "1"

    for (i = 0; i < 32; i++) // 32 baiti
    {
      if (tmpData & TOPBIT) // 1 is mark, then space
      {
          mark(MOTO_T1);
          space(MOTO_T1);
      }
      else // 0 is space, then mark
      {
          space(MOTO_T1);
          mark(MOTO_T1);
      }
      tmpData <<= 1;
    }
    space(MOTO_GAP);
  }
}

void sendSamsung(unsigned int data)
{
  cycle_duration=(float)1000/38;
   
  unsigned int tmpData = 0;
  byte r;
  byte i;

  for (r = 0; r < 2; r++)
  {
    tmpData = data;

    mark(SAMSUNG_HDR_MARK);
    space(SAMSUNG_HDR_SPACE);
    for (i = 0; i < 32; i++)
    {
      if (tmpData & TOPBIT)
      {
          mark(SAMSUNG_BIT_MARK);
          space(SAMSUNG_ONE_SPACE);
      }
      else
      {
          mark(SAMSUNG_BIT_MARK);
          space(SAMSUNG_ZERO_SPACE);
      }
      tmpData <<= 1;
    }
    mark(SAMSUNG_BIT_MARK);
    space(SAMSUNG_RPT_SPACE);
  }
}

void setup()
{
  Serial.begin(115200);
  delay(10);
  Serial.println();
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);

  client.set_callback(callback);

  WiFi.begin(ssid, pass);

  int retries = 0;
  while ((WiFi.status() != WL_CONNECTED) && (retries < 10)) {
    retries++;
    delay(500);
    Serial.print(".");
  }
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("");
    Serial.println("WiFi connected");
  }

  if (client.connect("tvremoteClient")) {
    Serial.println("Connected to MQTT broker");
    client.subscribe("remote/cmd");
  }else{
    Serial.println("MQTT connect failed");
    Serial.println("Will reset and try again...");
    abort();
  }
}

void loop()
{
  client.loop();
}
 
Последнее редактирование:

rate216

New member
Мне кажется самый идеальный вариант для дома это OpenHAB (http://www.openhab.org/) и ESP8266, в качестве датчиков и исполнительных устройств, через MQTT. Заказал модули, придут, буду пробовать
 

waskez

New member
Моей целью было управлять именно ip-приставкой Motorola STB VIP-1003 (с протоколом пульта пришлось разобраться методом тыка - без осциллографа – подключил к звуковой карте компьютера TSOP1736 и начал разбирать сигналы - в сети не нашел описание протокола) + программа ТВ-передач на смартфоне.
 
Последнее редактирование:
Сверху Снизу