IR Remote schleife

Hallo Leute,

ich bin noch ziemlich neu und habe noch nicht wirklich viel Erfahrung im programmieren.

Ich möchte mit einer IR Fernbedienung eine Taste drücken (im Bsp. die "0" ) und das Programm soll in einer Schleife eine Funktion abarbeiten (hier exemplarisch in der Konsole "0" schreiben), solange wie keine andere Taste gedrückt wird.

Mein Problem ist, dass ich die schleife nicht beenden kann. :confused:
Ich habe schon einiges durchprobiert aber zu keiner Lösung gefunden.
Vielleicht hat ja von euch jemand einen Lösungsansatz. :slight_smile:

Im Prinzip soll man mit der Fernbedienung verschiedene Sachen (LED,LCD,usw.) auswählen könne. So soll zum Beispiel beim drücken der Taste "0" eine Funktion aufgerufen werden die auf einer 64 LED Matrix "HALLO" anzeigt solange wie keine anderen Inputs von dem IR Empfänger kommen. Durch auswählen einer neuen Taste auf dem Fernbedienung soll ein neuer Case aufgerufen werde und die alte Funktion unterbrochen werden.

#include "IRremote.h"

int receiver = 11; // Signal Pin of IR receiver to Arduino Digital Pin 11

/*-----( Declare objects )-----*/
IRrecv irrecv(receiver);     // create instance of 'irrecv'
decode_results results;      // create instance of 'decode_results'

/*-----( Function )-----*/
void translateIR() // takes action based on IR code received

// describing Remote IR codes 

{

  switch(results.value)

  {
  case 0xFFA25D: Serial.println("POWER"); break;
  case 0xFFE21D: Serial.println("FUNC/STOP"); break;
  case 0xFF629D: Serial.println("VOL+"); break;
  case 0xFF22DD: Serial.println("FAST BACK");    break;
  case 0xFF02FD: Serial.println("PAUSE");    break;
  case 0xFFC23D: Serial.println("FAST FORWARD");   break;
  case 0xFFE01F: Serial.println("DOWN");    break;
  case 0xFFA857: Serial.println("VOL-");    break;
  case 0xFF906F: Serial.println("UP");    break;
  case 0xFF9867: Serial.println("EQ");    break;
  case 0xFFB04F: Serial.println("ST/REPT");    break;
  case 0xFF6897: 
                 do{
                 Serial.println("0");
                 }while(irrecv.decode(&results)!=0);
                 break;
  case 0xFF30CF: Serial.println("1");    break;
  case 0xFF18E7: Serial.println("2");    break;
  case 0xFF7A85: Serial.println("3");    break;
  case 0xFF10EF: Serial.println("4");    break;
  case 0xFF38C7: Serial.println("5");    break;
  case 0xFF5AA5: Serial.println("6");    break;
  case 0xFF42BD: Serial.println("7");    break;
  case 0xFF4AB5: Serial.println("8");    break;
  case 0xFF52AD: Serial.println("9");    break;
  case 0xFFFFFFFF: Serial.println(" REPEAT");break;  

  default: 
    Serial.println(" other button   ");

  }// End Case

  delay(500); // Do not get immediate repeat


} //END translateIR
void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);
  Serial.println("IR Receiver Button Decode"); 
  irrecv.enableIRIn(); // Start the receiver

}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  if (irrecv.decode(&results)) // have we received an IR signal?

  {
    translateIR(); 
    irrecv.resume(); // receive the next value
  }  
}/* --(end main loop )-- */

In der Funktion translateIR() musst Du nur den Code ermitteln und ihn Dir merken.
Im Loop wertest Du dann den Code aus und machst das, was getan werden soll.

Eigene Schleifen blockieren den Ablauf. Du hast doch bereits eine Schleife: loop

Gruß Tommy

Danke schon mal für die Antwort.

Es geht mir aber eher darum wie ich die do{}while Schleife bei dem Case "0" beenden kann sobal ich eine neue Taste drücke. Da es in der Technik Anwendungen gibt, wo ich eine Taste drücke und der Aktor solange aktiv ist bis eine neue Taste gedrückt wird, habe ich mir gedacht muss das ja auch hier umsetzt bar sein.
Liebe Grüße Flo

