
Ziel des Projekts
Auf einem Tastenfeld soll ein zufällig erzeugter Pin eingegeben werden. Das Programm soll diesen Pin abfragen. Wurde der Pin nach Druck auf die Taste # richtig eingegeben, wird die Meldung „korrekter Pin“ angezeigt und der Servomotor öffnet die Schranke.
Benötigte Bauteile
- ⇒4-zeiliges LCD mit I²C-Schnittstelle
- ⇒Servomotor
- ⇒Tastenfeld 3×4
- Leitungsdrähte
Benötigte Bibliotheken


Der Schaltplan
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Das Programm
Bibliotheken und Variable
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#include "Adafruit_Keypad.h" #include "Servo.h" #include "LiquidCrystal_I2C.h" LiquidCrystal_I2C lcd(0x27, 20, 4); // Bezeichnung des Motors Servo Motor; // Größe des Tastenfeldes // 3 Spalten const byte SPALTEN = 3; // 4 Zeilen const byte REIHEN = 4; // die Ziffern/Zeichen: // Array 3 x 4 char Tasten[REIHEN][SPALTEN] = { { '#', '0', '*' }, { '9', '8', '7' }, { '6', '5', '4' }, { '3', '2', '1' } }; // die Pins für die 3 Spalten byte SpaltenPins[SPALTEN] = { 3, 4, 5 }; // die Pins für die 4 Zeilen byte ReihenPins[REIHEN] = { 6, 7, 8, 9 }; // TastenFeld ⇒ Name des Keypads // -> Zuordnung der Pins zu den REIHEN und SPALTEN des Arrays Adafruit_Keypad Tastenfeld = Adafruit_Keypad(makeKeymap(Tasten), ReihenPins, SpaltenPins, REIHEN, SPALTEN); String Vergleich; String Pin; // char-Array für die eingegebenen Zeichen char Zeichen[5]; // Position im Array Zeichen int Position = 0; // Position der angezeigten Spalte LCD int PositionSpalte = 0; // Pin des Servos int ServoPin = 12; |
Der setup-Teil
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
void setup() { // Pin dem Servo zuordnen Motor.attach(ServoPin); // Tastenfeld starten Tastenfeld.begin(); // LCD einschalten lcd.init(); lcd.backlight(); Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) { ; } delay(500); // nur beim Start anzeigen Serial.println("Bitte 4-stelligen Pin eingeben:"); Serial.println("Pin-Eingabe mit # abschlie\u00dfen"); Serial.println("Korrektur mit * "); // Zufallsgenerator starten randomSeed(analogRead(A0)); // neuen Pin erstellen neuerPin(); // Servo in Ausgangsposition fahren Motor.write(0); } |
Der loop-Teil
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
void loop() { // gedrückte Taste lesen Tastenfeld.tick(); while (Tastenfeld.available()) { keypadEvent Taste = Tastenfeld.read(); // wenn die Taste losgelassen wurde // Wert abgefragter Taste zu char umwandeln if (Taste.bit.EVENT == KEY_JUST_RELEASED) { lcd.setCursor(0, 0); lcd.print("Pin eingeben: "); // Zeilen LCD löschen ZeileLoeschen(1); ZeileLoeschen(3); Motor.write(0); // eingegebenes Zeichen an der aktuellen Position speichern Zeichen[Position] = (char)Taste.bit.KEY; // Zeichen anzeigen Serial.print(Zeichen[Position]); lcd.setCursor(PositionSpalte, 2); lcd.print(Zeichen[Position]); // nächstes Zeichen -> Position erhöhen // Position Spalte LCD erhöhen Position++; PositionSpalte++; // Korrektur ASCII-Wert 42 = * if (Taste.bit.KEY == 42) { // char-Array Zeichen leeren for (int i = 0; i < sizeof(Zeichen); i++) { Zeichen[i] = NULL; } // Variablen zurücksetzen, Zeilen LCD löschen Position = 0; PositionSpalte = 0; ZeileLoeschen(0); ZeileLoeschen(2); Serial.println("\tKorrektur: "); lcd.setCursor(0, 0); lcd.print("Korrektur: "); } // Zeichen ASCII-Wert 35 = # if (Taste.bit.KEY == 35) { // char-Array in String umwandeln Vergleich = String(Zeichen); // letzte Zeichen des Strings sind 0 und # -> müssen entfernt werden Vergleich = Vergleich.substring(0, Vergleich.length() - 2); Serial.println(); Serial.print(Vergleich); // Zeilen LCD löschen ZeileLoeschen(0); ZeileLoeschen(2); lcd.setCursor(0, 0); lcd.print("Pin: " + Vergleich + " "); // Eingabe mit Pin vergleichen if (Vergleich == Pin) { Serial.println("\korrekter Pin - Schranke \u00f6ffnen!"); lcd.setCursor(0, 1); lcd.print("-> korrekter Pin!"); delay(2000); lcd.setCursor(0, 1); lcd.print("Schranke \357ffnen!"); Motor.write(90); } else { Serial.println("\tFalscher Pin - kein Zugriff"); lcd.setCursor(0, 1); lcd.print("-> falscher Pin!"); } // Variable zurücksetzen Position = 0; PositionSpalte = 0; // neuen Pin erstellen neuerPin(); } } } } |
Funktionen
Die Funktion neuerPin() erzeugt einen neuen, zufälligen Pin und zeigt ihn an..
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
String neuerPin() { // zufälligen PIN bestimmen Pin = ""; Serial.println("---------------------------------------"); for (int i = 0; i < sizeof(Zeichen) - 1; i++) { int Zahl = random(0, 10); Pin = Pin + String(Zahl); } // Pin anzeigen Serial.println("neuer Pin: " + Pin); lcd.setCursor(0, 3); lcd.print("neuer Pin: " + Pin); return Pin; } |
Die Funktion ZeileLoeschen() löscht einzelne Zeilen auf dem LCD.
|
1 2 3 4 5 6 7 8 9 |
void ZeileLoeschen(int Zeile) { for (int i = 0; i < 20; i++) { lcd.setCursor(i, Zeile); lcd.print(" "); } } |
Ähnliche Projekte
- Glücksrad mit 360°-Servomotor
- Glücksrad mit Schrittmotor
- Glücksrad mit Servomotor
- Servomotor mit einem Potentiometer steuern
- Türöffner mit einem RFID-Modul und Servomotor
Letzte Aktualisierung:

