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.
/* Tastenfeld *//* Größe des Keypads definieren */constbyteCOLS=4;//4 SpaltenconstbyteROWS=4;//4 ZeilenbyteCol_Pins[COLS]={2,3,4,5};//Definition der Pins für die 3 SpaltenbyteRow_Pins[ROWS]={6,7,8,9};//Definition der Pins für die 4 Zeilen/* Ziffern und Zeichen des Keypads festlegen */charHexa_Keys[ROWS][COLS]={{'D','#','0','*'},{'C','9','8','7'},{'B','6','5','4'},{'A','3','2','1'}};KeypadTastenfeld=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.
/* Variablen */charP1='1';charP2='2';charP3='3';charP4='A';// Vier Zeichen des Passwortes eingegebencharTaste;//Taste ist die Variable für die jeweils gedrückte Taste auf dem TastenfeldcharC1,C2,C3,C4;// Speichern der gedrückten Tastenbytez1=0,z2,z3,z4;// Falschen Position zugeordnet wird verhindern
3. Motor, Buzzer und RGB initialisieren
Zum Schluss werden LED, Motor und Buzzer initialisiert und mit dem jeweiligen Pin verbunden.
Pin Belegung: LED (12,13), Motor (11) und Buzzer (10).
⇒ pinMode();
⇒ Servo.h
/* Motor */ServoServo_blau;//Servomotor Definition/* Buzzer */constbyteSOUND_BUZZER=10;// Buzzer ist an Pin 10 angeschlossenunsignedintSound=500;// Frequenz von 500 HertzbyteFalsche_Eingabe;// Für eine falsche Eingabe/* RGB */byteROTE_LED=12;//Rote LED ist an Pin 12 angeschlossenbyteGRUENE_LED=13;//Grüne LED wird an Pin 13 angeschlossenvoidsetup(){Serial.begin(9600);pinMode(ROTE_LED,OUTPUT);//Die LEDs werden als Ausgang festgelegtpinMode(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.
voidloop(){Anfang:// Goto AnfangTaste=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 gespeichertSerial.print("Die Taste ");//Teile uns am Serial Monitor die gedrückte Taste mitSerial.print(C1);Serial.println(" wurde gedrueckt");z1=1;z2=0;z3=1;z4=1;// Zugang zur zweiten Zeicheneingabe freischaltengotoAnfang;}if(z2==0)// Wenn das zweite Zeichen noch nicht gespeichert wurde...{C2=Taste;//Unter der Variablen "C2" wird nun die aktuell gedrückte Taste gespeichertSerial.print("Die Taste ");//Teile uns am Serial Monitor die gedrückte Taste mitSerial.print(C2);Serial.println(" wurde gedrueckt");z1=1;z2=1;z3=0;z4=1;// Zugang zur dritten Zeicheneingabe freischaltengotoAnfang;}if(z3==0)// Wenn das dritte Zeichen noch nicht gespeichert wurde...{C3=Taste;//Unter der Variablen "C3" wird nun die aktuell gedrückte Taste gespeichertSerial.print("Die Taste ");//Teile uns am Serial Monitor die gedrückte Taste mitSerial.print(C3);Serial.println(" wurde gedrueckt");z1=1;z2=1;z3=1;z4=0;// Zugang zur vierten Zeicheneingabe freischaltengotoAnfang;}if(z4==0)// Wenn das vierte Zeichen noch nicht gespeichert wurde...{C4=Taste;//Unter der Variablen "C4" wird nun die aktuell gedrückte Taste gespeichertSerial.print("Die Taste ");//Teile uns am Serial Monitor die gedrückte Taste mitSerial.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.
Ü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.
voidloop(){Anfang:// Goto AnfangTaste=Tastenfeld.getKey();if(Taste){if(Taste=='*'){Serial.println("Tuer verriegelt");delay(2000);Servo_blau.write(90);//Servo zum Verriegeln auf 90 Grad ansteuerndigitalWrite(ROTE_LED,HIGH);digitalWrite(GRUENE_LED,LOW);z1=0;z2=1;z3=1;z4=1;// Zugang zur ersten Zeicheneingabe freischaltengotoAnfang;// 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 freigeschaltetgotoAnfang;// 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.
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 freigeschaltetgotoAnfang;// 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.
/* Benötigte Bibliotheken */#include<Keypad.h>#include<Servo.h>/* Tastenfeld *//* Größe des Keypads definieren */constbyteCOLS=4;//4 SpaltenconstbyteROWS=4;//4 ZeilenbyteCol_Pins[COLS]={2,3,4,5};//Definition der Pins für die 3 SpaltenbyteRow_Pins[ROWS]={6,7,8,9};//Definition der Pins für die 4 Zeilen/* Ziffern und Zeichen des Keypads festlegen */charHexa_Keys[ROWS][COLS]={{'D','#','0','*'},{'C','9','8','7'},{'B','6','5','4'},{'A','3','2','1'}};KeypadTastenfeld=Keypad(makeKeymap(Hexa_Keys),Row_Pins,Col_Pins,ROWS,COLS);//Das Keypad kann ab sofort mit "Tastenfeld" angesprochen werden/* Variablen */charP1='1';charP2='2';charP3='3';charP4='A';// Vier Zeichen des Passwortes eingegebencharTaste;//Taste ist die Variable für die jeweils gedrückte Taste auf dem TastenfeldcharC1,C2,C3,C4;// Speichern der gedrückten Tastenbytez1=0,z2,z3,z4;// Falschen Position zugeordnet wird verhindern/* Motor */ServoServo_blau;//Servomotor Definition/* Buzzer */constbyteSOUND_BUZZER=10;// Buzzer ist an Pin 10 angeschlossenunsignedintSound=500;// Frequenz von 500 HertzbyteFalsche_Eingabe;// Für eine falsche Eingabe/* RGB */byteROTE_LED=12;//Rote LED ist an Pin 12 angeschlossenbyteGRUENE_LED=13;//Grüne LED wird an Pin 13 angeschlossenvoidsetup(){Serial.begin(9600);pinMode(ROTE_LED,OUTPUT);//Die LEDs werden als Ausgang festgelegtpinMode(GRUENE_LED,OUTPUT);Servo_blau.attach(11);//Der Servomotor ist an Pin 11 angeschlossen}voidloop(){Anfang:// Goto AnfangTaste=Tastenfeld.getKey();if(Taste){if(Taste=='*'){Serial.println("Tuer verriegelt");delay(2000);Servo_blau.write(90);//Servomotor zum Verriegeln auf 90 Grad ansteuerndigitalWrite(ROTE_LED,HIGH);digitalWrite(GRUENE_LED,LOW);z1=0;z2=1;z3=1;z4=1;// Zugang zur ersten Zeicheneingabe freischaltengotoAnfang;// 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 freigeschaltetgotoAnfang;// 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 gespeichertSerial.print("Die Taste ");Serial.print(C1);Serial.println(" wurde gedrückt");z1=1;z2=0;z3=1;z4=1;// Zugang zur zweiten Zeicheneingabe freischaltengotoAnfang;}if(z2==0){C2=Taste;//Unter der Variablen "C2" wird nun die aktuell gedrückte Taste gespeichertSerial.print("Die Taste ");Serial.print(C2);Serial.println(" wurde gedrückt");z1=1;z2=1;z3=0;z4=1;// Zugang zur dritten Zeicheneingabe freischaltengotoAnfang;}if(z3==0){C3=Taste;//Unter der Variablen "C3" wird nun die aktuell gedrückte Taste gespeichertSerial.print("Die Taste ");Serial.print(C3);Serial.println(" wurde gedrückt");z1=1;z2=1;z3=1;z4=0;// Zugang zur vierten Zeicheneingabe freischaltengotoAnfang;}if(z4==0)// Wenn das vierte Zeichen noch nicht gespeichert wurde{C4=Taste;//Unter der Variablen "C4" wird nun die aktuell gedrückte Taste gespeichertSerial.print("Die Taste ");Serial.print(C4);Serial.println(" wurde gedrückt");z1=1;z2=1;z3=1;z4=1;// Zugang zur weiteren Zeicheneingabe sperren}}}