Arduino Projekt: Türsicherheitssystem
Autor: Justin Frommberger
Aufgabenstellung
- Ziel von dem Projekt ist eine Tür Sicherheitssystem zu simulieren.
- Die Aufgabe ist, mit einem vierstelligen Zahlen Code die Tür zu öffnen.
- Wenn der Code 3-mal Falsche eingegeben wurde, ertönt ein Warnsignal.
- Alle Eingaben sollen auf dem seriellen Monitor angezeigt werden.
Benötigte Software
- Aktuellste Arduino IDE mit der Version für ihren PC. (Download link)
- Bibliotheken für das 4x4 Tastenfeld downloaden: (Link)
- Klicke oben rechts in GitHub auf Code und dann downloade die Zip-Datei.
- Um die Zip-Datei in ihre Arduino Bibliothek einzubinden, folgen diese Schritte: (Link)
Benötigte Materiallien
Tabelle 1: Materialliste
Nr. | Anz. | Beschreibung | Bild | Pos. | Anz. | Beschreibung | Bild |
---|---|---|---|---|---|---|---|
① | 1 | Funduino Arduino UNO R3 | ② | viele | Jumper Kabel, 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!
Arduino Uno R3:
- Der Arduino besitzt unterschiedliche Schnittstellen, weil der Arduino ein digitaler Mikrocontroller ist, kann er nur 5 Volt ausgeben oder annehmen.
- Bei einer konstanten 5 V Spannung, ist die LED immer gleich hell, so ist das Ziel die Spannung zur LED zu reduzieren.
- Dafür wird eine Pulsweitenmodulation (PWM) Schnittstelle benötigt, denn bei den anderen Schnittstellen ist dies nicht möglich.
- Bei einem geringen PWM-Wert ist das 5 V Signal kaum noch vorhanden und bei einem hohen PWM-Wert liegt das 5 V Signal nahezu durchgehend am Pin an.
- Durch die PWM Schnittstelle kann nun die LED unterschiedlich hell leuchten, da die Spannung anpassbar ist.
- Die [PWM] Schnittstellen sind ganz einfach zu erkennen an diesem Zeichen (~)
LED:
- Beachte beim Arbeiten mit der LED, die Anode und Kathode nicht zu vertauschen.
- In die Anode fließt der Strom hinein (lange Seite), danach fließt der Strom wieder durch die Kathode hinaus (kurze Seite) siehe Abb. 2.
- Wenn die LED am Ende des Projektes nicht leuchtet, wurde dies vertauscht, einfach umdrehen und sie leuchtet!
Steckbrett:
Erklärung zum Arbeiten mit einem Steckbrett: (Link)
Servomotor:
- Schwarz oder Braun = Masse (GND)
- Rot = + 5 V
- Orange, Gelb oder Weiß = PWM-Signal
Tastenfeld:
Anleitung zum Tastenfeld siehe: (Link)
Aufbau Schaltung
In Abb. 3 wird die Schaltung für das Projekt " Tür Sicherheitssystem" dargestellt.
Arduino Datei erstellen
Erstellen der ersten Arduino Datei (Link zum Tutorial).
Programmierung Vorkenntnisse
- Kenntnisse in den Programmierrichtlinien für die Erstellung von Software. (Link)
- Grundkenntnisse von Projekt 1-4 verstanden haben. (Link)
- Grundkenntnisse für das Projekt "Tür Sicherheitssystem" verstehen. (Link)
Programmierung Anleitung
Nachdem alle Schritte abgeschlossen sind, kann mit der Programmierung des Projektes gestartet werden.
1) Bibliotheken einfügen
Zuerst muss, für das Projekt Tür Sicherheitssystem, die heruntergeladenen Bibliotheken eingefügt werden.
Benötigt wird die Bibliothek für den Servomotor und für das Tastenfeld.
Quelltext 1: TSS.ino
Lösung |
/* Benötigte Bibliotheken */
#include <Keypad.h>
#include <Servo.h>
|
2) Initialisierung Arduino
Im nächsten Schritt wird das Projekt mit den verbundenen Hardwarebauteilen im Programm initialisiert.
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ötigt werden Variablen zum:
- Festlegen des Passwortes
- Speichern der aktuell gedrückten Taste
- Speichern der vier gedrückten Tasten
- verhindern einer falschen Position bei der Eingabe
Quelltext 2: 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
|
Musterlösung
Quelle: Link
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 Servo 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); //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 gepü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 Abschlitt 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 "); //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
}
}
}
|
→ zurück zum Hauptartikel: BA: Arduino-Projekte für die Lehre