Projekte und Tutorials für Arduino › Foren › StartHardware-Forum › RFID & Tastenfeld Schloss
- Dieses Thema hat 19 Antworten und 2 Teilnehmer, und wurde zuletzt aktualisiert vor 3 Jahren, 6 Monaten von Andreas7254.
-
AutorBeiträge
-
Andreas7254Teilnehmer
Hallo zusammen,
ich bin schon seit Monaten dabei ein Sicherheitssystem zu bauen. Es soll ungefähr so funktionieren wie beim Bezahlen mit der Karte. Ich habe im Internet ein, mit RFID gesichertes, Schloss und ein, mit Tastenfeld gesichertes, Schloss gefunden. Ich habe beide zusammengefügt und habe einpaar Ausbesserungen gemacht, aber leider widerholt es sich nicht. Also wenn ich das Schloss einmal geöffnet hatte und der sich wieder schließt kann ich ihn nicht wieder öffnen, weil er das Password nicht zum zweitenmal akzeptiert.Ein zweites Problem: Ich habe versucht den Sketch so umzuschreiben, dass das Schloss sich erst wieder schließt wenn man mit der richtigen Karte und dem richtigen Passwort schließt. Ich hoffe es ist verständlich genug und jemand könnte mir helfen.
Mein Sketch:
#include <Password.h>
#include <Keypad.h>
#include <SPI.h> // Import SPI-Bibiothek
#include <MFRC522.h> // Import RFID-Bibiothek
#include <Servo.h> // Import Servo Bibliothekconst int SDAPIN = 53; // Uno => Pin 10
const int RSTPIN = 9; // Uno => Pin 9
const int REDLED = 13; // Uno -> Pin 8
const int GREENLED = 12; // Uno -> Pin 7
const int SERVOPIN = 11; // Uno -> Pin 6const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{‘1’, ‘2’, ‘3’, ‘A’},
{‘4’, ‘5’, ‘6’, ‘B’},
{‘7’, ‘8’, ‘9’, ‘C’},
{‘*’, ‘0’, ‘#’, ‘D’}
};
byte sesam[] = {0x8B, 0x88, 0xCA, 0x1D};
byte rowPins[ROWS] = {48, 47, 46, 45}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {44, 43, 42, 41}; //connect to the column pinouts of the keypadKeypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
MFRC522 rfidReader(SDAPIN, RSTPIN); // RFID-Empfänger
Servo door; // Türverschluss (Servo)
Password password = Password( “123A” );void setup()
{
Serial.begin(9600); // Serielle Verbindung
SPI.begin(); // SPI-Verbindung aufbauen
Serial.write(254);
Serial.write(0x01);
delay(200);door.attach(SERVOPIN);
pinMode(REDLED, OUTPUT);
pinMode(GREENLED, OUTPUT);
pinMode(SERVOPIN, OUTPUT);
keypad.addEventListener(keypadEvent); //add an event listener for this keypadrfidReader.PCD_Init(); // Initial. RFID-Leser
Serial.println(“Türkontrolle aktiviert”);
}bool acceptedRFID(byte uid[4]) {
return
(rfidReader.uid.uidByte[0] == sesam[0]) &&
(rfidReader.uid.uidByte[1] == sesam[1]) &&
(rfidReader.uid.uidByte[2] == sesam[2]) &&
(rfidReader.uid.uidByte[3] == sesam[3]);
}void openDoor() {
for (int pos = 90; pos <= 180; pos++) {
door.write(pos);
delay(10);
}
}void closeDoor(){
for (int pos = 180; pos >= 90; pos–) {
door.write(pos);
delay(10);
}
while(1) loop();
}
void signalDoorLocked() {
digitalWrite(REDLED, HIGH);
digitalWrite(GREENLED, LOW);
}void signalAccessGranted() {
digitalWrite(REDLED, LOW);
digitalWrite(GREENLED, HIGH);
}void signalAccessRefused() {
for (int i = 0; i < 5; i++) {
digitalWrite(REDLED, HIGH);
delay(250);
digitalWrite(REDLED, LOW);
delay(250);
}
}
void keypadEvent(){
keypad.getKey();
signalDoorLocked();
}
//take care of some special events
void keypadEvent(KeypadEvent eKey){
switch (keypad.getState()){
case PRESSED:Serial.print(“Eingegeben:”);
Serial.println(eKey);
delay(10);Serial.write(254);
switch (eKey){
case ‘*’: checkPassword(); delay(1); break;case ‘#’: password.reset(); delay(1); break;
default: password.append(eKey); delay(1);
}
}
}
void checkPassword(){if (password.evaluate()){ //if password is right open
signalAccessGranted();
Serial.println(“Zugriff erlaubt”);
Serial.write(254);delay(10);
//Add code to run if it works
openDoor(); //deg
delay(3000);
Serial.println(“Tür schliessen”);
// Tuere wieder schliessen
closeDoor();}else{
Serial.println(“Zugriff verweigert”); //if passwords wrong keep locked
Serial.write(254);delay(10);
//add code to run if it did not work
signalAccessRefused();}
}
void loop()
{
char key = keypad.getKey();
signalDoorLocked();// Karte erkannt und gelesen
if (rfidReader.PICC_IsNewCardPresent() && rfidReader.PICC_ReadCardSerial()) {Serial.print(“Erkanntes RFID-TAG ist => “);
// Bytes der ID lesen und ausgeben
Serial.print(“/”);
for (byte i = 0; i < rfidReader.uid.size; i++) {
Serial.print(rfidReader.uid.uidByte[i], HEX);
Serial.print(“/”);
}Serial.println();
// Check ob Karte mit Variable sesam übereinstimmt
if (acceptedRFID(rfidReader.uid.uidByte)) { // ja =>
// Erlaubten Zugriff signalisieren
signalAccessGranted();
Serial.println(“Zugriff erlaubt => Tür öffnen”);
// Oeffnen der Tuere
Serial.println(“Password eingeben”);
// 3 Sekunden Pause
keypadEvent();
}
else // nein =>
{
Serial.println(“Zugriff verweigert”);
// Rote LED blinkt als Warnung
signalAccessRefused();
}
}
}Vielen Dank im Voraus
Mit viel Hoffnung auf Hilfe
Andreas EirichFranz-PeterTeilnehmerHallo Andreas,
deine Code habe ich jetzt noch nicht im Detail gelesen ( ist auch aufgrund der fehlenden Formatierung nicht einfach ). Was mir beim Überfliegen aber gleich aufgefallen ist:void closeDoor(){ for (int pos = 180; pos >= 90; pos–) { door.write(pos); delay(10); } while(1) loop(); << das geht auf keinen Fall!!! }
Du darfst niemals nicht selbst loop aufrufen. Das macht das Arduino-System. Wenn Du das selbst so machst führt das mit gnadenloser Sicherheit über kurz oder lang zum Absturz des Systems. Wie sich das dann auswirkt kann man nicht vorhersagen. Das kann ein Neustart sein, der Prozessor kann sich aber auch in den Tiefen des Maschinencodes verirren und irgendwo im Kreis laufen.
P.S. und setze deinen Code bitte in Codetags. Sonst ist er kaum zu lesen.
Andreas7254TeilnehmerOh, entschuldigung der sollte nicht drinnen sein, dass hatte ich nur zwischendurch ausprobiert. :)
Der sollte so sein:#include <Password.h>
#include <Keypad.h>
#include <SPI.h> // Import SPI-Bibiothek
#include <MFRC522.h> // Import RFID-Bibiothek
#include <Servo.h> // Import Servo Bibliothekconst int SDAPIN = 53; // Uno => Pin 10
const int RSTPIN = 9; // Uno => Pin 9
const int REDLED = 13; // Uno -> Pin 8
const int GREENLED = 12; // Uno -> Pin 7
const int SERVOPIN = 11; // Uno -> Pin 6const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{‘1’, ‘2’, ‘3’, ‘A’},
{‘4’, ‘5’, ‘6’, ‘B’},
{‘7’, ‘8’, ‘9’, ‘C’},
{‘*’, ‘0’, ‘#’, ‘D’}
};
byte sesam[] = {0x8B, 0x88, 0xCA, 0x1D};
byte rowPins[ROWS] = {48, 47, 46, 45}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {44, 43, 42, 41}; //connect to the column pinouts of the keypadKeypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
MFRC522 rfidReader(SDAPIN, RSTPIN); // RFID-Empfänger
Servo door; // Türverschluss (Servo)
Password password = Password( “123A” );void setup()
{
Serial.begin(9600); // Serielle Verbindung
SPI.begin(); // SPI-Verbindung aufbauen
Serial.write(254);
Serial.write(0x01);
delay(200);door.attach(SERVOPIN);
pinMode(REDLED, OUTPUT);
pinMode(GREENLED, OUTPUT);
pinMode(SERVOPIN, OUTPUT);
keypad.addEventListener(keypadEvent); //add an event listener for this keypadrfidReader.PCD_Init(); // Initial. RFID-Leser
Serial.println(“Türkontrolle aktiviert”);
}bool acceptedRFID(byte uid[4]) {
return
(rfidReader.uid.uidByte[0] == sesam[0]) &&
(rfidReader.uid.uidByte[1] == sesam[1]) &&
(rfidReader.uid.uidByte[2] == sesam[2]) &&
(rfidReader.uid.uidByte[3] == sesam[3]);
}void openDoor() {
for (int pos = 90; pos <= 180; pos++) {
door.write(pos);
delay(10);
}
}void closeDoor(){
for (int pos = 180; pos >= 90; pos–) {
door.write(pos);
delay(10);
}
}
void signalDoorLocked() {
digitalWrite(REDLED, HIGH);
digitalWrite(GREENLED, LOW);
}void signalAccessGranted() {
digitalWrite(REDLED, LOW);
digitalWrite(GREENLED, HIGH);
}void signalAccessRefused() {
for (int i = 0; i < 5; i++) {
digitalWrite(REDLED, HIGH);
delay(250);
digitalWrite(REDLED, LOW);
delay(250);
}
}
void keypadEvent(){
keypad.getKey();
signalDoorLocked();
}
//take care of some special events
void keypadEvent(KeypadEvent eKey){
switch (keypad.getState()){
case PRESSED:Serial.print(“Eingegeben:”);
Serial.println(eKey);
delay(10);Serial.write(254);
switch (eKey){
case ‘*’: checkPassword(); delay(1); break;case ‘#’: password.reset(); delay(1); break;
default: password.append(eKey); delay(1);
}
}
}
void checkPassword(){if (password.evaluate()){ //if password is right open
signalAccessGranted();
Serial.println(“Zugriff erlaubt”);
Serial.write(254);delay(10);
//Add code to run if it works
openDoor(); //deg
delay(3000);
Serial.println(“Tür schliessen”);
// Tuere wieder schliessen
closeDoor();}else{
Serial.println(“Zugriff verweigert”); //if passwords wrong keep locked
Serial.write(254);delay(10);
//add code to run if it did not work
signalAccessRefused();}
}
void loop()
{
char key = keypad.getKey();
signalDoorLocked();// Karte erkannt und gelesen
if (rfidReader.PICC_IsNewCardPresent() && rfidReader.PICC_ReadCardSerial()) {Serial.print(“Erkanntes RFID-TAG ist => “);
// Bytes der ID lesen und ausgeben
Serial.print(“/”);
for (byte i = 0; i < rfidReader.uid.size; i++) {
Serial.print(rfidReader.uid.uidByte[i], HEX);
Serial.print(“/”);
}Serial.println();
// Check ob Karte mit Variable sesam übereinstimmt
if (acceptedRFID(rfidReader.uid.uidByte)) { // ja =>
// Erlaubten Zugriff signalisieren
signalAccessGranted();
Serial.println(“Zugriff erlaubt => Tür öffnen”);
// Oeffnen der Tuere
Serial.println(“Password eingeben”);
// 3 Sekunden Pause
keypadEvent();
}
else // nein =>
{
Serial.println(“Zugriff verweigert”);
// Rote LED blinkt als Warnung
signalAccessRefused();
}
}
}Andreas7254Teilnehmer#include <Password.h> #include <Keypad.h> #include <SPI.h> // Import SPI-Bibiothek #include <MFRC522.h> // Import RFID-Bibiothek #include <Servo.h> // Import Servo Bibliothek const int SDAPIN = 53; // Uno => Pin 10 const int RSTPIN = 9; // Uno => Pin 9 const int REDLED = 13; // Uno -> Pin 8 const int GREENLED = 12; // Uno -> Pin 7 const int SERVOPIN = 11; // Uno -> Pin 6 const byte ROWS = 4; const byte COLS = 4; char keys[ROWS][COLS] = { {‘1’, ‘2’, ‘3’, ‘A’}, {‘4’, ‘5’, ‘6’, ‘B’}, {‘7’, ‘8’, ‘9’, ‘C’}, {‘*’, ‘0’, ‘#’, ‘D’} }; byte sesam[] = {0x8B, 0x88, 0xCA, 0x1D}; byte rowPins[ROWS] = {48, 47, 46, 45}; //connect to the row pinouts of the keypad byte colPins[COLS] = {44, 43, 42, 41}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); MFRC522 rfidReader(SDAPIN, RSTPIN); // RFID-Empfänger Servo door; // Türverschluss (Servo) Password password = Password( “123A” ); void setup() { Serial.begin(9600); // Serielle Verbindung SPI.begin(); // SPI-Verbindung aufbauen Serial.write(254); Serial.write(0x01); delay(200); door.attach(SERVOPIN); pinMode(REDLED, OUTPUT); pinMode(GREENLED, OUTPUT); pinMode(SERVOPIN, OUTPUT); keypad.addEventListener(keypadEvent); //add an event listener for this keypad rfidReader.PCD_Init(); // Initial. RFID-Leser Serial.println(“Türkontrolle aktiviert”); } bool acceptedRFID(byte uid[4]) { return (rfidReader.uid.uidByte[0] == sesam[0]) && (rfidReader.uid.uidByte[1] == sesam[1]) && (rfidReader.uid.uidByte[2] == sesam[2]) && (rfidReader.uid.uidByte[3] == sesam[3]); } void openDoor() { for (int pos = 90; pos <= 180; pos++) { door.write(pos); delay(10); } } void closeDoor(){ for (int pos = 180; pos >= 90; pos–) { door.write(pos); delay(10); } } void signalDoorLocked() { digitalWrite(REDLED, HIGH); digitalWrite(GREENLED, LOW); } void signalAccessGranted() { digitalWrite(REDLED, LOW); digitalWrite(GREENLED, HIGH); } void signalAccessRefused() { for (int i = 0; i < 5; i++) { digitalWrite(REDLED, HIGH); delay(250); digitalWrite(REDLED, LOW); delay(250); } } void keypadEvent(){ keypad.getKey(); signalDoorLocked(); } //take care of some special events void keypadEvent(KeypadEvent eKey){ switch (keypad.getState()){ case PRESSED: Serial.print(“Eingegeben:”); Serial.println(eKey); delay(10); Serial.write(254); switch (eKey){ case ‘*’: checkPassword(); delay(1); break; case ‘#’: password.reset(); delay(1); break; default: password.append(eKey); delay(1); } } } void checkPassword(){ if (password.evaluate()){ //if password is right open signalAccessGranted(); Serial.println(“Zugriff erlaubt”); Serial.write(254);delay(10); //Add code to run if it works openDoor(); //deg delay(3000); Serial.println(“Tür schliessen”); // Tuere wieder schliessen closeDoor(); }else{ Serial.println(“Zugriff verweigert”); //if passwords wrong keep locked Serial.write(254);delay(10); //add code to run if it did not work signalAccessRefused(); } } void loop() { char key = keypad.getKey(); signalDoorLocked(); // Karte erkannt und gelesen if (rfidReader.PICC_IsNewCardPresent() && rfidReader.PICC_ReadCardSerial()) { Serial.print(“Erkanntes RFID-TAG ist => “); // Bytes der ID lesen und ausgeben Serial.print(“/”); for (byte i = 0; i < rfidReader.uid.size; i++) { Serial.print(rfidReader.uid.uidByte[i], HEX); Serial.print(“/”); } Serial.println(); // Check ob Karte mit Variable sesam übereinstimmt if (acceptedRFID(rfidReader.uid.uidByte)) { // ja => // Erlaubten Zugriff signalisieren signalAccessGranted(); Serial.println(“Zugriff erlaubt => Tür öffnen”); // Oeffnen der Tuere Serial.println(“Password eingeben”); // 3 Sekunden Pause keypadEvent(); } else // nein => { Serial.println(“Zugriff verweigert”); // Rote LED blinkt als Warnung signalAccessRefused(); } } }
Andreas7254TeilnehmerBesser so?
Franz-PeterTeilnehmerNa ja – noch nicht wirklich. Dein Code enthält jetzt Zeichen, die der Compiler nicht versteht. Wahrscheinlich hast Du ihn nicht direkt in Codetags gesetzt, sondern erst nachträglich, und da hat die Forumssoftware schon zugeschlagen und einiges verändert. Ausserdem soltest Du den Code ordentlich formatieren ( kannst Du direkt in der IDE machen mit ctrl+T ).
So ist das Ganze jedenfalls sehr unübersichtlich und schwer nachzuvollziehen.Und zeige auch mal Links zu deinen verwendeten Bibliotheken. Die sind nicht alle so üblich – speziell die Password.h ( Die anderen kenne ich eigentlich ).
Andreas7254TeilnehmerCode:
[code] #include <Password.h> #include <Keypad.h> #include <SPI.h> // Import SPI-Bibiothek #include <MFRC522.h> // Import RFID-Bibiothek #include <Servo.h> // Import Servo Bibliothek const int SDAPIN = 53; // Uno => Pin 10 const int RSTPIN = 9; // Uno => Pin 9 const int REDLED = 13; // Uno -> Pin 8 const int GREENLED = 12; // Uno -> Pin 7 const int SERVOPIN = 11; // Uno -> Pin 6 const byte ROWS = 4; const byte COLS = 4; char keys[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; byte sesam[] = {0x8B, 0x88, 0xCA, 0x1D}; byte rowPins[ROWS] = {48, 47, 46, 45}; //connect to the row pinouts of the keypad byte colPins[COLS] = {44, 43, 42, 41}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); MFRC522 rfidReader(SDAPIN, RSTPIN); // RFID-Empfänger Servo door; // Türverschluss (Servo) Password password = Password( "123A" ); void setup() { Serial.begin(9600); // Serielle Verbindung SPI.begin(); // SPI-Verbindung aufbauen Serial.write(254); Serial.write(0x01); delay(200); door.attach(SERVOPIN); pinMode(REDLED, OUTPUT); pinMode(GREENLED, OUTPUT); pinMode(SERVOPIN, OUTPUT); keypad.addEventListener(keypadEvent); //add an event listener for this keypad rfidReader.PCD_Init(); // Initial. RFID-Leser Serial.println("Türkontrolle aktiviert"); } bool acceptedRFID(byte uid[4]) { return (rfidReader.uid.uidByte[0] == sesam[0]) && (rfidReader.uid.uidByte[1] == sesam[1]) && (rfidReader.uid.uidByte[2] == sesam[2]) && (rfidReader.uid.uidByte[3] == sesam[3]); } void openDoor() { for (int pos = 90; pos <= 180; pos++) { door.write(pos); delay(10); } } void closeDoor() { for (int pos = 180; pos >= 90; pos--) { door.write(pos); delay(10); } while (1) loop(); } void signalDoorLocked() { digitalWrite(REDLED, HIGH); digitalWrite(GREENLED, LOW); } void signalAccessGranted() { digitalWrite(REDLED, LOW); digitalWrite(GREENLED, HIGH); } void signalAccessRefused() { for (int i = 0; i < 5; i++) { digitalWrite(REDLED, HIGH); delay(250); digitalWrite(REDLED, LOW); delay(250); } } void keypadEvent() { keypad.getKey(); signalDoorLocked(); } //take care of some special events void keypadEvent(KeypadEvent eKey) { switch (keypad.getState()) { case PRESSED: Serial.print("Eingegeben:"); Serial.println(eKey); delay(10); Serial.write(254); switch (eKey) { case '*': checkPassword(); delay(1); break; case '#': password.reset(); delay(1); break; default: password.append(eKey); delay(1); } } } void checkPassword() { if (password.evaluate()) { //if password is right open signalAccessGranted(); Serial.println("Zugriff erlaubt"); Serial.write(254); delay(10); //Add code to run if it works openDoor(); //deg delay(3000); Serial.println("Tür schliessen"); // Tuere wieder schliessen closeDoor(); } else { Serial.println("Zugriff verweigert"); //if passwords wrong keep locked Serial.write(254); delay(10); //add code to run if it did not work signalAccessRefused(); } } void loop() { char key = keypad.getKey(); signalDoorLocked(); // Karte erkannt und gelesen if (rfidReader.PICC_IsNewCardPresent() && rfidReader.PICC_ReadCardSerial()) { Serial.print("Erkanntes RFID-TAG ist => "); // Bytes der ID lesen und ausgeben Serial.print("/"); for (byte i = 0; i < rfidReader.uid.size; i++) { Serial.print(rfidReader.uid.uidByte[i], HEX); Serial.print("/"); } Serial.println(); // Check ob Karte mit Variable sesam übereinstimmt if (acceptedRFID(rfidReader.uid.uidByte)) { // ja => // Erlaubten Zugriff signalisieren signalAccessGranted(); Serial.println("Zugriff erlaubt => Tür öffnen"); // Oeffnen der Tuere Serial.println("Password eingeben"); // 3 Sekunden Pause keypadEvent(); } else // nein => { Serial.println("Zugriff verweigert"); // Rote LED blinkt als Warnung signalAccessRefused(); } } } [/code]
Bibliothek:
https://github.com/phrac/arduino/blob/master/tutorials/Password.hAndreas7254TeilnehmerTut mir leid, ich bin neu im Forum ich weiß nicht wie das geht, meintest du so?
Code:
[code] #include <Password.h> #include <Keypad.h> #include <SPI.h> // Import SPI-Bibiothek #include <MFRC522.h> // Import RFID-Bibiothek #include <Servo.h> // Import Servo Bibliothek const int SDAPIN = 53; // Uno => Pin 10 const int RSTPIN = 9; // Uno => Pin 9 const int REDLED = 13; // Uno -> Pin 8 const int GREENLED = 12; // Uno -> Pin 7 const int SERVOPIN = 11; // Uno -> Pin 6 const byte ROWS = 4; const byte COLS = 4; char keys[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; byte sesam[] = {0x8B, 0x88, 0xCA, 0x1D}; byte rowPins[ROWS] = {48, 47, 46, 45}; //connect to the row pinouts of the keypad byte colPins[COLS] = {44, 43, 42, 41}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); MFRC522 rfidReader(SDAPIN, RSTPIN); // RFID-Empfänger Servo door; // Türverschluss (Servo) Password password = Password( "123A" ); void setup() { Serial.begin(9600); // Serielle Verbindung SPI.begin(); // SPI-Verbindung aufbauen Serial.write(254); Serial.write(0x01); delay(200); door.attach(SERVOPIN); pinMode(REDLED, OUTPUT); pinMode(GREENLED, OUTPUT); pinMode(SERVOPIN, OUTPUT); keypad.addEventListener(keypadEvent); //add an event listener for this keypad rfidReader.PCD_Init(); // Initial. RFID-Leser Serial.println("Türkontrolle aktiviert"); } bool acceptedRFID(byte uid[4]) { return (rfidReader.uid.uidByte[0] == sesam[0]) && (rfidReader.uid.uidByte[1] == sesam[1]) && (rfidReader.uid.uidByte[2] == sesam[2]) && (rfidReader.uid.uidByte[3] == sesam[3]); } void openDoor() { for (int pos = 90; pos <= 180; pos++) { door.write(pos); delay(10); } } void closeDoor() { for (int pos = 180; pos >= 90; pos--) { door.write(pos); delay(10); } while (1) loop(); } void signalDoorLocked() { digitalWrite(REDLED, HIGH); digitalWrite(GREENLED, LOW); } void signalAccessGranted() { digitalWrite(REDLED, LOW); digitalWrite(GREENLED, HIGH); } void signalAccessRefused() { for (int i = 0; i < 5; i++) { digitalWrite(REDLED, HIGH); delay(250); digitalWrite(REDLED, LOW); delay(250); } } void keypadEvent() { keypad.getKey(); signalDoorLocked(); } //take care of some special events void keypadEvent(KeypadEvent eKey) { switch (keypad.getState()) { case PRESSED: Serial.print("Eingegeben:"); Serial.println(eKey); delay(10); Serial.write(254); switch (eKey) { case '*': checkPassword(); delay(1); break; case '#': password.reset(); delay(1); break; default: password.append(eKey); delay(1); } } } void checkPassword() { if (password.evaluate()) { //if password is right open signalAccessGranted(); Serial.println("Zugriff erlaubt"); Serial.write(254); delay(10); //Add code to run if it works openDoor(); //deg delay(3000); Serial.println("Tür schliessen"); // Tuere wieder schliessen closeDoor(); } else { Serial.println("Zugriff verweigert"); //if passwords wrong keep locked Serial.write(254); delay(10); //add code to run if it did not work signalAccessRefused(); } } void loop() { char key = keypad.getKey(); signalDoorLocked(); // Karte erkannt und gelesen if (rfidReader.PICC_IsNewCardPresent() && rfidReader.PICC_ReadCardSerial()) { Serial.print("Erkanntes RFID-TAG ist => "); // Bytes der ID lesen und ausgeben Serial.print("/"); for (byte i = 0; i < rfidReader.uid.size; i++) { Serial.print(rfidReader.uid.uidByte[i], HEX); Serial.print("/"); } Serial.println(); // Check ob Karte mit Variable sesam übereinstimmt if (acceptedRFID(rfidReader.uid.uidByte)) { // ja => // Erlaubten Zugriff signalisieren signalAccessGranted(); Serial.println("Zugriff erlaubt => Tür öffnen"); // Oeffnen der Tuere Serial.println("Password eingeben"); // 3 Sekunden Pause keypadEvent(); } else // nein => { Serial.println("Zugriff verweigert"); // Rote LED blinkt als Warnung signalAccessRefused(); } } } [/code]
Bibliothek:
https://github.com/phrac/arduino/blob/master/tutorials/Password.hFranz-PeterTeilnehmerJetzt ist es besser.
Daswhile(1) loop();
ist aber immer noch drin.
Was gibt er denn auf der seriellen Schnittstelle aus, wenn es nicht mehr funktioniert? Kommt da noch was?Andreas7254TeilnehmerIngnoriert das
while(1) loop();
bitte. :)
Also wenn ich das Schloss einmal geöffnet hatte und der sich wieder schließt kann ich ihn nicht wieder öffnen, weil er das Password nicht zum zweitenmal akzeptiert.
Im seriellen Monitor habe ich gesehen, dass der die Türkontrolle nicht zum zweitenmal aktiviert hat. (Was der normalerweise, nach dem Türschließen, machen sollte.) Wenn ich die Karte an den RFID gehalten hatte, hat er es akzeptiert, aber das Password hat er danach nicht akzeptiert (auch davor nicht).Andreas7254Teilnehmer[code] #include <Password.h> #include <Keypad.h> #include <SPI.h> // Import SPI-Bibiothek #include <MFRC522.h> // Import RFID-Bibiothek #include <Servo.h> // Import Servo Bibliothek const int SDAPIN = 53; // Uno => Pin 10 const int RSTPIN = 9; // Uno => Pin 9 const int REDLED = 13; // Uno -> Pin 8 const int GREENLED = 12; // Uno -> Pin 7 const int SERVOPIN = 11; // Uno -> Pin 6 const byte ROWS = 4; const byte COLS = 4; char keys[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; byte sesam[] = {0x8B, 0x88, 0xCA, 0x1D}; byte rowPins[ROWS] = {48, 47, 46, 45}; //connect to the row pinouts of the keypad byte colPins[COLS] = {44, 43, 42, 41}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); MFRC522 rfidReader(SDAPIN, RSTPIN); // RFID-Empfänger Servo door; // Türverschluss (Servo) Password password = Password( "123A" ); void setup() { Serial.begin(9600); // Serielle Verbindung SPI.begin(); // SPI-Verbindung aufbauen Serial.write(254); Serial.write(0x01); delay(200); door.attach(SERVOPIN); pinMode(REDLED, OUTPUT); pinMode(GREENLED, OUTPUT); pinMode(SERVOPIN, OUTPUT); keypad.addEventListener(keypadEvent); //add an event listener for this keypad rfidReader.PCD_Init(); // Initial. RFID-Leser Serial.println("Türkontrolle aktiviert"); } bool acceptedRFID(byte uid[4]) { return (rfidReader.uid.uidByte[0] == sesam[0]) && (rfidReader.uid.uidByte[1] == sesam[1]) && (rfidReader.uid.uidByte[2] == sesam[2]) && (rfidReader.uid.uidByte[3] == sesam[3]); } void openDoor() { for (int pos = 90; pos <= 180; pos++) { door.write(pos); delay(10); } } void closeDoor(){ for (int pos = 180; pos >= 90; pos--) { door.write(pos); delay(10); } } void signalDoorLocked() { digitalWrite(REDLED, HIGH); digitalWrite(GREENLED, LOW); } void signalAccessGranted() { digitalWrite(REDLED, LOW); digitalWrite(GREENLED, HIGH); } void signalAccessRefused() { for (int i = 0; i < 5; i++) { digitalWrite(REDLED, HIGH); delay(250); digitalWrite(REDLED, LOW); delay(250); } } void keypadEvent(){ keypad.getKey(); signalDoorLocked(); } //take care of some special events void keypadEvent(KeypadEvent eKey){ switch (keypad.getState()){ case PRESSED: Serial.print("Eingegeben:"); Serial.println(eKey); delay(10); Serial.write(254); switch (eKey){ case '*': checkPassword(); delay(1); break; case '#': password.reset(); delay(1); break; default: password.append(eKey); delay(1); } } } void checkPassword(){ if (password.evaluate()){ //if password is right open signalAccessGranted(); Serial.println("Zugriff erlaubt"); Serial.write(254);delay(10); //Add code to run if it works openDoor(); //deg delay(3000); Serial.println("Tür schliessen"); // Tuere wieder schliessen closeDoor(); }else{ Serial.println("Zugriff verweigert"); //if passwords wrong keep locked Serial.write(254);delay(10); //add code to run if it did not work signalAccessRefused(); } } void loop() { char key = keypad.getKey(); signalDoorLocked(); // Karte erkannt und gelesen if (rfidReader.PICC_IsNewCardPresent() && rfidReader.PICC_ReadCardSerial()) { Serial.print("Erkanntes RFID-TAG ist => "); // Bytes der ID lesen und ausgeben Serial.print("/"); for (byte i = 0; i < rfidReader.uid.size; i++) { Serial.print(rfidReader.uid.uidByte[i], HEX); Serial.print("/"); } Serial.println(); // Check ob Karte mit Variable sesam übereinstimmt if (acceptedRFID(rfidReader.uid.uidByte)) { // ja => // Erlaubten Zugriff signalisieren signalAccessGranted(); Serial.println("Zugriff erlaubt => Tür öffnen"); // Oeffnen der Tuere Serial.println("Password eingeben"); // 3 Sekunden Pause keypadEvent(); } else // nein => { Serial.println("Zugriff verweigert"); // Rote LED blinkt als Warnung signalAccessRefused(); } } } [/code]
Andreas7254TeilnehmerHier ist der Sketch ohne
while(1) loop();
:[code] #include <Password.h> #include <Keypad.h> #include <SPI.h> // Import SPI-Bibiothek #include <MFRC522.h> // Import RFID-Bibiothek #include <Servo.h> // Import Servo Bibliothek const int SDAPIN = 53; // Uno => Pin 10 const int RSTPIN = 9; // Uno => Pin 9 const int REDLED = 13; // Uno -> Pin 8 const int GREENLED = 12; // Uno -> Pin 7 const int SERVOPIN = 11; // Uno -> Pin 6 const byte ROWS = 4; const byte COLS = 4; char keys[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; byte sesam[] = {0x8B, 0x88, 0xCA, 0x1D}; byte rowPins[ROWS] = {48, 47, 46, 45}; //connect to the row pinouts of the keypad byte colPins[COLS] = {44, 43, 42, 41}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); MFRC522 rfidReader(SDAPIN, RSTPIN); // RFID-Empfänger Servo door; // Türverschluss (Servo) Password password = Password( "123A" ); void setup() { Serial.begin(9600); // Serielle Verbindung SPI.begin(); // SPI-Verbindung aufbauen Serial.write(254); Serial.write(0x01); delay(200); door.attach(SERVOPIN); pinMode(REDLED, OUTPUT); pinMode(GREENLED, OUTPUT); pinMode(SERVOPIN, OUTPUT); keypad.addEventListener(keypadEvent); //add an event listener for this keypad rfidReader.PCD_Init(); // Initial. RFID-Leser Serial.println("Türkontrolle aktiviert"); } bool acceptedRFID(byte uid[4]) { return (rfidReader.uid.uidByte[0] == sesam[0]) && (rfidReader.uid.uidByte[1] == sesam[1]) && (rfidReader.uid.uidByte[2] == sesam[2]) && (rfidReader.uid.uidByte[3] == sesam[3]); } void openDoor() { for (int pos = 90; pos <= 180; pos++) { door.write(pos); delay(10); } } void closeDoor(){ for (int pos = 180; pos >= 90; pos--) { door.write(pos); delay(10); } } void signalDoorLocked() { digitalWrite(REDLED, HIGH); digitalWrite(GREENLED, LOW); } void signalAccessGranted() { digitalWrite(REDLED, LOW); digitalWrite(GREENLED, HIGH); } void signalAccessRefused() { for (int i = 0; i < 5; i++) { digitalWrite(REDLED, HIGH); delay(250); digitalWrite(REDLED, LOW); delay(250); } } void keypadEvent(){ keypad.getKey(); signalDoorLocked(); } //take care of some special events void keypadEvent(KeypadEvent eKey){ switch (keypad.getState()){ case PRESSED: Serial.print("Eingegeben:"); Serial.println(eKey); delay(10); Serial.write(254); switch (eKey){ case '*': checkPassword(); delay(1); break; case '#': password.reset(); delay(1); break; default: password.append(eKey); delay(1); } } } void checkPassword(){ if (password.evaluate()){ //if password is right open signalAccessGranted(); Serial.println("Zugriff erlaubt"); Serial.write(254);delay(10); //Add code to run if it works openDoor(); //deg delay(3000); Serial.println("Tür schliessen"); // Tuere wieder schliessen closeDoor(); }else{ Serial.println("Zugriff verweigert"); //if passwords wrong keep locked Serial.write(254);delay(10); //add code to run if it did not work signalAccessRefused(); } } void loop() { char key = keypad.getKey(); signalDoorLocked(); // Karte erkannt und gelesen if (rfidReader.PICC_IsNewCardPresent() && rfidReader.PICC_ReadCardSerial()) { Serial.print("Erkanntes RFID-TAG ist => "); // Bytes der ID lesen und ausgeben Serial.print("/"); for (byte i = 0; i < rfidReader.uid.size; i++) { Serial.print(rfidReader.uid.uidByte[i], HEX); Serial.print("/"); } Serial.println(); // Check ob Karte mit Variable sesam übereinstimmt if (acceptedRFID(rfidReader.uid.uidByte)) { // ja => // Erlaubten Zugriff signalisieren signalAccessGranted(); Serial.println("Zugriff erlaubt => Tür öffnen"); // Oeffnen der Tuere Serial.println("Password eingeben"); // 3 Sekunden Pause keypadEvent(); } else // nein => { Serial.println("Zugriff verweigert"); // Rote LED blinkt als Warnung signalAccessRefused(); } } } [/code]
Andreas7254TeilnehmerIm Seriellen Monitor steht es so:
⸮Türkontrolle aktiviert
Erkanntes RFID-TAG ist => /8B/88/CA/1D/
Zugriff erlaubt => Tür öffnen
Password eingeben
Erkanntes RFID-TAG ist => /8B/88/CA/1D/
Zugriff erlaubt => Tür öffnen
Password eingeben
Erkanntes RFID-TAG ist => /8B/88/CA/1D/
Zugriff erlaubt => Tür öffnen
Password eingeben
Eingegeben:1
⸮Eingegeben:2
⸮Eingegeben:3
⸮Eingegeben:A
⸮Eingegeben:*
⸮Zugriff erlaubt
⸮Tür schliessen
Erkanntes RFID-TAG ist => /8B/88/CA/1D/
Zugriff erlaubt => Tür öffnen
Password eingeben
Erkanntes RFID-TAG ist => /8B/88/CA/1D/
Zugriff erlaubt => Tür öffnen
Password eingeben
Erkanntes RFID-TAG ist => /8B/88/CA/1D/
Zugriff erlaubt => Tür öffnen
Password eingeben
Eingegeben:1
⸮Eingegeben:2
⸮Eingegeben:3
⸮Eingegeben:A
⸮Eingegeben:*
⸮Zugriff verweigert
⸮Franz-PeterTeilnehmerHallo Andreas,
ich habe die Passwordlib mal kurz überflogen. So wie ich das sehe, musst Du vor jedem Eingeben eines neuen Passwortes ein password.reset() aufrufen. Sonst hängt er mit password.append die neu eingegebenen Zeichen einfach an das vorher eingegeben an, und dann ist es ja ein ungültiges Passwort, da jetzt das zuerst eingegebene und das aktuelle hintereinanderhängen und doppelt vorhanden sind.Andreas7254TeilnehmerOk, probiere ich mal, dankeschön.
Und wie ist es mit meiner zweiten Frage? -
AutorBeiträge