IR Fernbedienung umsetzer LED Strip

Hallo. Ich habe vor das bei z.B. einen play Befehl am Bluray Player automatisch die LED Strips gedimmt werden und dann ausgehen.

Die Befehle habe ich alle aber mein Problem ist das wenn ich ein IR Befehl im Switch Case ausführ ich da nicht mehr raus komme und der Case immer wieder wiederholt wird.

Es werden auch keinen neuen IR Codes eingelesen. Kann es sein das er den einen irsend ewig sendet da ich nicht beschrieben habe wie oft? Oder kann ich den gespeicherten Wert wieder löschen?
Könnt ihr mir helfen? Bin noch absoluter Neuling.

Vielen Dank euch vorab

Hier der Code

#include <IRremote.h>

int IRpin = 11; // Pin fr den IR Empfaenger
int LED = 13; // LED Pin PWM Pin 3 IR LED Out
IRrecv irrecv(IRpin);
IRsend irsend;
decode_results results;

boolean LEDon = true; // Initialisieren der Variable LEDon = wahr

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // IR Empfaenger starten
pinMode(LED, OUTPUT);
}

void loop()
{

if (irrecv.decode(&results))
{
Serial.println(results.value, DEC);
irrecv.resume(); // Signal empfangen

}

switch (results.value) // Abhaengig vom Signal in den richtigen Modus springen
{
case 16585453:// Play
Serial.println("Play Fade Light off "); // Ausgabe auf der Seriellenschnittstelle
irsend.sendNEC(0xF7C837, 32); // Fade
delay(100);
irsend.sendNEC(0xF7C837, 32); // Fade
delay(100);
irsend.sendNEC(0xF7C837, 32); // Fade
delay(100);
irsend.sendNEC(0xF7C837, 32); // Fade
delay(100);
irsend.sendNEC(0xF7C837, 32); // Fade
delay(100);

break;

case 16619623:// Stop
Serial.println(“Stop Light on Smooth”); // Ausgabe auf der Seriellenschnittstelle
irsend.sendNEC(0xF7C03F, 32); // on
irsend.sendNEC(0xF7E817, 32); // Smooth
delay(100);
irsend.sendNEC(0xF7E817, 32); // Smooth
delay(100);
irsend.sendNEC(0xF7E817, 32); // Smooth
delay(100);
irsend.sendNEC(0xF7E817, 32); // Smooth
delay(100);
irsend.sendNEC(0xF7E817, 32); // Smooth
delay(100);
break;

case 16611463:// Pause
Serial.println(“Pause Light on Smooth”); // Ausgabe auf der Seriellenschnittstelle
irsend.sendNEC(0xF7C03F, 32); // on
irsend.sendNEC(0xF7E817, 32); // Smooth
delay(100);
break;

default: // Standard
Serial.println(“nichts”);
delay(4000);
break;

}

}

So wird es wahrscheinlich gehen (ungetestet)

#include <IRremote.h>

int IRpin = 11; // Pin fuer den IR Empfaenger
int LED = 13; // LED Pin

IRrecv irrecv(IRpin);
IRsend irsend; // PWM Pin 3 IR LED Out

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // IR Empfaenger starten
  pinMode(LED, OUTPUT);
}

void loop()
{
  if (irrecv.decode(&results))
  {
    Serial.println(results.value, DEC);
    switch (results.value) // Abhaengig vom Signal in den richtigen Modus springen
    {
      case 16585453:// Play
        Serial.println(F("Play Fade Light off ")); // Ausgabe auf der Seriellenschnittstelle
        irsend.sendNEC(0xF7C837, 32); // Fade
        delay(100);
        irsend.sendNEC(0xF7C837, 32); // Fade
        delay(100);
        irsend.sendNEC(0xF7C837, 32); // Fade
        delay(100);
        irsend.sendNEC(0xF7C837, 32); // Fade
        delay(100);
        irsend.sendNEC(0xF7C837, 32); // Fade
        break;

      case 16619623:// Stop
        Serial.println(F("Stop Light on Smooth")); // Ausgabe auf der Seriellenschnittstelle
        irsend.sendNEC(0xF7C03F, 32); // on
        irsend.sendNEC(0xF7E817, 32); // Smooth
        delay(100);
        irsend.sendNEC(0xF7E817, 32); // Smooth
        delay(100);
        irsend.sendNEC(0xF7E817, 32); // Smooth
        delay(100);
        irsend.sendNEC(0xF7E817, 32); // Smooth
        delay(100);
        irsend.sendNEC(0xF7E817, 32); // Smooth
        break;

      case 16611463:// Pause
        Serial.println(F("Pause Light on Smooth")); // Ausgabe auf der Seriellenschnittstelle
        irsend.sendNEC(0xF7C03F, 32); // on
        irsend.sendNEC(0xF7E817, 32); // Smooth
        break;

      default: // Standard
        Serial.println(F("nicht erkannt"));
        break;
    }
    irrecv.resume();
  }
}

