Управление телевизором LG LD750 с помощью Arduino через RS232

Телевизор без функции smart и не управляется через Ethernet порт, но управляется через интерфейс RS232. Для управления телевизором использовал связку Arduino Uno с Ethernet шилдом W5100 + конвертер RS-232-UART / RS232-TTL конвертер на чипе MAX3232.

конвертер RS-232-UART / RS232-TTL конвертер на чипе MAX3232
конвертер RS-232-UART / RS232-TTL конвертер на чипе MAX3232
Arduino Uno с Ethernet шилдом W5100
Arduino Uno с Ethernet шилдом W5100
Схема кабеля для подключения к телевизору
Схема кабеля для подключения к телевизору
Таблица кодов кнопок пульта телевизора LG LD750
Таблица кодов кнопок пульта телевизора LG LD750

Ниже представлен код Arduino для управления телевизором, мне не нужен был весь набор команд, такие как регулировка громкости, так как звук идет на ресивер и громкость регулируется на нем.  Организовано включение\выключение, выбор источника видеосигнала, отключение подсветки экрана (отключаю подсветку в момент просмотра на проекторе), а так же эмуляция пульта управления. Arduino соединяется с сервером умного дома через Ethernet по протоколу MQTT.

#include <SPI.h>           // Ethernet shield
#include <Ethernet.h>      // Ethernet shield
#include <PubSubClient.h>  // MQTT 

byte mac[]    = { 0x03, 0xC0, 0x44, 0x2D, 0x89, 0x12 };
byte server[] = { 192, 168, 1, 190 }; //IP Брокера
byte ip[]     = { 192, 168, 1, 111 }; //IP Клиента (Arduino)

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);
#define id_connect "myhome-RS232"
#define Prefix_subscribe "myhome/RS232/"
char buffer[100];
String Command = "";
String inputString = "";
boolean stringComplete = false;
unsigned long  k=0;

///////////////Объявляем порты ввода-вывода
const int start_DI_pin []= {2, 3}; // Порты Ввода
int n_DI_pin = sizeof(start_DI_pin) / sizeof(start_DI_pin[0])-1; //Вычисляем длинну массива

const int start_DO_pin []= {9}; //Порты Вывода
int n_DO_pin = sizeof(start_DO_pin) / sizeof(start_DO_pin[0])-1; //Вычисляем длинну массива

///////////////////////////Переменные для работы с освещением//////////////////////////////////////

////////////////////////////////////////////////////////////////////////////
void callback(char* topic, byte* payload, unsigned int length) {
    payload[length] = '\0';
   // Serial.print(topic);
   // Serial.print("=");
    String strTopic = String(topic);
    String strPayload = String((char*)payload);
   // Serial.println(strPayload);
    callback_iobroker(strTopic, strPayload);
}
////////////////////////////////////////////////////////////////////////////
void setup() {
  //Serial.begin(57600);
  //Serial.println("start");
   Serial.begin(9600);
   inputString.reserve(100);
    
//Объявляем порты Digital inputs/outputs
  for(int i=0 ;i<=n_DI_pin; i++) { pinMode (start_DI_pin [i], INPUT); }
  for(int i=0 ;i<=n_DO_pin; i++) { pinMode (start_DO_pin [i], OUTPUT); }

  Ethernet.begin(mac, ip);
  delay(1000);
  if (client.connect(id_connect)) {
   StatusLG(); //Статусы аппаратуры
    client.publish("myhome/RS232/LGTV_out", "0");
    client.publish("myhome/RS232/LGTV_in", "0");
    client.publish("myhome/RS232/LGTV_Status", "0");
    client.publish("myhome/RS232/LGTV_Source", "0");
    client.publish("myhome/RS232/LGTV_Screen_OFF", "0");
    client.publish("myhome/RS232/LGTV_PWR", "0");
    client.publish("myhome/RS232/LGTV_RemoteKey", "0");
    
    client.subscribe("myhome/RS232/#");
  }
}
/////////////////////////////////////////////////////////////////////////
void loop() {
  client.loop();

 StatusLG();
 
  if (k == 35000){
      Command = "ka 01 ff"; //***LGTV_PWR
      LGTV_CommandSend(Command);
      }
      if (k >= 65000){
      k = 0;
      Command = "xb 01 ff"; //***LGTV_PWR
      LGTV_CommandSend(Command);
      }
  k++;
  
    if (stringComplete) {
      inputString = "";
      stringComplete = false;
    }
   if (!client.connected()) {
       if (client.connect(id_connect)) {
       // Status(); //Статусы аппаратуры
       //serialEvent();
       client.subscribe("myhome/RS232/#");
       }
    }
}

