Die Arduino Infrarot Fernbedienung macht immer noch nicht ganz was sie machen soll und wird nun weiter optimiert und bearbeitet…
Programmierung (Version 5):
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
int led1 = 2;
int led2 = 3;
void setup()
{
Serial.begin(9600);
pinMode (2, OUTPUT);
pinMode (3, OUTPUT);
pinMode (11, OUTPUT);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results))
{
Serial.println(results.value, DEC);
switch(results.value)
{
case (16) :
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
delay(1);
break;
case (2064) :
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
delay(1);
break;
default: delay(1);
}
irrecv.resume();
}
}
Programmierung (Version 6):
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
int led1 = 2; // LED 1 (rote LED) am Arduino-Pin 2
int led2 = 3; // LED 2 am Arduino-Pin 2
boolean value = LOW;
unsigned long previousMillis = 0;
unsigned long interval = 1000;
int flag = 0;
void setup()
{
pinMode (2, OUTPUT);
pinMode (3, OUTPUT);
pinMode (11, OUTPUT);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results))
{
Serial.println(results.value, DEC);
switch(results.value)
{
case (2320) :
flag = 0;
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
delay(1);
break;
case (16) :
flag = 0;
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
delay(1);
break;
case (2064) :
flag = 0;
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
delay(1);
break;
case (1040) :
flag = 0;
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
delay(1);
break;
case (3088) :
flag = 1;
digitalWrite(led1, LOW);
delay(100);
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
break;
case (528) :
flag = 2;
break;
case (2576) :
flag = 3;
break;
default: delay(1);
}
irrecv.resume();
}
if(flag == 1 && millis() - previousMillis > interval)
{
previousMillis = millis();
value = !value;
digitalWrite(led1, value);
}
if(flag == 2 && millis() - previousMillis > interval)
{
previousMillis = millis();
value = !value;
digitalWrite(led1, LOW);
digitalWrite(led2, value);
}
if(flag == 3 && millis() - previousMillis > interval)
{
previousMillis = millis();
value = !value;
digitalWrite(led1, value);
digitalWrite(led2, value);
}
}
Die Erfahrungen aus dem Tastenfeld-Code wurden hier erfolgreich übertragen. Es gibt aber noch Details die ich optimieren könnte…
case (3088) :
flag = 1;
digitalWrite(led1, LOW);
delay(100);
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
break;
case (528) :
flag = 2;
break;
Die Auswahl für Taste 4 und Taste 5 habe ich etwas abgewandelt. Vermutlich braucht es auch gar nicht die „digitalWrite“ Befehle für Taste 4, denn bei Taste 5 braucht es die ja auch nicht.
Die Wechselwirkung dieser Befehle mit der if-Anweisung ist mir noch nicht ganz klar.
if(flag == 1 && millis() - previousMillis > interval)
{
previousMillis = millis();
value = !value;
digitalWrite(led1, value);
}
Wenn die Variable „flag“ auf eins steht, wird LED 1 an und aus geschaltet…
if(flag == 2 && millis() - previousMillis > interval)
{
previousMillis = millis();
value = !value;
digitalWrite(led1, LOW);
digitalWrite(led2, value);
}
Wenn die flag auf zwei steht, dann wird LED 1 erstmal explizit ausgeschaltet und LED 2 fängt an zu blinken…
if(flag == 3 && millis() - previousMillis > interval)
{
previousMillis = millis();
value = !value;
digitalWrite(led1, value);
digitalWrite(led2, value);
}
Bei flag mit Wert 3 blinken beide LEDs gleichzeitig. Die LEDs sollen nun abwechselnd blinken, geht das so?
if(flag == 4 && millis() - previousMillis > interval)
{
previousMillis = millis();
value = !value;
digitalWrite(led1, value);
digitalWrite(led2, !value);
}
Antwort: Ja das geht so und damit sollte die Infrarot Fernbedienung auch vorerst erledigt sein.
Dies war jetzt der vorerst letzte Arduino Webartikel. Hinter den Kulissen geht es zwar weiter, doch ab nächsten Dienstag werden hier keine neuen Artikel veröffentlicht.