Arduino Multifunction-Shield: Infrarot-Fernbedienung als Steuerung

Seite 4: Weitere Beispielanwendung für MFS: IR-Codeschloss

Inhaltsverzeichnis

Als weiteren Sketch für das MFS kann ein Codeschloss mit PIN-Eingabe per IR-Fernbedienung realisiert werden. Da zwingend die passende Fernbedienung zum Öffnen des Schlosses benötigt wird und keine herkömmlichen Bedientasten vorhanden sind, besteht keine direkte Möglichkeit, dass der Code von Unbefugten durch Ausprobieren geknackt werden könnte.

Der vierstellige Code kann über die Zifferntasten der Fernbedienung eingegeben werden, die Ziffern werden von rechts nach links ins Display eingeschoben. Nach Bestätigung mit der OK-Taste wird der Code geprüft. Jeder falsch eingegebene Code erzeugt 3 kurze Pieptöne und löst eine Eingabesperre von 5 Sekunden aus. Bei erfolgreichem Code wird ein einzelner längerer Piepton erzeugt und LED4 eingeschaltet. Über eine zusätzlich angeschlossene Treiberstufe mit einem Relais oder einem Elektromagneten könnte dann auch ein Codeschloss elektrisch oder elektromechanisch entriegelt werden.

Auf den Arduino muss der passende Sketch mfs_ir_codeschloss.ino geladen werden. Die Segmentdarstellung auf der LED-Anzeige wurde erweitert, sodass außer den Ziffern bis 9 auch noch Buchstaben von A bis F (falls zukünftig eine hexadezimale Anzeige gewünscht ist) sowie das Minus- und Leerzeichen dargestellt werden können:

enum

{

DIG_0,DIG_1,DIG_2,DIG_3,DIG_4,DIG_5,DIG_6,DIG_7,DIG_8,DIG_9,

DIG_A,DIG_B,DIG_C,DIG_D,DIG_E,DIG_F,

DIG_MINUS,

DIG_BLANK

};

// Segmente, die leuchten sollen pro Zahlwert (Low-Aktiv), & 0x7F Verknuepfen fuer Dezimalpunkt

const uint8_t SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90, // 0-9

0x88,0x83,0xC6,0xA1,0x86,0x8E, // A,b,C,d,E,F

0xBF, // -

0xFF // BLANK

};

Für die vier anzuzeigenden Segmentwerte wird ein Array angelegt:

volatile uint8_t DisplayDigits[4]; // auf dem Display darzustellende Werte. Kann jederzeit geaendert werden und wird sofort dargestellt. [0] = links, [3] = rechts

Der gewünschte Pin-Code für das Schloss wird ebenfalls als Array angelegt:

const uint8_t pinCode[4] = { 2, 1, 0, 5 };

In der Timer-Interruptserviceroutine werden die Interrupts mit sei() freigeben und die Ausgabe anhand der Werte des Arrays DisplayDigits durchgeführt:

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, DisplayDigits[0]); break;

case 2 : WriteNumberToSegment(1, DisplayDigits[1]); break;

case 3 : WriteNumberToSegment(2, DisplayDigits[2]); break;

case 4 : WriteNumberToSegment(3, DisplayDigits[3]); ActDigit = 0; break;

}

}

Durch Beschreiben der Elemente des Arrays DisplayDigits[] kann die Anzeige gesteuert werden.

Folgende Zeile zeigt beispielsweise ein Minuszeichen auf der 7-Segment-Anzeige ganz links an:

DisplayDigits[0] = DIG_MINUS;