WLAN-Fernbedienung

Eine WLAN-Fernbedienung um Fernseher, Beamer,… per IR zu steuern

Dieses Projekt beschreibt eine WLAN Schnittstelle, die IR Signale ausgibt. Somit können durch HTTP GET Befehle alle handelsüblichen Geräte geschaltet werden, wie auch direkt mit einer Fernbedienung.
Eingebunden ist das bei mir in die Homematic, sodass die CCU dort auch die Geräte für einen Kinoabend an/ausschalten kann.
Finanziell hält sich das ganze in Grenzen: Je nach vorhandemen Bastlerutensilien reicht der ESP und IR Dioden, die letztendlich in den Betrieb übergehen – also wenige Euro.

Hinweis zu dieser Anleitung: Sie soll nicht unbedingt selbsterklärend sein – ein paar Grundlagen mit der Arduino IDE und einem Lötkolben setze ich voraus. Andernfalls warten immer hilfsbereite Suchmaschinen auf entsprechende Fragestellungen. Die Kommentare dürfen natürlich auch genutzt werden, wenn es mal nicht weiter geht 🙂

Übersicht der verwendeten Komponenten

Erstmal nutze ich die Arduino-IDE.

Für das Erfassen der nötigen IR Signale verwende ich:

  • Arduino
  • TSOP IR Receiver
  • In der Arduino-IDE muss die IRremote Library vorhanden sein
  • … nichts weiter 🙂

Für die WLAN-Fernbedigung selber

  • ESP-8266 (bei mir ESP201)
  • IR Dioden (ich habe 3 verbaut um den Raum «auszuleuchten»)
  • Stromversorgung 3.3V für den ESP
  • In der Arduino-IDE
  • Zum Programmieren einen USB2TTL (einige der USB2TTL liefern 5V, einige zusätzlich 3.3V!)

Erfassen der IR Signale

Mittels der Fernbedienung, die zu dem zu steuernden Gerät gehört, kann man mit diesem recht einfachen Aufbau die Codes für die später auch zum Senden verwendete IRremote-Lib auslesen.
Ich mache das mit einem Arduino und TOSP – sicherlich geht auch ein Raspi oder andere Hardware.

Remote-IRReceiver

In der Arduino IDE einfach das Sample «IRrecvdumpv2» auswählen und ggf den Port des TSOP einstellen (oben ist der PIN 11 verwendet …) . Nach der Programmierung des Arduino sieht man die Hersteller (der Protokolle) und Codes übersichtlich auf der Konsole.

Ungefähr so (erste beiden Zeilen sind das interessante):

Encoding : NEC
Code : A55A38C7 (32 bits)
Timing[68]:
-62714
+8500, -4100 + 650, -1450 + 650, - 400 + 600, -1500
+ 650, - 400 + 650, - 400 + 650, -1450 + 600, - 450[...]

Diese Kombination notiert man sich also für jeden Tastendruck.
Bei Problemen kommt gerne ein  FFFFFF, dann entweder unter Abdunklung probieren oder auch gern mal mindestens 0.5m Entfernung von der Fernbedienung und dem TOSP einhalten.

Es gibt sicherlich auch Fernbedienungen auf IR Basis die an dieser Stelle ausscheiden. Sprich: Wenn hier kein Code rauszubekommen ist, sollte man sich überlegen, ob es einem das Experiment mit dem ESP8266 (was durchaus Spass macht :-)) wert ist.

Aufbau der Schaltung um den ESP8266

Schaltung ist schon fast zu viel gesagt – eigentlich wollen beim ESP8266 nur einige Pins belegt werden – hier mein Mapping:

GND -> GND
3.3V -> 3.3V
Tx -> Rx (zum erneuten Programmieren)
Rx -> Tx (zum erneuten Programmieren)
CHIP_EN -> 3.3V
IO 15 -> GND bzw frei per Jumper
IO 0 -> GND bzw 3.3V per Jumper
IO 13 -> LED als Status (und dann auf GND)
IO 12, 14 und 4 -> die IR Dioden (und dann auf GND)

IO 15 und IO0 müssen für das Programmieren auf GND; damit der ESP seinen Flash behält muss dann der IO0 auf 3.3V gelegt werden, wenn das Programmieren abgeschlossen ist.
Das habe ich leider nirgends «richtig» dokumentiert gefunden sondern mir zusammengesucht. Falls jemand sachdientliche Hinweise liefern kann: Bitte in die Kommentare.

Hier noch ein paar Bilder:

fernbedienung-wlan2irfront fernbedienung-wlan2irback

Programmierung des ESP8266

