3D-Drucker

RFID & Tastenfeld Schloss

StartHardware-Forum RFID & Tastenfeld Schloss

Ansicht von 15 Beiträgen - 1 bis 15 (von insgesamt 18)
  • Autor
    Beiträge
  • #7328 Antworten
    Andreas7254
    Teilnehmer

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

    Vielen Dank im Voraus

    Mit viel Hoffnung auf Hilfe
    Andreas Eirich

    #7330 Antworten
    Franz-Peter
    Teilnehmer

    Hallo 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.

    • Diese Antwort wurde geändert vor 4 Monaten, 3 Wochen von Franz-Peter.
    #7334 Antworten
    Andreas7254
    Teilnehmer

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

    #7335 Antworten
    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();
    }
    }
    }
    #7336 Antworten
    Andreas7254
    Teilnehmer

    Besser so?

    #7338 Antworten
    Franz-Peter
    Teilnehmer

    Na 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 ).

    #7341 Antworten
    Andreas7254
    Teilnehmer

    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.h

    • Diese Antwort wurde geändert vor 4 Monaten, 3 Wochen von Andreas7254.
    #7343 Antworten
    Andreas7254
    Teilnehmer

    Tut 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.h

    #7368 Antworten
    Franz-Peter
    Teilnehmer

    Jetzt ist es besser.
    Das while(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?

    #7369 Antworten
    Andreas7254
    Teilnehmer

    Ingnoriert 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).

    #7370 Antworten
    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]
    • Diese Antwort wurde geändert vor 4 Monaten, 2 Wochen von Andreas7254.
    #7372 Antworten
    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]
    #7373 Antworten
    Andreas7254
    Teilnehmer

    Im 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

    #7391 Antworten
    Franz-Peter
    Teilnehmer

    Hallo 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.

    #7393 Antworten
    Andreas7254
    Teilnehmer

    Ok, probiere ich mal, dankeschön.
    Und wie ist es mit meiner zweiten Frage?

Ansicht von 15 Beiträgen - 1 bis 15 (von insgesamt 18)
Antwort auf: RFID & Tastenfeld Schloss
Deine Information: