Ich hoffe ich bin hier richtig. Mein Plan ist, Infrarotsignale einer Fernbedienung via WLAN in einen anderen Raum weiterzuleiten um dort ein Gerät schalten zu können. Dafür bieten sich ESP8266 an. Ein ESP8266 soll also IR signale mittels TSOP emfangen, via WLAN an einen anderen ESP8266 schicken, der die Signale dann via IR Led an einen Fernseher oder änhliches sendet.
Der Grund warum ich hier im Arduino Forum poste ist, dass mein Englisch sehr beschränkt ist, die größeren ESP Foren aber englischsprachig sind. Außerdem sollen die ESP über die Arduino IDE programmiert werden.
Erschwerend kommt hinzu, dass ich nur geringe Erfahrung habe mit der Programmierung von Arduinos. Ich habe zwar schon einige Projekte verwirklicht, die waren aber nicht so komplex. Ich habe mich daher bei der Erstellung der Sketches an diesen Seiten orientiert und versucht die dortigen Sketches anzupassen:
Herausgekommen ist folgendes. Ich habe mich wirklich bemüht, eine Struktur reinzubringen. Falls das missglückt ist, steinigt mich bitte nicht.
SSID und Passwort sind natürlich nicht "TOPSECRET"
/* Sketch zum senden von IR Codes über WLAN
Teil 1 von 2
Mit diesem Sketch empfängt ein ESP8266 (der Client) IR Codes und übermittelt sie via WLAN an einen Empfänger (den Server), der sie wiederum als IR Codes versendet.
Dieser Sketch entstand, indem ich die Sketches dieser https://www.riyas.org/2014/03/sending-infrared-commands-over-ethernet-extend-ir-remote-arduino-ethernet.html
und dieser http://www.instructables.com/id/WiFi-Communication-Between-Two-ESP8266-Based-MCU-T/ website kombiniert habe.
Kommentare, die mit eckigen Klammern versehen sind stammen aus den original Sketches
Benötigt wird diese Library: https://github.com/esp8266/Basic/tree/master/libraries/IRremoteESP8266
für diese library https://github.com/markszabo/IRremoteESP8266 ist ein anderer sketch notwendig
Hardware:
ESP8266 Nodemcu
IR Empfänger OS-1838B (Conrad Nummer 184288 - 62)
VCC --> 3,3 Volt
GND --> GND
OUT --> RECV_PIN (im Sketch Pin 5 = D1 am ESP8266)
Dies ist der CLIENT Sketch
*/
#include <IRremoteESP8266.h>
#include <SPI.h>
#include <ESP8266WiFi.h>
int RECV_PIN = 5; // =ESP8266 Pin D1 verbunden mit OUT des OS-1838B
IRrecv irrecv(RECV_PIN);
decode_results results;
// Netzwerk Einstellungen
const char* ssid = "TOPSECRET"; //SSID des WLAN
const char* password = "TOPSECRET"; //Passwort des WLAN
const char* host = "192.168.1.75"; //IP des Servers, der die IR Codes an ein Unterhaltungsgerät schickt
WiFiClient client;
unsigned int rawCodes[RAWBUF]; // [The durations if raw]
int codeLen; // [The length of the code]
//[Get the infrared codes from remote]
void storeCode(decode_results *results)
{
int count = results->rawlen;
Serial.println("IR Codes empfangen");
codeLen = results->rawlen - 1;
for (int i = 1; i <= codeLen; i++)
{
if (i % 2)
{
rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK - MARK_EXCESS; // Mark
Serial.print(" m");
}
else
{
rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK + MARK_EXCESS; // Space
Serial.print(" s");
}
Serial.print(rawCodes[i - 1], DEC);
}
Serial.println("");
}
void setup()
{
Serial.begin(115200); // debugging
WiFi.begin(ssid, password); // WLAN starten
Serial.println("WiFi Verbindung wird aufgebaut");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Eigene IP des ESP-Modul: ");
Serial.println(WiFi.localIP());
irrecv.enableIRIn(); // Receiver starten FEHLT IM ORIGINAL SKETCH!!!
}
void sendIR() //senden der IR Codes über WLAN
{
if (client.connect(host, 80))
{
Serial.println("Sende Codes"); // debugging
client.print("GET /");
for (int i = 0; i < codeLen; i++)
{
client.print(rawCodes[i]);
}
client.println(" HTTP/1.1");
client.println("Hallo Server"); // debugging
client.println();
client.println();
client.stop();
}
else // debugging
{
Serial.println("Keine Verbindung zum Server");
}
}
void loop()
{
if (irrecv.decode(&results))
{
storeCode(&results);
sendIR();
irrecv.resume(); // Receive the next value
}
}
/* Sketch zum senden von IR Codes über WLAN
Teil 2 von 2
Mit diesem Sketch VERSENDET ein ESP8266 (der Server) IR Codes, die er via WLAN von einem anderen ESP8266 (dem Client) empfangen hat
Dieser Sketch entstand, indem ich die Sketches dieser https://www.riyas.org/2014/03/sending-infrared-commands-over-ethernet-extend-ir-remote-arduino-ethernet.html
und dieser http://www.instructables.com/id/WiFi-Communication-Between-Two-ESP8266-Based-MCU-T/ website kombiniert habe.
Die Schaltung habe ich von https://github.com/mdhiggins/ESP8266-HTTP-IR-Blaster
Kommentare, die mit eckigen Klammern versehen sind stammen aus den original Sketches
Benötigt wird diese Library: https://github.com/esp8266/Basic/tree/master/libraries/IRremoteESP8266
für diese library https://github.com/markszabo/IRremoteESP8266 ist ein anderer sketch notwendig
Hardware:
ESP8266 Nodemcu
Widerstand 100 Ohm
Widerstand 1 Kilo Ohm
NPN Transistor NPN 2N2222 (Conrad 1265003 - 62)
IR Emitter IR-333A (Conrad 156407 - 62)
Schaltungsaufbau siehe https://user-images.githubusercontent.com/3608298/30983611-f258c95a-a458-11e7-99c5-ba088727c928.PNG
LED MUSS an Pin 4 (D2)
Dies ist der SERVER Sketch
*/
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <IRremoteESP8266.h>
IRsend irsend(4); //[make the ir sender]
const char* ssid = "TOPSECRET"; //SSID des WLAN
const char* pass = "TOPSECRET"; //Passwort des WLAN
IPAddress ip(192,168,1,75); //Feste IP des Servers, frei wählbar, muss mit Client Sketch übereinstimmen (Variable host)
IPAddress gateway(192,168,1,15); //Gatway (IP Router eintragen)
IPAddress subnet(255,255,255,0); //Subnet Maske
WiFiServer server(80);
String readString;
String serialDataIn;
int counter=0;
unsigned int rawCodes[100];
void setup(){
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
Serial.println("WiFi Verbindung wird aufgebaut");
WiFi.begin(ssid, pass); //start Ethernet
WiFi.config(ip, gateway, subnet);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Verbunden mit ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.begin(); // [enable serial data print ]
Serial.println("Server gestartet, warte auf Codes");
}
void loop(){
WiFiClient client = server.available(); // [Create a client connection]
if (client)
{
while (client.connected())
{
if (client.available())
{
char c = client.read(); //read char by char HTTP request
if (readString.length() < 200)
{
readString +=c;
}
if (c == '\n') //if HTTP request has ended
{
serialDataIn = String("");
for (int i = 1; i <= readString.length(); i++)
{
char d =readString.charAt(i);
if(d >= '0' & d <= '9')
serialDataIn += d;
if (d == '&') // [Handle delimiter]
{
rawCodes[counter]=serialDataIn.toInt();
serialDataIn = String("");
counter = counter + 1;
}
}
Serial.println(readString);
Serial.println(counter); // [debuging the length]
for (int i = 0; i < counter; i++) // [print the raw buff to serial]
{
Serial.print(rawCodes[i]);
Serial.print('#');
}
digitalWrite(LED_BUILTIN, LOW); // [Now send the IR]
irsend.sendRaw(rawCodes, counter, 38);
delay(500);
digitalWrite(LED_BUILTIN, HIGH);
Serial.println("Sent IR signals");
client.println("HTTP/1.1 200 OK"); //[send new page]
client.println("Content-Type: text/html");
client.println();
client.println("<HTML>");
client.println("<HEAD>");
client.println("<TITLE>IR over ethernet debug page</TITLE>");
client.println("</HEAD>");
client.println("<BODY>");
client.println("<H1>Debug</H1>");
client.println("Check on serial monitor");
client.println("<a href=\"/1000&750&1900&800&950&800&1000&800&900&850&900&1750&1800&900&850&1800&900&850&1800&1750&900&\">MUTE</a>");
client.println("</BODY>");
client.println("</HTML>");
delay(1);
client.stop(); //stopping client
readString="";
serialDataIn = String("");
counter=0;
}
}
}
}
}
Die C-Nummern bitte ich zu ignorieren. Ich musste zum Teil andere Bauteile nehmen, da C die gewünschten dann doch nicht lagernd hatte. Anhand der auf github verfügbaren IR sende Demo Sketches bin ich mir sicher, dass die hardware funktioniert. Dieser Sketch Basic/libraries/IRremoteESP8266/examples/IRsendDemo at master · esp8266/Basic · GitHub lässt die IR led (über die Handycam betrachtet) blinken.
Jetzt zum Problem bei dem ich Euch bitte mir zu helfen. Vielleicht braucht jemand anderes diese Idee auch. Oder die Hilfe erfolgt nur des Sportsgeists willen.
Die zwei Nodemcus verbinden sich auch offenbar. Nach dem uploaden der Sketches und drücken einer Taste auf einer Fernbedienung gibt der Serial Motitor des Cliet aus:
GET /435075015507501550750155075045075045075045075045075045075015507501550750155075045075045075045075045075045075045075045075015507504507504507504507504507504507501550750155075045075015507501550750155
0
Sent IR signals
GET /435075015507001600750155075045075045075045075045075045075015507501550750155075045075045075045075045075045075045075045075015507504507504507504507004507004507001600750155075045075015507501550750155
0
Sent IR signals
GET /435075015507501550750155075045075045075045075045075045075015507501550750155075045075045075045070045075045075045075045075015507504507504507504507504507504507501550750155075045075015507501550750155
0
Sent IR signals
Die IR Led am Server sendet aber definitiv keine Signale. Weder tut sich was am TV , noch erkenne ich eine Aktivität der LED via Handycam (die Led reagiert wie gesagt beim Demo Sketch, daher ist die Hardware OK).Da der serielle Monitor aber was ausgibt und auch die interne Led blinkt (Server Code Line 95 bis 98) verstehe ich nicht warum die LED nicht reagiert.
Ich nehme daher an, dass der Fehler irgendwo im Sketch liegt udn vermute dass der counter (auch) schuld daran hat. Ich glaube nicht, dass der 0 sein sollte. Da der counter auf 0 ist gibt der Serial monitor auch nur readString und counter aus, nicht aber rawCodes.
Leider verstehe ich die IRremote lib nur ansatzweise...
ich habe mir gerade mal das Beispiel IRsendDemo.ino zur IRremoteESP8266.h angeschaut, dort kommt nach #include <IRremoteESP8266.h>
noch zusätzlich #include <IRsend.h>
Weder Dein Sketch, noch der verlinkte, lassen sich bei mir ohne die angegebene Zeile kompilieren :o