Zahlenschloss mit Tastenfeld und Arduino

FunduinoZuletzt aktualisiert am

Mit einem vierstelligen Code einen Servo als Riegel steuern

Ein Tastenfeld und ein Servomotor genügen, um aus einem Arduino ein Zahlenschloss zu machen: Code eingeben, grüne LED leuchtet, der Riegel fährt auf. Falscher Code – rote LED, alles bleibt zu.

Interessant ist dabei weniger die Mechanik als die Programmlogik: Wie merkt sich ein Sketch, an welcher Stelle der Eingabe er gerade ist? In dieser Anleitung baust du die Schaltung auf und gehst diese Logik Schritt für Schritt durch.

Schaltskizze mit Arduino, 4x4-Tastenfeld, Servomotor und zwei LEDs
Aufbau: Tastenfeld an den Pins 2 bis 9, Servo an Pin 11, LEDs an 12 und 13

Material

Für dieses Projekt brauchst du:

  • 1× Mikrocontroller mit passendem USB-Kabel
  • 1× Steckbrett
  • 1× Tastenfeld 4×4
  • 1× Servomotor
  • 1× rote und 1× grüne LED
  • 2× Vorwiderstand 220 Ohm
  • Steckkabel männlich/männlich

Die Aufgabe

Gibst du auf dem Tastenfeld den richtigen vierstelligen Code ein, leuchtet eine grüne LED auf und der Servo fährt in die Position „offen“. Ist der Code falsch oder wird das Schloss verriegelt, leuchtet die rote LED und der Servo fährt zurück.

Am Servoarm lässt sich ein kleiner Riegel befestigen – daraus wird dann ein Tresor oder eine verschlossene Schublade. Die Anleitung ist als Anregung gedacht; wie das Schloss am Ende mechanisch aussieht, bleibt dir überlassen.

Aufbau

Das Tastenfeld belegt die Pins 2 bis 9, der Servo hängt an Pin 11, die grüne LED an Pin 12 und die rote an Pin 13 – beide LEDs mit je einem 220-Ohm-Vorwiderstand.

An den Außenseiten des schwarzen Kontaktsteckers am Tastenfeld stehen die Zahlen 1 und 8. Kontakt 1 kommt an Pin 2 des Arduino, und von dort geht es aufsteigend weiter, bis Kontakt 8 an Pin 9 liegt.

Werden beim Testen die falschen Zeichen angezeigt – etwa eine 3 statt einer 1 –, dann sind Zeilen und Spalten vertauscht. Tausche in diesem Fall im Sketch die beiden Zeilen mit rowPins und colPins gegeneinander aus. An der Verkabelung musst du dann nichts ändern.

Schaltskizze mit Arduino, 4x4-Tastenfeld, Servomotor und zwei LEDs
Aufbau: Tastenfeld an den Pins 2 bis 9, Servo an Pin 11, LEDs an 12 und 13

Bibliotheken installieren

Für das Tastenfeld brauchst du eine Bibliothek, die in der Arduino-Software nicht vorinstalliert ist. Öffne den Bibliotheksverwalter über Sketch → Bibliothek einbinden → Bibliotheken verwalten und suche nach Keypad. Wir verwenden die Bibliothek von Mark Stanley und Alexander Brevig.

Die Servo-Bibliothek ist dagegen bereits in der Arduino-Software enthalten und muss nicht nachinstalliert werden.

So funktioniert der Sketch

Das Passwort steht ganz oben im Sketch in den Variablen P1 bis P4 – in der Vorlage lautet es 123A. Die vier Zeichen, die du eingibst, landen in C1 bis C4.

Damit jede Ziffer an der richtigen Stelle ankommt, gibt es die Hilfsvariablen z1 bis z4. Immer genau eine davon steht auf 0 und markiert damit, welche Position gerade auf eine Eingabe wartet. Nach jedem Tastendruck rückt diese Markierung eine Stelle weiter.

Zwei Tasten haben Sonderfunktionen:

  • Die Raute # schließt die Eingabe ab und prüft den Code.
  • Der Stern * verriegelt das Schloss wieder und setzt die Eingabe zurück.

Beide springen danach mit goto an den Anfang der Schleife zurück, damit ihr eigenes Zeichen nicht versehentlich als Teil des Codes gespeichert wird.

Der Programmcode

Lade den Sketch hoch und öffne den Seriellen Monitor mit 9600 Baud. Dort siehst du jede gedrückte Taste und erfährst nach der Raute, ob der Code richtig war.

Mit etwas Übung lässt sich der Sketch so erweitern, dass sich – wie bei einem Hotelsafe – ein eigener Code hinterlegen lässt.

Das Passwort steht im Klartext im Sketch und wird über den Seriellen Monitor Zeichen für Zeichen mitgeschrieben. Als Lernprojekt ist das genau richtig – ein echtes Wertfach solltest du damit nicht sichern.

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

Kommentare

Frage stellen oder Erfahrung teilen

Schreib uns, wenn etwas nicht funktioniert. Nenne dabei dein Board und die Fehlermeldung.

Wir prüfen jeden Kommentar vor der Veröffentlichung. Deine E-Mail-Adresse bleibt bei uns.