Der Gedanke an dem Programm ist auf 3 Ausgängen «so schnell wie möglich» die IR Signale zu senden – dadurch kann man den Raum gut ausleuchten und viele Geräte scheinen «Preller» der Tasten wegzufiltern, sodass bei mir noch keine doppelten Tastendrücke angekommen sind.

Der Code selber macht einen Webserver auf, der dann sowohl «type» (das, was oben als encoding bezeichnet wird) sowie auch «value» bekommen. Value kann als dezimaler Wert oder als hex-Wert (in 0x Notation) angegeben werden.
Egal welcher Wert, er wird einfach als IR Befehl gesendet, sodass keine «Programmierung» pro Taste erfolgen muss.


#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = «YYY»;
const char* password = «XXX»;

IRsend irsend0(12); //an IR led is connected to GPIO pin 12
IRsend irsend1(14); //an IR led is connected to GPIO pin 13
IRsend irsend2(4); //an IR led is connected to GPIO pin 4

ESP8266WebServer server(80);

const int led = 13;

void handleRoot() {
digitalWrite(led, 1);
server.send(200, «text/plain», «hello from esp8266!»);
digitalWrite(led, 0);
}

void handleNotFound(){
digitalWrite(led, 1);
String message = «File Not Found\n\n»;
message += «URI: «;
message += server.uri();
message += «\nMethod: «;
message += (server.method() == HTTP_GET)?»GET»:»POST»;
message += «\nArguments: «;
message += server.args();
message += «\n»;
for (uint8_t i=0; i<server.args(); i++){
message += » » + server.argName(i) + «: » + server.arg(i) + «\n»;
}
server.send(404, «text/plain», message);
digitalWrite(led, 0);
}

void setup(void){
irsend0.begin();
irsend1.begin();
irsend2.begin();
pinMode(led, OUTPUT);
digitalWrite(led, 0);
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println(«»);

// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(led, 1);
delay(500);
digitalWrite(led, 0);
Serial.print(«.»);
}
Serial.println(«»);
Serial.print(«Connected to «);
Serial.println(ssid);
Serial.print(«IP address: «);
Serial.println(WiFi.localIP());
if (MDNS.begin(«esp8266»)) {
Serial.println(«MDNS responder started»);
}

server.on(«/», handleRoot);

server.on(«/irsend», [](){

String type;
unsigned long value = 0;
if(server.argName(0) == «type») {
type = server.arg(0);
}
if(server.argName(1) == «value») {
char str[11];
server.arg(1).toCharArray(str,11);
value = (long)strtoul(str, NULL, 0); //dec or hex
}
Serial.println(«Received command type:»+type+» w/ value «+value);
server.send(200, «text/plain», «Received type:»+type+» value:»+value);
if(type == «NEC») {
irsend0.sendNEC(value, 32);
irsend1.sendNEC(value, 32);
irsend2.sendNEC(value, 32);
} else if (type == «Samsung») {
irsend0.sendSAMSUNG(value, 32);
irsend1.sendSAMSUNG(value, 32);
irsend2.sendSAMSUNG(value, 32);
} else {
Serial.println(«ERROR type (type: NEC | Samsung)»);
server.send(200, «text/plain», «ERROR !!! Type unknown (NEC | Samsung)»);
}
});

server.onNotFound(handleNotFound);

server.begin();
Serial.println(«HTTP server started»);
}

void loop(void){
server.handleClient();
}

Ein Hinweis noch zum Code: Hier sind aktuell nur Samsung und NEC als Protokolle implementiert. Weitere Protokolle sollten sich durch einfaches Kopieren hinzufügen lassen.

Auf IT Security Aspekte passt bitte selber auf – der Webserver sollte aus naheliegenden Gründen nicht direkt oder per Portforwarding ans Internet gehangen werden …

Überprüfen der Funktion

Mit einer Digitalkamera (z.B. am Handy) lässt sich das IR Signal wunderbar sichtbar machen.

Nutzen der WLAN Fernbediung

Mittels http://192.168.1.38/irsend?type=Samsung&value=0xE0E040BF lässt sich nun mein Fernseher ein-/ausschalten. Ausserdem schalte ich den Beamer (Acer) an/aus und mein Receiver (Pioneer) nicht nur ein/aus sondern auch die entsprechenden Eingänge.
Dabei wird der type und value natürlich gegen die im ersten Schritt ermittelten Werte ersetzt.
Solche HTTP-GET Aufrufe lassen sich nun aus nahezu jeder Lebenslage ausführen – ob aus einer CCU vom Homematic System oder auch als Bookmarks im Browser vom Handy.

 

Schreibe einen Kommentar