Arduino Multifunction-Shield: Infrarot-Fernbedienung als Steuerung
Seite 3: Erweiterung des Küchentimers: Steuerung per Fernbedienung
Im Demo-Sketch mfs_timer1.ino für einen Küchentimer wurde die Zeit über das Trimmerpoti auf dem MFS eingestellt. Wir wollen nun diesen Sketch so abändern, dass die Zeiteingabe komfortabel per IR-Fernbedienung möglich ist. Nach einem Reset soll zunächst der Wert 0000 angezeigt werden. Nun kann mit den Zifferntasten die gewünschte Zeit in Sekunden eingegeben und anschließend mit der OK-Taste der Timer gestartet werden.
Die Ziffern werden von rechts nach links ins Display eingeschoben, dadurch müssen nicht genau 4 Ziffern eingegeben werden, sondern es kann z.B. für eine Zeit von 13 Sekunden einfach nur 1 und 3 gefolgt von OK gedrückt werden. Genausogut könnte jedoch 0013 eingegeben werden. Falls man sich vertippt hat, gibt man einfach die Zeit erneut als vierstelligen Wert ein (ggf. mit führenden Nullen).
Timer vorzeitig abbrechen
Möchte man den laufenden Timer vorzeitig abbrechen, dann drückt man die Standby-Taste der Fernbedienung. Der akustische Alarm wird dann unterdrückt, die Anzeige auf 0000 zurückgesetzt und der Eingabemodus aktiviert.
Anstatt der LED1 wird hier die LED4 verwendet, um den laufenden Timer zusätzlich per LED anzuzeigen. LED1 wird als Indikator für empfangene IR-Codes verwendet, die durch kurzes Flackern signalisiert werden.
Sketch auf den Arduino laden
Auf den Arduino muss der passende Sketch mfs_kuechentimer_ir.ino geladen werden. Es wurden folgende Anpassungen bezogen auf das ursprüngliche Demoprogramm mfs_timer1.ino gemacht:
Am Programmanfang werden Definitionen für IRremote eingefügt:
#include <IRremote.h>
int recvPin = 2;
IRrecv irrecv(recvPin);
In der Timer-Interruptserviceroutine werden am Anfang die Interrupts mit sei() freigeben, damit auf eingehende IR-Signale per Interrupt reagiert werden kann:
ISR(TIMER1_COMPA_vect)
{
sei(); // Interrupts freigeben, damit IR-Interrupt rechtzeitig bedient werden kann
switch (++ActDigit) // es wird bei jedem IRQ eine der 4 digits dargestellt.
{
case 1 : WriteNumberToSegment(0, DisplayValue / 1000); break;
case 2 : WriteNumberToSegment(1, (DisplayValue / 100) % 10); break;
case 3 : WriteNumberToSegment(2, (DisplayValue / 10) % 10); break;
case 4 : WriteNumberToSegment(3, DisplayValue % 10); ActDigit = 0; break;
}
}
IR-Empfang aktivieren
In der setup-Funktion wird der IR-Empfang aktiviert:
irrecv.enableIRIn(); // Start the receiver
irrecv.blink13(true); // LED on pin 13 blinks at every received IR code
In der loop-Funktion erfolgt die Abfrage auf IR-Codes und die entsprechende Auswertung. Bei Verwendung anderer Fernbedienungen muss die Auswertung auf IR-Protokoll und IR-Tastencode entsprechend angepasst werden. Beispielauszug aus dem Quellcode:
if (irrecv.decode(&results)) // Prüfen, ob IR Code empfangen
{
if (results.decode_type == RC5) // Prüfen ob RC5 Protokoll
{
toggleBit = (results.value >> 11) & 0x01; // Togglebit ausmaskieren
address = (results.value >> 6) & 0x1F; // 5 bits address
command = results.value & 0x3F; // 6 bits command
if(address == 0x15) // auf Adresse 15 (hex) prüfen
{
...
}
toggleBit_old = toggleBit; // Togglebit merken
}
irrecv.resume(); // IR Dekodierung zurücksetzen
}