Projekte und Tutorials für Arduino › Foren › StartHardware-Forum › RFID & Tastenfeld Schloss › Antwort auf: RFID & Tastenfeld Schloss
5. Mai 2020 um 9:45 Uhr
#7370
Andreas7254
Teilnehmer
[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]