Vielen Dank erstmal für deine Hilfe. Leider geht es noch immer nicht. Es wird zwar der Wert nicht ständig wiederholt aber dafür nimmt er noch immer keinen zweiten IR Befehl auf.

Also einmal gehts und dann wars das.

Vielleicht noch ne Idee?

Prüfe mal Deine Klammerstruktur, vielleicht liegt das irrecv.resume() falsch?

Was heißt “nimmt nicht auf”? Was erscheint im Serial Monitor?

Im Seriellen Monitor wird es so angezeigt: Ich drücke weiter an der Fernbedienung und es es wird der default Wert angezeigt (so IO) dann das selbe nochmals. (wieder IO) Dann Play und es wird auch der richtige Case benutzt und der Text angezeigt und die IR Diode (IO) Jetzt betätige ich nochmals die Fernbedienung und es passiert nichts mehr. Als wenn er irgendwo sich verläuft

Schwer zu beschreiben. Hoffe es geht so

Prüfe nochmal, ob es immer die selbe Taste ist, nach der sich das Programm aufhängt. Dann schau nach, ob danach das irrecv.resume() vielleicht übersprungen wird (return statt break?)

Ich kann mich schwach darin erinnern, ;) vor einiger Zeit ein ähnliches Problem gehabt zu haben.

Ich habe es dann mit der "if-Anweisung" gelöst. Das funktioniert jetzt bei mir problemlos. Habe aber keine Idee, warum das so ist.

  if (results.value == 16585453)
    {
      // deine Anweisungen
    }
    else if (results.value == 16619623)
    {
      // deine Anweisungen
    }
// usw.

Wäre jedenfalls ein Versuch wert.

Vielen Dank für die viele und nette Hilfe. Leider habs ich wieder nicht geschafft.

Ich habs den Switch case gegen If else geändert doch jetzt kriege ich gar nichts mehr angezeigt bzw ausgeführt.
Könntet ihr mal drüberschauen? Hab sicher irgendwo ne Klammerfunktion falsch oder so

Merce Peter

#include <IRremote.h>

int IRpin = 11; // Pin fuer den IR Empfaenger
int LED = 13; // LED Pin

IRrecv irrecv(IRpin);
IRsend irsend; // PWM Pin 3 IR LED Out

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // IR Empfaenger starten
  pinMode(LED, OUTPUT);
}