MigFlow:
Es geht mir aber eher darum wie ich die do{}while Schleife bei dem Case "0" beenden kann sobal ich eine neue Taste drücke. Da es in der Technik Anwendungen gibt, wo ich eine Taste drücke und der Aktor solange aktiv ist bis eine neue Taste gedrückt wird, habe ich mir gedacht muss das ja auch hier umsetzt bar sein.
Liebe Grüße Flo

Tommy hat schon Recht.
Eine zusätzliche Schleife brauchst du nicht.

Nimm eine Statusvariable, die durch deine Taste erst auf "1" oder TRUE gesetzt wird und beim nächsten mal auf "0" bzw. FALSE gesetzt wird.
Entsprechend dem Ergebnis der Variable setzt du deinen Ausgang.

MigFlow:
Es geht mir aber eher darum wie ich die do{}while Schleife bei dem Case "0" beenden kann...

Indem Du keine verwendest.

Gruß Tommy

ok ich bin verwirt :confused: . Da ich mich in C etwas besser auskenne habe ich dort mal fix das Programm erstellt. Mit dem Tastendruck von "ESC" wird die schleife verlassen.

//Nutzung von _kbhit() und _getch() sowie der Taste Esc (Escape)

#include <conio.h>
#include <stdio.h>

void main()
{
          bool ende = false;                                 // Taste Esc setzt ende auf true
          int taste = 0;
          do
         {
               // Hier kommt das gesamte Programm
               printf("Ich rechne noch …\n");

               if(_kbhit() != 0)                                 // Test auf Tastendruck
               {                                                      // Ja, es wurde eine Taste gedrückt
                    taste =_getch();                           // Taste lesen
                    if(taste == 0x1B)                         // War es die Esc-Taste?
                    ende = true;                                // Ja, dann Ende der while-Schleife

               }
         }
         while(ende == false);
}

nach diesem Beispiel habe ich den den code überarbeitet und habe die Zustandsvariablen einbaut aber leider verlässt er die schleife immer noch nicht.

#include "IRremote.h"

int receiver = 11; // Signal Pin of IR receiver to Arduino Digital Pin 11

/*-----( Declare objects )-----*/
IRrecv irrecv(receiver);     // create instance of 'irrecv'
decode_results results;      // create instance of 'decode_results'



void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);
  Serial.println("IR Receiver Button Decode"); 
  irrecv.enableIRIn(); // Start the receiver

}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  if (irrecv.decode(&results)) // have we received an IR signal?

  {
    bool state=false;
  switch(results.value)

  {
  case 0xFFA25D: Serial.println("POWER"); break;
  case 0xFFE21D: Serial.println("FUNC/STOP"); break;
  case 0xFF629D: Serial.println("VOL+"); break;
  case 0xFF22DD: Serial.println("FAST BACK");    break;
  case 0xFF02FD: Serial.println("PAUSE");    break;
  case 0xFFC23D: Serial.println("FAST FORWARD");   break;
  case 0xFFE01F: Serial.println("DOWN");    break;
  case 0xFFA857: Serial.println("VOL-");    break;
  case 0xFF906F: Serial.println("UP");    break;
  case 0xFF9867: Serial.println("EQ");    break;
  case 0xFFB04F: Serial.println("ST/REPT");    break;
  case 0xFF6897:                            //hier soll die Schleife ausgeführt werden, welche mit beliebigen tastendruck auf der 
  //IR Fernbedienung beednet werden soll 
                 
                 do{
                 Serial.println("0");
                 irrecv.resume();
                 if(irrecv.decode(&results)&&results.value==0xFFE21D)
                   {
                    state=true;
                   }
                 }while(state == false);
                 break;
                 
  case 0xFF30CF: Serial.println("1");    break;
  case 0xFF18E7: Serial.println("2");    break;
  case 0xFF7A85: Serial.println("3");    break;
  case 0xFF10EF: Serial.println("4");    break;
  case 0xFF38C7: Serial.println("5");    break;
  case 0xFF5AA5: Serial.println("6");    break;
  case 0xFF42BD: Serial.println("7");    break;
  case 0xFF4AB5: Serial.println("8");    break;
  case 0xFF52AD: Serial.println("9");    break;
  case 0xFFFFFFFF: Serial.println(" REPEAT");break;  

  default: 
    Serial.println(" other button   ");

  }// End Case

  delay(500); // Do not get immediate repeat
 
    irrecv.resume(); // receive the next value
  }  
}/* --(end main loop )-- */

