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