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

#7372
Andreas7254
Teilnehmer

Hier 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]