Arduino Projekt: Türsicherheitssystem
Autor: Justin Frommberger
Aufgabenstellung
- Ziel des Projektes ist eine Tür Sicherheitssystem zu simulieren.
- Die Aufgabe ist, mit einem vierstelligen Zahlen Code die Tür zu öffnen (LED grün).
- Wenn der Code 3-mal Falsche eingegeben wurde, ertönt ein Warnsignal und die LED leuchtet rot auf.
- Alle Eingaben sollen auf dem seriellen Monitor angezeigt werden.
Benötigte Materiallien
Tabelle 1: Materialliste
Nr. | Anz. | Beschreibung | Bild |
---|---|---|---|
① | 1 | Funduino Arduino UNO R3 | |
② | 1 | USB A zu USB B | |
③ | 20+ | Jumperkabel, männlich/männlich | |
④ | 1 | Steckbrett | |
⑤ | 2 | LED Rot/Grün | |
⑥ | 3 | Widerstand 120 Ω |
|
⑦ | 1 | TowerPro SG90 Servomotor | |
⑧ | 1 | Piezo Lautsprecher | |
⑨ | 1 | 4x4 Tastenfeld |
Vorab wichtig zu wissen!
Servomotor Kabel
Schwarz oder Braun | Masse (GND) |
Rot | VCC/+ 5 V |
Organe, Gelb oder Weiß | PWM-Signal |
Tastenfeld
Was ist ein Tastenfeld, siehe: [klicken]
Aufbau Schaltung
In Abb. 4 wird die Schaltung für das Projekt "Tür Sicherheitssystem" dargestellt.
Bevor mit der Programmierung begonnen werden kann, muss die Schaltung des Projekts aufgebaut werden.
Programmierung
Es ist wichtig, die [Programmierrichtlinien] beim Programmieren einzuhalten.
1) Bibliotheken einfügen
Lade, für das Projekt, die Bibliothek für das Tastenfeld 4x4 herunter.
Benötigt werden die Bibliotheken Servo.h
und Keypad.h
.
[Quelltext 1: TSS.ino
]
Lösung |
/* Benötigte Bibliotheken */
#include <Keypad.h>
#include <Servo.h>
|
2) Initialisierung Arduino
2.1 Tastenfeld initialisieren
Ziel ist, alle benötigten Variablen für die Funktion: Keypad Tastenfeld = Keypad(makeKeymap(Hexa_Keys), Row_Pins, Col_Pins, ROWS, COLS);
festzulegen.
- ROWS sind die Anzahl der Spalten und COLS sind die Anzahl der Zeilen, diese werden als Variable festgelegt.
- Daraufhin müssen Row_Pins und Col_Pins ihren Ziffern zugeordnet werden über eine Array-Zuweisung.
- Zum Schluss muss die Hexa_Keys Matrix aufgebaut werden, hier wird jede Ziffer für das Tastenfeld festgelegt.
[Quelltext 2: TSS.ino
]
Lösung |
/* Tastenfeld */
/* Größe des Keypads definieren */
const byte COLS = 4; //4 Spalten
const byte ROWS = 4; //4 Zeilen
byte Col_Pins[COLS] = {2,3,4,5}; //Definition der Pins für die 3 Spalten
byte Row_Pins[ROWS] = {6,7,8,9}; //Definition der Pins für die 4 Zeilen
/* Ziffern und Zeichen des Keypads festlegen */
char Hexa_Keys[ROWS][COLS]={
{'D','#','0','*'},
{'C','9','8','7'},
{'B','6','5','4'},
{'A','3','2','1'}
};
Keypad Tastenfeld = Keypad(makeKeymap(Hexa_Keys), Row_Pins, Col_Pins, ROWS, COLS); //Das Keypad kann ab sofort mit "Tastenfeld" angesprochen werden
|
2.2 Tastenfeld Variablen
Benötigte Variablen zum:
- Festlegen des Passwortes, jeder Buchstabe einzeln.
- Speichern der aktuell gedrückten Taste.
- Speichern der vier gedrückten Tasten.
- Verhindern einer falschen Position bei der Eingabe.
[Quelltext 3: TSS.ino
]
Lösung |
/* Variablen */
char P1='1';char P2='2';char P3='3';char P4='A'; // Vier Zeichen des Passwortes eingegeben
char Taste; //Taste ist die Variable für die jeweils gedrückte Taste auf dem Tastenfeld
char C1, C2, C3, C4; // Speichern der gedrückten Tasten
byte z1=0, z2, z3, z4; // Falschen Position zugeordnet wird verhindern
|
3. Motor, Buzzer und RGB initialisieren
LED | 12 und 13 |
Motor | 11 |
Buzzer | 10 |
⇒ pinMode();
⇒ Servo.h
[Quelltext 4: TSS.ino
]
Lösung |
/* Motor */
Servo Servo_blau; //Servomotor Definition
/* Buzzer */
const byte SOUND_BUZZER = 10; // Buzzer ist an Pin 10 angeschlossen
unsigned int Sound = 500; // Frequenz von 500 Hertz
byte Falsche_Eingabe; // Für eine falsche Eingabe
/* RGB */
byte ROTE_LED = 12; //Rote LED ist an Pin 12 angeschlossen
byte GRUENE_LED = 13; //Grüne LED wird an Pin 13 angeschlossen
void setup()
{
Serial.begin(9600);
pinMode(ROTE_LED, OUTPUT); //Die LEDs werden als Ausgang festgelegt
pinMode(GRUENE_LED, OUTPUT);
Servo_blau.attach(11); //Der Servomotor ist an Pin 11 angeschlossen
}
|
3) Richtige Reihenfolge der Eingabe
Wichtig ist, dass die Ziffern richtig eingegeben werden.
- So muss sich eine Funktion überlegt werden, welches dies ermöglicht.
- Zur Verwendung kommen nun die Variablen für die falsche Eingabe.
- Auch muss die Variable Taste ihre Werte erhalten.
- Die gedrückte Taste wird in der C1-4 Variable abgespeichert, um später das Passwort zu überprüfen.
Tipp:
- Nachdem die erste Ziffer gedrückt wurde, öffnet sich die Eingabe für die zweite Ziffer usw.
- Benötigt wird hierfür eine
if-Bedingung
und einegoto
Funktion. - Die Taste bekommt mit der Funktion
Tastenfeld.getKey();
ihre Ziffer.
[Quelltext 5: TSS.ino
]
Lösung |
void loop()
{
Anfang: // Goto Anfang
Taste = Tastenfeld.getKey();
/* Richtige Reihenfolge des Passwortes erstellen */
if (z1==0) // Wenn das erste Zeichen noch nicht gespeichert wurde...
{
C1=Taste; //Unter der Variablen "C1" wird nun die aktuell gedrückte Taste gespeichert
Serial.print("Die Taste "); //Teile uns am Serial Monitor die gedrückte Taste mit
Serial.print(C1);
Serial.println(" wurde gedrueckt");
z1=1; z2=0; z3=1; z4=1; // Zugang zur zweiten Zeicheneingabe freischalten
goto Anfang;
}
if (z2==0) // Wenn das zweite Zeichen noch nicht gespeichert wurde...
{
C2=Taste; //Unter der Variablen "C2" wird nun die aktuell gedrückte Taste gespeichert
Serial.print("Die Taste "); //Teile uns am Serial Monitor die gedrückte Taste mit
Serial.print(C2);
Serial.println(" wurde gedrueckt");
z1=1; z2=1; z3=0; z4=1; // Zugang zur dritten Zeicheneingabe freischalten
goto Anfang;
}
if (z3==0) // Wenn das dritte Zeichen noch nicht gespeichert wurde...
{
C3=Taste; //Unter der Variablen "C3" wird nun die aktuell gedrückte Taste gespeichert
Serial.print("Die Taste "); //Teile uns am Serial Monitor die gedrückte Taste mit
Serial.print(C3);
Serial.println(" wurde gedrueckt");
z1=1; z2=1; z3=1; z4=0; // Zugang zur vierten Zeicheneingabe freischalten
goto Anfang;
}
if (z4==0) // Wenn das vierte Zeichen noch nicht gespeichert wurde...
{
C4=Taste; //Unter der Variablen "C4" wird nun die aktuell gedrückte Taste gespeichert
Serial.print("Die Taste "); //Teile uns am Serial Monitor die gedrückte Taste mit
Serial.print(C4);
Serial.println(" wurde gedrueckt");
z1=1; z2=1; z3=1; z4=1; // Zugang zur weiteren Zeicheneingabe sperren
}
}
|
4) Tür öffnen und schließen
- Für das Öffnen der Tür wird die Taste (#) verwendet und zum Tür verriegeln die Taste (*).
- Wenn die Tür offen ist, leuchtet die LED Grün und Rot, wenn sie geschlossen ist.
- Der Motor soll ich zu 90 Grad drehen beim Schließen und zu 0 Grad beim Öffnen.
- Überprüfe vor dem Öffnen, ob das Passwort korrekt ist.
Tipp:
- Benötigt werden if-Else Funktionen, die nach der bestimmten Taste abfragen und die Anweisung dann ausführen.
- Nutze Vergleichsoperatoren zum Abfragen des Passwortes.
[Quelltext 6: TSS.ino
]
Lösung |
void loop()
{
Anfang: // Goto Anfang
Taste = Tastenfeld.getKey();
if (Taste)
{
if (Taste=='*')
{
Serial.println("Tuer verriegelt");
delay(2000);
Servo_blau.write(90); //Servo zum Verriegeln auf 90 Grad ansteuern
digitalWrite(ROTE_LED, HIGH);
digitalWrite(GRUENE_LED, LOW);
z1=0; z2=1; z3=1; z4=1; // Zugang zur ersten Zeicheneingabe freischalten
goto Anfang; // Damit das Zeichen "*" nicht im folgenden Abschnitt als Codeeingabe gewertet wird
}
if (Taste=='#')
{
if (C1==P1&&C2==P2&&C3==P3&&C4==P4) //wird geprüft, ob die eingaben Codezeichen übereinstimmen
{
Serial.println ("Code korrekt, Schloss offen");
Servo_blau.write(0); //Servo zum Öffnen auf 0 Grad ansteuern.
digitalWrite(ROTE_LED, LOW);
digitalWrite(GRUENE_LED, HIGH);
}
else // ist das nicht der Fall, bleibt das Schloss gesperrt
{
Serial.println ("Code falsch, Schloss gesperrt");
digitalWrite(ROTE_LED, HIGH);
digitalWrite(GRUENE_LED, LOW);
delay(2000);
z1=0; z2=1; z3=1; z4=1; // Der Zugang für die erste Zeicheneingabe wird wieder freigeschaltet
goto Anfang; // Damit das Zeichen "#" nicht im folgenden Abschnitt als Codeeingabe gewertet wird.
}
}
|
5) Einbrecher Warnung!
Als Zusatzaufgabe wurde sich überlegt, einen Buzzer ertönen zu lassen, wenn das Passwort 3-mal Falsche eingegeben wurde.
Tipp:
- Bei einer falschen Eingabe wird die Variable hochgezählt.
- Wenn die Variable 3 erreicht, ertönt der Buzzer.
⇒ tone();
[Quelltext 7: TSS.ino
]
Lösung |
if (Taste=='#')
{
if (C1==P1&&C2==P2&&C3==P3&&C4==P4) //wird geprüft, ob die eingaben Codezeichen übereinstimmen
{
Serial.println ("Code korrekt, Schloss offen");
Servo_blau.write(0); //Servo zum Öffnen auf 0 Grad ansteuern.
digitalWrite(ROTE_LED, LOW);
digitalWrite(GRUENE_LED, HIGH);
}
else // ist das nicht der Fall, bleibt das Schloss gesperrt
{
Serial.println ("Code falsch, Schloss gesperrt");
Falsche_Eingabe += 1;
if(Falsche_Eingabe == 3) // Wenn der Code 3 mal falsch eigegeben wurde
{
Serial.println("Besitzer wurde benachrichtigt!");
tone(SOUND_BUZZER, Sound);
delay(8000);
noTone(SOUND_BUZZER);
}
digitalWrite(ROTE_LED, HIGH);
digitalWrite(GRUENE_LED, LOW);
delay(2000);
z1=0; z2=1; z3=1; z4=1; // Der Zugang für die erste Zeicheneingabe wird wieder freigeschaltet
goto Anfang; // Damit das Zeichen "#" nicht im folgenden Abschnitt als Codeeingabe gewertet wird.
}
}
|
Musterlösung
Sollte Ihr Code nicht ordnungsgemäß funktionieren, überprüfen Sie ihn anhand der Musterlösung.
Lösung Code |
/* Benötigte Bibliotheken */
#include <Keypad.h>
#include <Servo.h>
/* Tastenfeld */
/* Größe des Keypads definieren */
const byte COLS = 4; //4 Spalten
const byte ROWS = 4; //4 Zeilen
byte Col_Pins[COLS] = {2,3,4,5}; //Definition der Pins für die 3 Spalten
byte Row_Pins[ROWS] = {6,7,8,9}; //Definition der Pins für die 4 Zeilen
/* Ziffern und Zeichen des Keypads festlegen */
char Hexa_Keys[ROWS][COLS]={
{'D','#','0','*'},
{'C','9','8','7'},
{'B','6','5','4'},
{'A','3','2','1'}
};
Keypad Tastenfeld = Keypad(makeKeymap(Hexa_Keys), Row_Pins, Col_Pins, ROWS, COLS); //Das Keypad kann ab sofort mit "Tastenfeld" angesprochen werden
/* Variablen */
char P1='1';char P2='2';char P3='3';char P4='A'; // Vier Zeichen des Passwortes eingegeben
char Taste; //Taste ist die Variable für die jeweils gedrückte Taste auf dem Tastenfeld
char C1, C2, C3, C4; // Speichern der gedrückten Tasten
byte z1=0, z2, z3, z4; // Falschen Position zugeordnet wird verhindern
/* Motor */
Servo Servo_blau; //Servomotor Definition
/* Buzzer */
const byte SOUND_BUZZER = 10; // Buzzer ist an Pin 10 angeschlossen
unsigned int Sound = 500; // Frequenz von 500 Hertz
byte Falsche_Eingabe; // Für eine falsche Eingabe
/* RGB */
byte ROTE_LED = 12; //Rote LED ist an Pin 12 angeschlossen
byte GRUENE_LED = 13; //Grüne LED wird an Pin 13 angeschlossen
void setup()
{
Serial.begin(9600);
pinMode(ROTE_LED, OUTPUT); //Die LEDs werden als Ausgang festgelegt
pinMode(GRUENE_LED, OUTPUT);
Servo_blau.attach(11); //Der Servomotor ist an Pin 11 angeschlossen
}
void loop()
{
Anfang: // Goto Anfang
Taste = Tastenfeld.getKey();
if (Taste)
{
if (Taste=='*')
{
Serial.println("Tuer verriegelt");
delay(2000);
Servo_blau.write(90); //Servomotor zum Verriegeln auf 90 Grad ansteuern
digitalWrite(ROTE_LED, HIGH);
digitalWrite(GRUENE_LED, LOW);
z1=0; z2=1; z3=1; z4=1; // Zugang zur ersten Zeicheneingabe freischalten
goto Anfang; // Damit das Zeichen "*" nicht im folgenden Abschnitt als Codeeingabe gewertet wird
}
if (Taste=='#')
{
if (C1==P1&&C2==P2&&C3==P3&&C4==P4) //wird geprüft, ob die eingaben Codezeichen übereinstimmen
{
Serial.println ("Code korrekt, Schloss offen");
Servo_blau.write(0); //Servomotor zum Öffnen auf 0 Grad ansteuern.
digitalWrite(ROTE_LED, LOW);
digitalWrite(GRUENE_LED, HIGH);
}
else // ist das nicht der Fall, bleibt das Schloss gesperrt
{
Serial.println ("Code falsch, Schloss gesperrt");
Falsche_Eingabe += 1;
if(Falsche_Eingabe == 3) // Wenn der Code 3-mal falsch eingegeben wurde
{
Serial.println("Besitzer wurde benachrichtigt!");
tone(SOUND_BUZZER, Sound);
delay(8000);
noTone(SOUND_BUZZER);
}
digitalWrite(ROTE_LED, HIGH);
digitalWrite(GRUENE_LED, LOW);
delay(2000);
z1=0; z2=1; z3=1; z4=1; // Der Zugang für die erste Zeicheneingabe wird wieder freigeschaltet
goto Anfang; // Damit das Zeichen "#" nicht im folgenden Abschnitt als Codeeingabe gewertet wird.
}
}
/* Richtige Reihenfolge des Passwortes erstellen */
if (z1==0) // Wenn das erste Zeichen noch nicht gespeichert wurde.
{
C1=Taste; //Unter der Variablen "C1" wird nun die aktuell gedrückte Taste gespeichert
Serial.print("Die Taste ");
Serial.print(C1);
Serial.println(" wurde gedrückt");
z1=1; z2=0; z3=1; z4=1; // Zugang zur zweiten Zeicheneingabe freischalten
goto Anfang;
}
if (z2==0)
{
C2=Taste; //Unter der Variablen "C2" wird nun die aktuell gedrückte Taste gespeichert
Serial.print("Die Taste ");
Serial.print(C2);
Serial.println(" wurde gedrückt");
z1=1; z2=1; z3=0; z4=1; // Zugang zur dritten Zeicheneingabe freischalten
goto Anfang;
}
if (z3==0)
{
C3=Taste; //Unter der Variablen "C3" wird nun die aktuell gedrückte Taste gespeichert
Serial.print("Die Taste ");
Serial.print(C3);
Serial.println(" wurde gedrückt");
z1=1; z2=1; z3=1; z4=0; // Zugang zur vierten Zeicheneingabe freischalten
goto Anfang;
}
if (z4==0) // Wenn das vierte Zeichen noch nicht gespeichert wurde
{
C4=Taste; //Unter der Variablen "C4" wird nun die aktuell gedrückte Taste gespeichert
Serial.print("Die Taste ");
Serial.print(C4);
Serial.println(" wurde gedrückt");
z1=1; z2=1; z3=1; z4=1; // Zugang zur weiteren Zeicheneingabe sperren
}
}
}
|
Quelle: Link
→ zurück zum Hauptartikel: BA: Arduino-Projekte für die Lehre