Arduino Projekt: Türsicherheitssystem: Unterschied zwischen den Versionen
Zeile 366: | Zeile 366: | ||
const byte COLS = 4; //4 Spalten | const byte COLS = 4; //4 Spalten | ||
const byte ROWS = 4; //4 Zeilen | const byte ROWS = 4; //4 Zeilen | ||
byte Col_Pins[COLS] = {2,3,4,5}; //Definition der Pins für die 3 Spalten | 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 | byte Row_Pins[ROWS] = {6,7,8,9}; //Definition der Pins für die 4 Zeilen | ||
/* Ziffern und Zeichen des Keypads festlegen */ | /* Ziffern und Zeichen des Keypads festlegen */ | ||
char Hexa_Keys[ROWS][COLS]={ | char Hexa_Keys[ROWS][COLS]={ |
Version vom 25. Juli 2023, 08:30 Uhr
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.
- 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
|
2.3) Motor, Buzzer und RGB initialisieren
Zum Schluss wird die externe Hardware initialisiert und mit dem jeweiligen Pin verbunden.
Pin belegung: RGB (12,13), Motor (11) und Buzzer (10).
Tipp:
- Bei Fragen zum Code, kann in den anderen Projekten nachgeschaut werden. (Link)
Quelltext 3: 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 Position.
- 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-Anweisung und eine goto Funktion.
- Die Taste bekommt mit der Funktion
Tastenfeld.getKey();
ihre Ziffer.
Quelltext 4: 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
- Nachdem nun die richtige Eingabe programmiert wurde, fehlt noch das öffnen und schließen der Tür.
- 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.
Tipp:
- Benötigt werden If-Else Funktionen, die nach der bestimmten Taste abfragen und die Anweisung dann ausführen.
Quelltext 5: 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.
Quelltext 6: TSS.ino
Lösung |
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.
}
}
|
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 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
}
}
}
|
→ zurück zum Hauptartikel: BA: Arduino-Projekte für die Lehre