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í
Menu