Probleme mit IR LED Tv zu steuern

Hallo
ich versuche verzweifelt mit meinem Code drei IR-Codes zu senden, um mit einem Sprachbefehl von einem Input zum anderen zu wechseln. Mit einem Code funktioniert es problemlos nur wenn ich zwischen die Codes ein delay() mache sendet der irgendeinen Code, der mit beiden nichts zu tun hat. Vielleicht könnt Ihr mir helfen :slight_smile:
Das ganze lässt sich über den Amazon Echo und Esp8266 steuern.

else if(device_id == 3) { //chromecast einschalten
    Serial.println("AN");
    
    IRLED.sendRC5(0x38, 12);
    Serial.println("Input"); 
    delay(5000);
    IRLED.sendRC5(0x13, 12);
    Serial.println("Links"); 
    delay(5000);
    IRLED.sendRC5(0x35, 12);
    Serial.println("OK"); 
   
    delay(50);
    }

Mit einem Uno und einem IR Empfänger sehe ich was gesendet wird. Mit diesem Code Wird das gesendet: Decoded RC5: 8C04F035 (40 bits).

Hast du denn deine IR-Code mal mit den originalen IR-Code aus der Fernbedienung verglichen.
Manche FB senden nach dem Steuercode noch einen weiteren aus um dem Empfänger mitzuteilen, das war es.

Habe die Codes von der FB ausgelesen und es wurde augenscheinlich nur ein Code gesendet. Wenn ich auf den Seriellen Monitor gucke ist zwischen den Serial.println ausgaben auch kein 5 sek delay sondern kommen direkt hintereinander.

AlexDE:
Habe die Codes von der FB ausgelesen und es wurde augenscheinlich nur ein Code gesendet. Wenn ich auf den Seriellen Monitor gucke ist zwischen den Serial.println ausgaben auch kein 5 sek delay sondern kommen direkt hintereinander.

Mit welchem Controller sendest du den IR-Code ?

Mit einem NodeMcu ESP-12E.

AlexDE:
Mit einem NodeMcu ESP-12E.

Und hast du mal getestet, ob die "delays" da generell richtig funktionieren ?

Ich hatte das mal mit einem ATtiny85, da wurden keine delays verarbeitet.
Da musste ich eine neuere IDE-Integration einspielen.

Ja habe mal das Blink Script aufgespielt da geht das delay. Nur in meinem Script nicht :confused:

Hier mal das ganze Script:

#include <ESP8266WiFi.h>
#include <RCSwitch.h>
#include "fauxmoESP.h"
#include <IRremoteESP8266.h> 
#include <IRsend.h>

#define WIFI_SSID "****"
#define WIFI_PASS "****"
 
fauxmoESP alexawifi;
RCSwitch mySwitch = RCSwitch();
IRsend IRLED(4); // IRLED am D2 Pin (GPIO4)
int ledPin = 15;

void wifiSetup() {

// -----------------------------------------------------------------------------
// WLAN SETUP
// -----------------------------------------------------------------------------
 
    WiFi.mode(WIFI_STA);
 
    Serial.printf("Verbindungs zu %s wird aufgebaut ", WIFI_SSID);
    
    WiFi.begin(WIFI_SSID, WIFI_PASS);
 
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(">");
        delay(100);
    } 
    Serial.println("");
    Serial.printf("Verbunden! SSID: %s, IP Adresse: %s\n", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());

    pinMode(13,OUTPUT);
}
 
void anfrage(uint8_t device_id, const char * device_name, bool state) {
  Serial.print("Gerät: "); Serial.println(device_name); 
  Serial.print("Status: ");
  pinMode(ledPin, OUTPUT);
  if (state) { //Geräte anschalten

    if(device_id == 0) { //LED einschalten
    Serial.println("AN");
    digitalWrite(ledPin, HIGH);
    
    
   
    delay(50);
    }


   else if(device_id == 1) { //Fernseher einschalten
    Serial.println("AN");
    
    IRLED.sendRC5(0xC, 12);
    delay(50);
    }

    else if(device_id == 2) { //Receiver einschalten
    Serial.println("AN");
    
    IRLED.sendNEC(0x800FF, 32);
    delay(50);
    }

    else if(device_id == 3) { //Chromecast einschalten
    Serial.println("AN");
    
    IRLED.sendRC5(0x38, 12);
    Serial.println("Input"); 
    delay(5000);
    IRLED.sendRC5(0x13, 12);
    Serial.println("Links"); 
    delay(5000);
    IRLED.sendRC5(0x35, 12);
    Serial.println("OK"); 
   
    delay(50);
    }
  } 
  
  else { //Geräte ausschalten
    
    if(device_id == 0) { //LED ausschalten
    Serial.println("AUS");
    digitalWrite(ledPin, LOW);
    //mySwitch.switchOff("11111", "00000");
    delay(50);
    }

   else if(device_id == 1) { //Fernseher ausschalten
    Serial.println("Aus");
    
    IRLED.sendRC5(0xC, 12);
    delay(50);
    }

    else if(device_id == 2) { //Receiver ausschalten
    Serial.println("Aus");
    
    IRLED.sendNEC(0x800FF, 32);
    delay(50);
    }
  }
}
 
void setup() {

    Serial.begin(115200);
    Serial.println("Nach dem Verbinden, sage 'Alexa, schalte <Gerät> an' oder 'aus'");
    
    mySwitch.enableTransmit(2);
    IRLED.begin();

    wifiSetup();
    geraete();
  
}

void geraete(){

    alexawifi.addDevice("Lampe"); //ID 0
    alexawifi.addDevice("Fernseher");//ID 1
    alexawifi.addDevice("Receiver");//ID 2
    alexawifi.addDevice("Chromecast");//ID 3

    

    alexawifi.onMessage(anfrage);
}

void loop() {
  alexawifi.handle();
 
}

Dann hast du sicher ein Timer-Problem.
Ich sehe, du verwendest RCSwitch und IRRemote zusammen auf dem ESP.

Prüfe mal, welche Timer da durch die einzelnen Libs verwendet werden, da gibt es bestimmt Überschneidungen.
Evtl. musst du einzelne Funktionen auf weitere Controller auslagern, wenn es so nicht geht.

Habe RCSwitch mal rausgenommen und es geht nicht. Wie kann ich sehen welcher Timer verwendet wird?

AlexDE:
Habe RCSwitch mal rausgenommen und es geht nicht. Wie kann ich sehen welcher Timer verwendet wird?

Ich habe noch zu wenig Erfahrung mit dem ESP, aber das sollte man ergoogeln können.

Oder gibt es eine Möglichkeit delay() gegen etwas anderes zu tauschen, was den Code auch pausiert?

AlexDE:
Oder gibt es eine Möglichkeit delay() gegen etwas anderes zu tauschen, was den Code auch pausiert?

Du kannst delay durch eine Funktion mit millis() ersetzen.
Sieh dir dazu das Beispiel "BlinkWithoutDelay" an.

HotSystems:
Du kannst delay durch eine Funktion mit millis() ersetzen.
Sieh dir dazu das Beispiel "BlinkWithoutDelay" an.

Habe ich nicht auf die Kette bekommen :confused:

AlexDE:
Habe ich nicht auf die Kette bekommen :confused:

Dann solltest du dich mal mit den Grundlagen von C++ beschäftigen.
Denn nur mit C&P wirst du so nicht weiter kommen.

Habe ich nicht auf die Kette bekommen :confused:

-->Dann versuch mal das hier