Zahlenschloss mit Tastenfeld und Arduino
FunduinoZuletzt aktualisiert am
Mit einem vierstelligen Code einen Servo als Riegel steuern
Material
Die Aufgabe
Aufbau
Bibliotheken installieren
So funktioniert der Sketch
Der Programmcode
Sketch: Zahlenschloss mit Tastenfeld und Servo
#include <Keypad.h>
#include <Servo.h>
char P1 = '1';
char P2 = '2';
char P3 = '3';
char P4 = 'A'; // Hier stehen die vier Zeichen des Passwortes. Hier: "123A"
char C1, C2, C3, C4; // Unter C1 bis C4 werden die vier eingegebenen Zeichen gespeichert.
Servo servoblau; // Der Servo wird ab jetzt mit "servoblau" angesprochen.
int roteLED = 13; // Die rote LED ist an Pin 13 angeschlossen.
int grueneLED = 12; // Die gruene LED ist an Pin 12 angeschlossen.
// Ab hier wird die Groesse des Keypads festgelegt.
const byte COLS = 4; // 4 Spalten
const byte ROWS = 4; // 4 Zeilen
// Mit z1 bis z4 wird gesteuert, welche Position der Codeeingabe gerade frei ist.
// Nur so landet jede Ziffer an der richtigen Stelle.
// z1 = 0 bedeutet: die erste Position wartet auf eine Eingabe.
int z1 = 0, z2 = 1, z3 = 1, z4 = 1;
// Die Ziffern und Zeichen des Keypads
char hexaKeys[ROWS][COLS] = {
{ 'D', '#', '0', '*' },
{ 'C', '9', '8', '7' },
{ 'B', '6', '5', '4' },
{ 'A', '3', '2', '1' }
};
byte colPins[COLS] = { 2, 3, 4, 5 }; // Pins fuer die 4 Spalten
byte rowPins[ROWS] = { 6, 7, 8, 9 }; // Pins fuer die 4 Zeilen
char Taste; // Die jeweils gedrueckte Taste
Keypad Tastenfeld = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup() {
Serial.begin(9600);
pinMode(roteLED, OUTPUT);
pinMode(grueneLED, OUTPUT);
servoblau.attach(11); // Der Servo ist an Pin 11 angeschlossen.
}
void loop() {
Anfang: // Markierung, zu der per goto gesprungen werden kann
Taste = Tastenfeld.getKey(); // Unter "Taste" wird die gedrueckte Taste gespeichert.
if (Taste) // Wenn eine Taste gedrueckt wurde ...
{
// Zuerst die Sterntaste, denn sie hat die Sonderfunktion Verriegeln.
// Danach die Rautetaste, nach der der eingegebene Code geprueft wird.
if (Taste == '*')
{
Serial.println("Tuer verriegelt");
delay(3000);
servoblau.write(90); // Servo zum Verriegeln auf 90 Grad stellen
digitalWrite(roteLED, HIGH); // rote LED einschalten
digitalWrite(grueneLED, LOW); // gruene LED ausschalten
z1 = 0; z2 = 1; z3 = 1; z4 = 1; // Erste Zeicheneingabe wieder freischalten
goto Anfang; // zurueckspringen, damit das "*" nicht als Code gewertet wird
}
if (Taste == '#')
{
// Pruefen, ob die eingegebenen Zeichen C1 bis C4 mit dem Passwort P1 bis P4 uebereinstimmen
if (C1 == P1 && C2 == P2 && C3 == P3 && C4 == P4)
{
Serial.println("Code korrekt, Schloss offen");
servoblau.write(0); // Servo zum Oeffnen auf 0 Grad stellen
digitalWrite(roteLED, LOW);
digitalWrite(grueneLED, HIGH);
z1 = 0; z2 = 1; z3 = 1; z4 = 1; // Eingabe fuer den naechsten Code freischalten
goto Anfang;
}
else
{
Serial.println("Code falsch, Schloss gesperrt");
digitalWrite(roteLED, HIGH);
digitalWrite(grueneLED, LOW);
delay(3000);
z1 = 0; z2 = 1; z3 = 1; z4 = 1;
goto Anfang;
}
}
// Ab hier werden die vier Code-Positionen unter C1 bis C4 gespeichert.
if (z1 == 0)
{
C1 = Taste;
Serial.print("Die Taste ");
Serial.print(C1);
Serial.println(" wurde gedrueckt");
z1 = 1; z2 = 0; z3 = 1; z4 = 1; // Zweite Position freischalten
goto Anfang;
}
if (z2 == 0)
{
C2 = Taste;
Serial.print("Die Taste ");
Serial.print(C2);
Serial.println(" wurde gedrueckt");
z1 = 1; z2 = 1; z3 = 0; z4 = 1; // Dritte Position freischalten
goto Anfang;
}
if (z3 == 0)
{
C3 = Taste;
Serial.print("Die Taste ");
Serial.print(C3);
Serial.println(" wurde gedrueckt");
z1 = 1; z2 = 1; z3 = 1; z4 = 0; // Vierte Position freischalten
goto Anfang;
}
if (z4 == 0)
{
C4 = Taste;
Serial.print("Die Taste ");
Serial.print(C4);
Serial.println(" wurde gedrueckt");
z1 = 1; z2 = 1; z3 = 1; z4 = 1; // Weitere Eingaben sperren, bis # oder * gedrueckt wird
}
}
}Anleitung bewerten