Funktion wird zwei Mal hintereinander ausgeführt.

Hallo,

ich habe hier ein Verständnisproblem:
Ich habe mir eine Schaltung aufgebaut, mit der ich einen LED-Streifen per IR-Fernbedienung steuern will.
Zum Testen habe ich erst mal nur drei Tasten belegt.

Der Sketch sollte recht einfach sein: Zuerst wird der IR-Empfänger abgefragt und das Ergebnis in die Variable "fbcode" geschrieben.
Nun soll je nach Inhalt von fbcode eine bestimmte Funktion aufgerufen werden.
Die Funktion dimmt mittels einer for-Schleife die jeweilige Farbe, schreibt einen Wert in fbcode und soll dann enden.
Allerdings werden die LEDs immer zwei mal gedimmt und die Funktion endet erst dann.
Das verstehe ich nicht ganz, normalerweise sollte doch fbcode schon vor dem ersten Dimm-Durchlauf verändert werden und somit einen weiteren Aufruf der Funktion verhindern.

Wo liegt mein Denkfehler?

#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 10

void setup()
{
  pinMode(REDPIN, OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN, OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn();
}

int redint, greenint, blueint;
unsigned long time;
unsigned long last = millis();
unsigned long fbcode;

void loop() {
  if (irrecv.decode(&results)){
    //Serial.println(results.value, HEX);
    if (millis() - last > 250) {
      fbcode = (results.value);
      Serial.println(fbcode, HEX);
    }
    last = millis();
    irrecv.resume();
  }
  if (fbcode == 0x10){
    machrot();
  }
  if (fbcode == 0x810){
    machgruen();
  }
  if (fbcode == 0x410){
    machblau();
  }

}

void machrot(){
  fbcode = 0x12345;
  for (redint = 255; redint > 0; redint--){
    analogWrite(REDPIN, redint);
    delay(10);
  }
  analogWrite(REDPIN, 0);
}

void machgruen(){
  fbcode = 0x12345;
  for (greenint = 255; greenint > 0; greenint--){
    analogWrite(GREENPIN, greenint);
    delay(10);
  }
  analogWrite(GREENPIN, 0);
}

void machblau(){
  fbcode = 0x12345;
  for (blueint = 255; blueint > 0; blueint--){
    analogWrite(BLUEPIN, blueint);
    delay(10);
  }
  analogWrite(BLUEPIN, 0);
}

Und noch eine Frage: Wie kann ich, während eine Funktion läuft überprüfen, ob inzwischen eine andere Taste der Fernbedienung gedrückt wurde und die laufende Funktion abbrechen?

mfG,
f.

Hallo,
könnte es sein, daß das Signal von der Fernbedienung länger vorgehalten wird, sodaß es, wenn der Zeitabstand kurz genug ist, auch beim 2. Schleifendurchlauf wieder gegeben ist?
Vielleicht hilft ja, den Zeitabstand (250) zwischen millis und last zu vergrößern.

Um in der laufenden Funktion die Eingänge zu überprüfen, müßtest Du eine ebensolche Überprüfung direkt in dieser Funktion ausführen.
Oder mit einem Interrupt.

Gruß
Reinhard