m963916pp_LG-42LD-750-1440

Управление телевизором 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

Отправить ответ

Оставьте первый комментарий!

avatar
wpDiscuz