Zum Inhalt springen

Antwort auf: RFID & Tastenfeld Schloss

Projekte und Tutorials für Arduino Foren StartHardware-Forum RFID & Tastenfeld Schloss Antwort auf: RFID & Tastenfeld Schloss

#7335
Andreas7254
Teilnehmer

#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();
}
}
}