Arduino Multifunction-Shield: Infrarot-Fernbedienung als Steuerung

Seite 3: Erweiterung des Küchentimers: Steuerung per Fernbedienung

Inhaltsverzeichnis

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).

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.

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;

}

}

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

}