wie ich es ohne Schleife schaffen soll, dass das Programm nach einem IR Signal bis zum nächsten IR Signal eine Funktion abarbeitet ist mir leider nicht klar.

Nochmal: loop ist Deine (einzige) Schleife. Die Steuerung musst Du über Stausvariable(n) machen.
Wenn Dir das zu hoch ist, lerne die Grundlagen und kehre dann zu Deinem Projekt zurück.

Gruß Tommy

MigFlow:
.....
wie ich es ohne Schleife schaffen soll, dass das Programm nach einem IR Signal bis zum nächsten IR Signal eine Funktion abarbeitet ist mir leider nicht klar.

Verstehst du den Begriff "Statusvariable" nicht ?

Hier ein Beispiel, wie du es mit der anstellen kannst.

Ungetestet:

bool Statusvariable = false;

#include "IRremote.h"

int receiver = 11; 

IRrecv irrecv(receiver);     // create instance of 'irrecv'
decode_results results;      // create instance of 'decode_results'

void setup() {


}

void loop() {
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    switch (results.value)
    {
      // deine diversen case
      case 0xFFA25D:
        Statusvariable = false;
        break;

      case 0xFF6897:
        Statusvariable = true;
        break;
    }
    if (Statusvariable)
    {
      // hier soll was passieren wenn Statusvariable = true
    }
  }
}

Wie Tommy schon schreibt, lerne die Grundlagen in C++.

Ok ok ich verstehe schon was ihr meint. Und das war auch mein zweiter oder dritter Ansatz. Mir geht es aber darum, dass ich die Funktion sofort verlasse, sobald der Status verlassen wird und nicht die Funktion erst noch fertig abgearbeitet wird.
ich habe jetzt meine Code wieder so ähnlich wie den von Tommy. Das ist schon richtig Danke schön soweit. Ich hatte mich nur daran erinnert, dass ich in C mal eine Funktion geschrieben habe, die jeder zeit mit ESC unterbrochen wird. Da werde ich wohl noch etwas rumprobieren müssen, sobal ich etwas mehr Zeit habe :).

Liebe Grüße Flo

bool Statusvariable_1_1 = false;
bool Statusvariable_1_2 = false;

#include "IRremote.h"

int receiver = 11; 

IRrecv irrecv(receiver);     // create instance of 'irrecv'
decode_results results;      // create instance of 'decode_results'

void setup() {


}

void loop() {
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
//wenn taste 0-1 gedrückt wird jeden Status verlassen
Statusvariable_1_1 = false;
Statusvariable_1_2 = false;



    switch (results.value)
    {
      // deine diversen case
      case 0xFFA25D:
        Statusvariable_1_1 = false;
        break;

      case 0xFF6897:
        Statusvariable_1_2 = true;
        break;
    }
    if (Statusvariable_1_1)
    {
myfunction();
      // hier soll was passieren wenn Statusvariable = true
    }
  }
}

MigFlow:
... die jeder zeit mit ESC unterbrochen wird.

Es gibt break und return, die zum Verlassen benutzt werden können. Ist aber nach meiner Einschätzung nicht zielführend. Doch probiere es aus, nur aus Fehlern lernt man bekanntlich :slight_smile:

MigFlow:
Ok ok ich verstehe schon was ihr meint.

Das glaube ich allerdings nicht....sonnst würdest du verstehen, wie das funktioniert.
Dein Versuch mit einer weiteren Schleife ist jedenfalls die schlechteste Lösung.

Mir geht es aber darum, dass ich die Funktion sofort verlasse, sobald der Status verlassen wird und nicht die Funktion erst noch fertig abgearbeitet wird.

Und warum machst du das nicht ?
Auch das ist über eine weitere Statusvariable lösbar.

ich habe jetzt meine Code wieder so ähnlich wie den von Tommy. Das ist schon richtig Danke schön soweit.

Da meinst du sicher mich, oder ?

Ich hatte mich nur daran erinnert, dass ich in C mal eine Funktion geschrieben habe, die jeder zeit mit ESC unterbrochen wird.

Das wird wohl schwer, der Arduino kennt das ESC nicht direkt.