//--------------------------------- Functions ---------------------------------//
/////////////////////////////////От Брокера//////////////////////////////////////////////
void callback_iobroker(String strTopic, String strPayload){
  if (strTopic == "myhome/RS232/LGTV_PWR") {
    if (strPayload == "1") {
      Command = "ka 01 01"; //*****Включить телевизор
      LGTV_CommandSend(Command);
    }
    else if (strPayload == "0") {
      Command = "ka 01 00"; //*****Выключить телевизор
      LGTV_CommandSend(Command);
    }
  } 
  //////////////////////////////////////////////////////////////////
  if (strTopic == "myhome/RS232/LGTV_RemoteKey") {
      String Key = strPayload;
      Command = "mc 01 " + Key; //*****Кнопки пульта
      LGTV_CommandSend(Command);
  }
/////////////////////////////////////////////////////////////////////// 
  if (strTopic == "myhome/RS232/LGTV_Status") {
    if (strPayload == "1") {
    /*  Command = "ka 00 ff"; //***LGTV_PWR
      LGTV_CommandSend(Command);*/
      
      Command = "xb 01 ff"; //***Проверка LGTV_Source
      LGTV_CommandSend(Command);
    }
  }
/////////////////////////////////////////////////////////////////////
  if (strTopic == "myhome/RS232/LGTV_Source") {
    if (strPayload == "tv") {
      Command = "xb 01 10"; //*****Антенна
      LGTV_CommandSend(Command);
    }
    else if (strPayload == "hdmi1") {
       Command = "xb 01 90"; //*****HDMI_1
       LGTV_CommandSend(Command);
    }
    else if (strPayload == "hdmi2") {
       Command = "xb 01 91"; //*****HDMI_2
       LGTV_CommandSend(Command);
    }
    else if (strPayload == "hdmi3") {
       Command = "xb 01 92"; //*****HDMI_3
       LGTV_CommandSend(Command);
    }
        else if (strPayload == "hdmi4") {
       Command = "xb 01 93"; //*****HDMI_4
       LGTV_CommandSend(Command);
    }
    else if (strPayload == "av1") {
       Command = "xb 01 20"; //*****AV_1
       LGTV_CommandSend(Command);
    }
    else if (strPayload == "av2") {
       Command = "xb 01 21"; //*****AV_2
       LGTV_CommandSend(Command);
    }
    else if (strPayload == "pc") {
       Command = "xb 01 40"; //*****PC
       LGTV_CommandSend(Command);
    }
  }
  /////////////////////////////////////////////////////////////////////
   if (strTopic == "myhome/RS232/LGTV_Screen_OFF") {
    if (strPayload == "1") {
      Command = "kd 01 01"; //*****Выключить экран
      LGTV_CommandSend(Command);
    }
    else if (strPayload == "0") {
       Command = "kd 01 00"; //*****Включить экран
       LGTV_CommandSend(Command);
    }
   }
}


//----------------------------------- Functions of commands ------------------------------------//
void LGTV_CommandSend(String Command) {
        delay(50); 
       int ln =  Command.length ()+1;
        char charBufVar[ln];
        Command.toCharArray(charBufVar, ln);
           int i;
            for (i = 0; i <= ln ; i++) {
              Serial.print(charBufVar[i]);
              delay(5);
            }
            Serial.print('\r');
            delay(1); 
        serialEvent();
        client.publish("myhome/RS232/LGTV_Status", "0");
        StatusLG();
}

