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




Ниже представлен код 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
[…] внешнее управление телевизором LG через порт RS232 я уже писал. Это был телевизор модельного ряда 2010 года и разъем RS232 […]
Может будет полезной такая информация: Проф панели от LG без WEBOS управляются и через LAN Формат взаимодействия такой: Подключаемся по telnet, по ip монитора по порту 9761 далее, как и по RS отправка команды — получение ответа Бывают нюансы — отправлять или нет перевод строки «Cr» К сожалению с телевизорами у меня так не получалось (но и телевизоров в руках было — один и не долго). При том, что телевизоры с RS — все управлялись (начиная с плазм) Но было бы странно если бы не было такой возможности/ Скорее всего надо разбираться с портом. Если кто разберется — буду признателен.… Читать далее »
На LD750 открыт один порт и похоже каждый раз разный, на команды не реагирует.
На телевизоре с WebOS.Прошелся по 14 открытым портам, не реагирует на команды. Для WebOS я остановился на управлении через вебсокет https://github.com/hobbyquaker/lgtv2