Control remoto para TV con esp8266
Se trata de un control remoto de televisión por wifi con un esp8266. Podemos acceder desde cualquier parte de la casa o incluso via Internet.
Lo uso en el mismo despacho del ordenador para controlar una TV Samsung (con Imagenio de Movistar) A veces la tengo en marcha junto al ordenador y cambiar de canal y usar el MUTE (del que soy fanático admirador) dejando el ratón y coger el mando es un incordio. Con esto se soluciona, puedo controlar la TV con un click del ratón.
El montaje es minimalista, una placa WeMos mini, diodo IR, transistor 2N2222 y receptor de IR para leer los códigos de nuestro mando a distancia. Esto incluso lo podremos ahorrar si el TV es Samsung ya que están en el Sketch de Arduino que pongo más abajo.
A la izquierda el circuito y a la derecha la placa de tiras. Advertir que las dos tiras de 3,3v y GND no están cortadas y dan servicio la de 3,3v al IR receptor y al diodo emisor y la de GND al 2N2222 y al IR receptor. Por tanto, los pines izquierdo de GND y al derecho de 3,3v no hay que ponerlos, Solo hay que soldar los cuatro pines inferiores, los cuatro superiores solo están para dar más solidez al conjunto.
Unas fotos del montaje.
WeMos D1 Mini
Si no se tiene una TV Samsung tendremos que capturar los códigos cargando el Squech IRrecvDumpV2.ino que viene con la librería IRremoteESP8266-master Capturados los códigos que nos interesan, los pondremos en el sketch, sustituyendo a los de Samsung y al comando irsend.sendSAMSUNG por el correspondiente a otro modelo.
Una vez tengamos los códigos, cargaremos el Squech de abajo y haremos las modificaciones oportunas.
/*
www.jopapa.me
Codigos control remoto TV SAMSUNG
Baja Vol 0xE0E0D02F b
Sube Vol 0xE0E0E01F s
Mute 0xE0E0F00F
Canal 1 0xE0E020DF
Canal 2 0xE0E0A05F
Canal 3 0xE0E0609F
Canal 4 0xE0E010EF
Canal 5 0xE0E0906F
Canal 6 0xE0E050AF
Canal 7 0xE0E030CF
Canal 8 0xE0E0B04F
Canal 9 0xE0E0708F
Canal 0 0xE0E08877
Sube Canal 0xE0E048B7 S
Baja Canal 0xE0E008F7 B
ON/OFF 0xE0E040BF O
Canal Pre 0xE0E0C837 p
Lista canal 0xE0E0D629 L
Cursor Up 0xE0E006F9 u
Cursor Down 0xE0E08679 d
Cursor Right 0xE0E046B9 r
Cursor Left 0xE0E0A659 l
ENTER 0xE0E016E9 e
Exit 0xE0E0B44B x
Fuente 0xE0E0807F f
*/
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <ESP8266WiFi.h>
const char* ssid = "miSSID";
const char* password = "miclaveWifi";
char key[1];
WiFiServer server(80);
IRsend irsend(4); // el IR LED es controlado por GPIO pin 4 (D2)
void setup() {
Serial.begin(115200);
irsend.begin();
delay(10);
IPAddress ip(192, 168, 1, 71); //IP interna
IPAddress gateway(192,168,1,1);
IPAddress subnet (255,255,255,0);
WiFi.begin(ssid, password); // Connect to WiFi network
WiFi.config(ip,gateway,subnet);
while (WiFi.status() != WL_CONNECTED) {
delay(500);Serial.print(".");}
server.begin();
}
void loop() {
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {return;}
// Wait until the client sends some data
// Serial.println("new client");
// while(!client.available()){
// delay(1);
// }
// Read the first line of the request
String request = client.readStringUntil('\r');
client.flush();
// Match the request
if (request.indexOf("/codeO") != -1){ //on/off
irsend.sendSAMSUNG(0xE0E040BF, 32);
}
if (request.indexOf("/codeb") != -1){ //baja vol
irsend.sendSAMSUNG(0xE0E0D02F, 32);
}
if (request.indexOf("/codes") != -1){ //sube Vol
irsend.sendSAMSUNG(0xE0E0E01F, 32);
}
if (request.indexOf("/codem") != -1){ //mute
irsend.sendSAMSUNG(0xE0E0F00F, 32);
}
if (request.indexOf("/code1") != -1){ //1
irsend.sendSAMSUNG(0xE0E020DF, 32);
}
if (request.indexOf("/code2") != -1){ //2
irsend.sendSAMSUNG(0xE0E0A05F, 32);
}
if (request.indexOf("/code3") != -1){ //3
irsend.sendSAMSUNG(0xE0E0609F, 32);
}
if (request.indexOf("/code4") != -1){ //4
irsend.sendSAMSUNG(0xE0E010EF, 32);
}
if (request.indexOf("/code5") != -1){ //5
irsend.sendSAMSUNG(0xE0E0906F, 32);
}
if (request.indexOf("/code6") != -1){ //6
irsend.sendSAMSUNG(0xE0E050AF, 32);
}
if (request.indexOf("/code7") != -1){ //7
irsend.sendSAMSUNG(0xE0E030CF, 32);
}
if (request.indexOf("/code8") != -1){ //8
irsend.sendSAMSUNG(0xE0E0B04F, 32);
}
if (request.indexOf("/code9") != -1){ //9
irsend.sendSAMSUNG(0xE0E0708F, 32);
}
if (request.indexOf("/code0") != -1){ //0
irsend.sendSAMSUNG(0xE0E08877, 32);
}
if (request.indexOf("/codep") != -1){ //Canal previo
irsend.sendSAMSUNG(0xE0E0C837, 32);
}
if (request.indexOf("/codeS") != -1){ //Sube canal
irsend.sendSAMSUNG(0xE0E048B7, 32);
}
if (request.indexOf("/codeB") != -1){ //Baja canal
irsend.sendSAMSUNG(0xE0E008F7, 32);
}
if (request.indexOf("/codeL") != -1){ //Listar Canales
irsend.sendSAMSUNG(0xE0E0D629, 32);
}
if (request.indexOf("/codeu") != -1){ //Cursor Up
irsend.sendSAMSUNG(0xE0E006F9, 32);
}
if (request.indexOf("/codel") != -1){ //Cusor left
irsend.sendSAMSUNG(0xE0E0A659, 32);
}
if (request.indexOf("/coder") != -1){ //Cursor right
irsend.sendSAMSUNG(0xE0E046B9, 32);
}
if (request.indexOf("/coded") != -1){ //Cursor Down
irsend.sendSAMSUNG(0xE0E08679, 32);
}
if (request.indexOf("/codee") != -1){ //ENTER
irsend.sendSAMSUNG(0xE0E016E9, 32);
}
if (request.indexOf("/codex") != -1){ //Exit
irsend.sendSAMSUNG(0xE0E0B44B, 32);
}
if (request.indexOf("/codef") != -1){ //Exit
irsend.sendSAMSUNG(0xE0E0807F, 32);
}
// Return the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // do not forget this one
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<html>");
client.println("<head>");
client.println("</head>");
client.println("<body>");
client.println("<h1 align='center'>Control Remoto Samsung</h1><h3 align='center'></h3>");
client.println("<div style='text-align:center;'>");
client.println("<button onClick=location.href='./codeO\' style='margin:auto;background-color: #F93005;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("ON/OFF");
client.println("</button>");
client.println("<br /><br />");
client.println("<button onClick=location.href='./codes\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("Up Vol");
client.println("</button>");
client.println("<button onClick=location.href='./codeS\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("Up Ch");
client.println("</button>");
client.println("<br />");
client.println("<button onClick=location.href='./codeb\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("Dw Vol");
client.println("</button>");
client.println("<button onClick=location.href='./codeB\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("Dw Ch");
client.println("</button>");
client.println("<br /><br />");
client.println("<button onClick=location.href='./codem\' style='margin:auto;background-color: #0509F9;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:205px;'>");
client.println("MUTE");
client.println("</button>");
client.println("<br /><br />");
client.println("<button onClick=location.href='./code1\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("1");
client.println("</button>");
client.println("<button onClick=location.href='./code2\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("2");
client.println("</button>");
client.println("<button onClick=location.href='./code3\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("3");
client.println("</button>");
client.println("<br />");
client.println("<button onClick=location.href='./code4\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("4");
client.println("</button>");
client.println("<button onClick=location.href='./code5\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("5");
client.println("</button>");
client.println("<button onClick=location.href='./code6\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("6");
client.println("</button>");
client.println("<br />");
client.println("<button onClick=location.href='./code7\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("7");
client.println("</button>");
client.println("<button onClick=location.href='./code8\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("8");
client.println("</button>");
client.println("<button onClick=location.href='./code9\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("9");
client.println("</button>");
client.println("<br />");
client.println("<button onClick=location.href='./code0\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("0");
client.println("</button>");
client.println("<button onClick=location.href='./codep\' style='margin:auto; background-color: #0509F9;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:135px;'>");
client.println("Canal Previo");
client.println("</button>");
client.println("<br /><br />");
client.println("<button onClick=location.href='./codeL\' style='margin:auto;background-color: #055830;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:205px;'>");
client.println("Listar canales");
client.println("</button>");
client.println("<br />");
client.println("<button onClick=location.href='./codeu\' style='margin:auto;background-color: #06904e;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("Up");
client.println("</button>");
client.println("<button onClick=location.href='./codel\' style='margin:auto;background-color: #06904e;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("Left");
client.println("</button>");
client.println("<button onClick=location.href='./coder\' style='margin:auto;background-color: #06904e;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("Right");
client.println("</button>");
client.println("<br />");
client.println("<button onClick=location.href='./coded\' style='margin:auto;background-color: #06904e;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("Down");
client.println("</button>");
client.println("<button onClick=location.href='./codee\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("Enter");
client.println("</button>");
client.println("<button onClick=location.href='./codex\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("Salir");
client.println("</button>");
client.println("<br />");
client.println("<button onClick=location.href='./codef\' style='margin:auto;background-color: #053830;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:205px;'>");
client.println("Fuente");
client.println("</button>");
client.println("</b></body>");
client.println("</html>");
delay(1);
Serial.println("Client disonnected");
Serial.println("");
}
El programa Arduino nos genera una página WEB (en este caso en la 192.168.1.71) que nos permite enviar los códigos. No tiene buena velocidad y es tan lenta que no permite enviar canales de dos dígitos. Evidentemente porque puede mejorarse y mucho.
He creado una página independiente que funciona perfectamente. La de la derecha. Puede bajarse aquí
Ambas tienen el problema de usar el navegador y eso puede molestar para otros usos y necesita redimensionarse cada vez que se carga.
Por ello lo mejor es usar este programa que he hecho en VB que ocupa poco en pantalla, no usa navegador y al abrirse en monitores 1080 se coloca en la esquina superior derecha. Puede bajarse de aquí