void loop()
{
  if (irrecv.decode(&results))
  {
    Serial.println(results.value, HEX);
  
    
    if (results.value == 16585453)
    {
      Serial.println(F("Play Fade Light off ")); // Ausgabe auf der Seriellenschnittstelle
        irsend.sendNEC(0xF7C837, 32); // Fade
        delay(100);
        irsend.sendNEC(0xF7C837, 32); // Fade
        delay(100);
        irsend.sendNEC(0xF7C837, 32); // Fade
        delay(100);
        irsend.sendNEC(0xF7C837, 32); // Fade
        delay(100);
        irsend.sendNEC(0xF7C837, 32); // Fade
        delay(100);
        irsend.sendNEC(0xF7C03F, 32); // off   WERT FALSCH!!!!!
        delay(100);
    }
    else if (results.value == 16619623)
    {
      Serial.println(F("Stop Light on Smooth")); // Ausgabe auf der Seriellenschnittstelle
        irsend.sendNEC(0xF7C03F, 32); // on
        delay(100);
        irsend.sendNEC(0xF7E817, 32); // Smooth
        delay(100);
        irsend.sendNEC(0xF7E817, 32); // Smooth
        delay(100);
        irsend.sendNEC(0xF7E817, 32); // Smooth
        delay(100);
        irsend.sendNEC(0xF7E817, 32); // Smooth
        delay(100);
        irsend.sendNEC(0xF7E817, 32); // Smooth
    }
    else if (results.value == 16611463)
    {
      Serial.println(F("Pause Light on Smooth")); // Ausgabe auf der Seriellenschnittstelle
        irsend.sendNEC(0xF7C03F, 32); // on
        delay(100);
        irsend.sendNEC(0xF7E817, 32); // Smooth
        delay(100);
    }
    else if (results.value == 16611461)
    {
        Serial.println(F("nicht erkannt"));
    }
   
  } 
    irrecv.resume();
  }

Wieso gibst Du results in HEX aus, schreibst die Vergleichswerte aber dezimal hin? Es wird viel übersichtlicher mit z.B.

    Serial.println(results.value, HEX);
    switch (results.value) {
      case 0xFD12ED: // == 16585453
      usw...

An Stelle eines irrecv.resume() brauchst du nach dem Senden eines Codes ein irrecv.enableIRIn().
Das Senden scheint den Empfang sonst stillzulegen.

#include <IRremote.h>

const byte IRpin = 11; // Pin fuer den IR Empfaenger
const byte LED = 13; // LED Pin

IRrecv irrecv(IRpin);
IRsend irsend; // PWM Pin 3 IR LED Out

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // IR Empfaenger starten
  pinMode(LED, OUTPUT);
}

void loop()
{
  if (irrecv.decode(&results))
  {
    Serial.println(results.value, HEX);
    if (results.value == 16585453 || results.value == 0xFFA25D)
    {
      Serial.println(F("Play Fade Light off ")); // Ausgabe auf der Seriellenschnittstelle
      irsend.sendNEC(0xF7C837, 32); // Fade
      delay(100);
      irsend.sendNEC(0xF7C837, 32); // Fade
      delay(100);
      irsend.sendNEC(0xF7C837, 32); // Fade
      delay(100);
      irsend.sendNEC(0xF7C837, 32); // Fade
      delay(100);
      irsend.sendNEC(0xF7C837, 32); // Fade
      delay(100);
      irsend.sendNEC(0xF7C03F, 32); // off   WERT FALSCH!!!!!
      delay(100);
      irrecv.enableIRIn(); // IR Empfaenger starten
    }
    else if (results.value == 16619623)
    {
      Serial.println(F("Stop Light on Smooth")); // Ausgabe auf der Seriellenschnittstelle
      irsend.sendNEC(0xF7C03F, 32); // on
      delay(100);
      irsend.sendNEC(0xF7E817, 32); // Smooth
      delay(100);
      irsend.sendNEC(0xF7E817, 32); // Smooth
      delay(100);
      irsend.sendNEC(0xF7E817, 32); // Smooth
      delay(100);
      irsend.sendNEC(0xF7E817, 32); // Smooth
      delay(100);
      irsend.sendNEC(0xF7E817, 32); // Smooth
      irrecv.enableIRIn(); // IR Empfaenger starten
    }
    else if (results.value == 16611463)
    {
      Serial.println(F("Pause Light on Smooth")); // Ausgabe auf der Seriellenschnittstelle
      irsend.sendNEC(0xF7C03F, 32); // on
      delay(100);
      irsend.sendNEC(0xF7E817, 32); // Smooth
      delay(100);
      irrecv.enableIRIn(); // IR Empfaenger starten
      //    }
      //    else if (results.value == 16611461)
      //    {
    } else {
      Serial.println(F("nicht erkannt"));
      irrecv.resume();
    }
  }
}

Vielen Dank

So geht es

irrecv.enableIRIn(); // IR Empfaenger starten muss nach jedem IR Senden rein

Grüße Peter