void StatusLG(){
          String str = inputString;
          if (stringComplete == true){
            if (str == "a 01 OK00x")client.publish("myhome/RS232/LGTV_PWR", "0");
            if (str == "a 01 NG00x")client.publish("myhome/RS232/LGTV_PWR", "0");
            if (str == "a 01 OK01x")client.publish("myhome/RS232/LGTV_PWR", "1");
            if (str == "b 01 OK10x")client.publish("myhome/RS232/LGTV_Source", "TV");
            if (str == "b 01 OK90x")client.publish("myhome/RS232/LGTV_Source", "HDMI1");
            if (str == "b 01 OK91x")client.publish("myhome/RS232/LGTV_Source", "HDMI2");
            if (str == "b 01 OK92x")client.publish("myhome/RS232/LGTV_Source", "HDMI3");
            if (str == "b 01 OK93x")client.publish("myhome/RS232/LGTV_Source", "HDMI4");
            if (str == "b 01 OK20x")client.publish("myhome/RS232/LGTV_Source", "AV1");
            if (str == "b 01 OK21x")client.publish("myhome/RS232/LGTV_Source", "AV2");
            if (str == "b 01 OK40x")client.publish("myhome/RS232/LGTV_Source", "PC");
            if (str == "d 01 OK00x")client.publish("myhome/RS232/LGTV_Screen_OFF", "0");
            if (str == "d 01 OK01x")client.publish("myhome/RS232/LGTV_Screen_OFF", "1");
            client.publish("myhome/RS232/LGTV_Status", "OK");
            char charVar[20];
            inputString.toCharArray(charVar, 20);
            client.publish("myhome/RS232/LGTV_out", charVar);
          }
     }
     
////////////////////////////////////Статусы Брокеру/////////////////////////////////////
void serialEvent() {
  while (Serial.available()>0) {
    char inChar = (char)Serial.read(); 
    inputString += inChar;
    /*
                  char charVar[20];
                  inputString.toCharArray(charVar, 20);
                  client.publish("myhome/RS232/RS232_in", charVar);  
      */
    if (inChar == 'x') {
      inputString.replace(" ", "");
      char charVar[20];
      inputString.toCharArray(charVar, 20);
      client.publish("myhome/RS232/RS232_in", charVar);
      stringComplete = true;
      StatusLG();
    } 
    if (inChar == '\n') {
      inputString.replace(" ", "");
      char charVar[20];
      inputString.toCharArray(charVar, 20);
      client.publish("myhome/RS232/RS232_in", charVar);
      stringComplete = true;
      StatusLG();
    } 
  }
}

Инструкция внешнее управление телевизором LG через RS232.pdf

Подписаться
Уведомлять
guest

3 комментариев
Старые вначале
Новые вначале По голосам
Межтекстовые Отзывы
Посмотреть все комментарии
trackback

[…] внешнее управление телевизором LG через порт RS232 я уже писал. Это был телевизор модельного ряда 2010 года и разъем RS232 […]

Владимир
Владимир
2 лет назад

Может будет полезной такая информация: Проф панели от LG без WEBOS управляются и через LAN Формат взаимодействия такой: Подключаемся по telnet, по ip монитора по порту 9761 далее, как и по RS отправка команды — получение ответа Бывают нюансы — отправлять или нет перевод строки «Cr» К сожалению с телевизорами у меня так не получалось (но и телевизоров в руках было — один и не долго). При том, что телевизоры с RS — все управлялись (начиная с плазм) Но было бы странно если бы не было такой возможности/ Скорее всего надо разбираться с портом. Если кто разберется — буду признателен.… Читать далее »

3
0
Поделиться своими мыслямиx