So jetzt mit den Code Tags
Jetzt auch die Aktuelle version
#include <Keypad.h>
#include <Servo.h>
// Pinlänge und Pincode festlegen
const byte PINLENGTH = 4;
char pinCode[PINLENGTH+1] = {'0','8','1','5'};
// Zwischenspeicher für Eingaben
char keyBuffer[PINLENGTH+1] = {'-','-','-','-'};
// Kompakter kann man das auch so schreiben:
// char pin[] = "0815";
// char keyBuffer[] = "----";
// Definition für das Keypad von Elegoo
const byte ROWS = 4; // vier Zeilen
const byte COLS = 4; // vier Spalten
// Symbole auf den Tasten
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
// Variablen Definieren und PINS zuweisen
const int greenPin = 12;
const int redPin = 13;
const int bluePin = 11;
const int servoPin = 10;
const int angleClosed = 160;
const int angleOpen = 10;
const int openDelay = 3000;
int openSensor;
int progMode;
int l = 0;
int d = 0;
// Servo-Objekt erzeugen
Servo myservo;
// Instanz von Keypad erzeugen, Keymap und Pins übergeben
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
// LED Pins setzen
pinMode(greenPin, OUTPUT);
pinMode(redPin, OUTPUT);
digitalWrite(greenPin, LOW);
digitalWrite(redPin, LOW);
digitalWrite(bluePin, LOW);
// Servo auf Ausgangsposition
myservo.attach(servoPin);
myservo.write(angleClosed);
progMode = 0;
}
void loop(){
if (l==0){Serial.print (" LOOP ");}
l = 1;
// Gedrückte Taste abfragen
char customKey = customKeypad.getKey();
Serial.print (customKey);
if (customKey) {
// Check, ob ASCII Wert des Char einer Ziffer zwischen 0 und 9 entspricht
if ((int(customKey) >= 48) && (int(customKey) <= 57)){
addToKeyBuffer(customKey);
}
// oder Code überprüfen, falls Raute gedrückt wurde nur wenn Tür geschlossen
else if ((customKey == '#') and (d == 0) and (progMode == 0)) {
checkKey();
}
// Schliesen wenn "C" betätigt
else if ((customKey == 'C') and (d == 1)and (progMode == 0)){
Dclose();
}
// Progamierebene betreten wenn "A" betätigt
else if ((customKey == 'A') and (d == 1)and (progMode == 0)){
Prog();
}
// Progamierebene verlassen Code Speichern wenn "B" betätigt
else if ((customKey == 'B') and (d ==1)and (progMode ==1)){
Change();
}
}
}
void addToKeyBuffer(char inkey) {
Serial.print(inkey);
Serial.print(" > ");
// Von links nach rechts Zeichen um eins weiterkopieren = ältestes Zeichen vergessen
for (int i=1; i<PINLENGTH; i++) {
keyBuffer[i-1] = keyBuffer[i];
}
// in ganz rechter Stelle die letzte Ziffer speichern
keyBuffer[PINLENGTH-1] = inkey;
Serial.println(keyBuffer);
l = 0;
}
void checkKey() {
// Eingabe mit festgelegtem Pincode vergleichen
if (strcmp(keyBuffer, pinCode) == 0) {
Serial.println("CORRECT");
// Aktion für richtigen Pin ausführen
pinCorrect();
}
else {
Serial.println("WRONG!");
// Aktion für falschen Pin ausführen
pinWrong();
}
// Nach Überprüfung Eingabe leeren
for (int i=0; i < PINLENGTH; i++) {
keyBuffer[i] = '-';
}
l = 0;
}
// Aktion für korrekten Pincode
void pinCorrect() {
myservo.write(angleOpen);
digitalWrite(greenPin, HIGH);
delay(1000);
digitalWrite (greenPin, LOW);
d = 1;
l = 0;
}
// Aktion Tür schliessen
void Dclose() {
//Serial.print (customKey);
Serial.println ("schliessen");
myservo.write(angleClosed);
digitalWrite(greenPin, LOW);
delay(50);
d = 0;
l = 0;
}
// Aktion für falschen Pincode
void pinWrong() {
for (int i=0; i<3; i++) {
digitalWrite(redPin, HIGH);
delay(50);
digitalWrite(redPin, LOW);
delay(50);
}
l = 0;
}
// Aktion Programmieren
void Prog(){
digitalWrite (bluePin, HIGH);
progMode = 1;
l = 0;
}
// Aktion neuenPin Speichern
void Change(){
strcpy (pinCode,keyBuffer);
digitalWrite (bluePin, LOW);
progMode = 0;
l = 0;
}