Arduino Multifunction-Shield: Infrarot-Fernbedienung als Steuerung
Seite 4: Weitere Beispielanwendung für MFS: IR-Codeschloss
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.
Code eingeben und prüfen lassen
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.
Sketch auf den Arduino laden
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;