Rfid sketch



  • Hello,
    can anyone help me to change the

    The relay should only put on for 3 seconds.

    /**
     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     *
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
     *
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     *******************************
     *
     * REVISION HISTORY
     * Version 1.0 - Henrik Ekblad
     * 
     * DESCRIPTION
     * RFID Lock sensor/actuator
     * 
     * Use RFID tag to lock/unlock a door or trigger a scene on your controller.
     * This example sketch allows you to add an optional relay or solenoid 
     * which can be activated/opened by RFID or controller.  
     *
     * Use the I2C wiring option for your RFID module and connect to the following Arduino pins.
     * 
     * RFID       Arduino
     * -----      -------
     * GND   ->   GND
     * VCC   ->   +5V
     * SCL   ->   A5
     * SDA   ->   A4
     * 
     * Use normal wiring for NRF24L01 radio
     * 
     * Attach a optional relay or solonoid lock to pin 4
     * http://www.mysensors.org/build/rfid 
     */
    
    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    #include <SPI.h>
    #include <MySensors.h>  
    #include <Wire.h>
    #include <PN532_I2C.h>
    #include <PN532.h>
    
    
    // Add your valid rfid keys here. To find you your key just run sketch; hold your new RFID tag in fron ot the reader; 
    // and copy the key from serial output of this sketch.
    const uint8_t maxKeyLength = 7;
    uint8_t validKeys[][maxKeyLength] = {
                        { 0xB3, 0xC6, 0xD9, 0x80, 0x00, 0x00, 0x00 },
                        { 0, 0, 0, 0, 0, 0, 0 },    // ADD YOUR KEYS HERE!
                        { 0, 0, 0, 0, 0, 0, 0 }};
    int keyCount = sizeof validKeys / maxKeyLength; 
    
    
    #define CHILD_ID 99   // Id of the sensor child
    
    // Pin definition
    const int lockPin = 4;         // (Digital 4) The pin that activates the relay/solenoid lock.
    bool lockStatus;
    MyMessage lockMsg(CHILD_ID, V_LOCK_STATUS);
    PN532_I2C pn532i2c(Wire);
    PN532 nfc(pn532i2c);
    
    void setup() {
    
      pinMode(lockPin, OUTPUT);
    
      nfc.begin();
      uint32_t versiondata = nfc.getFirmwareVersion();
      if (! versiondata) {
        Serial.print("Couldn't find PN53x board");
        while (1); // halt
      }
      Serial.print("Found NFC chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
      Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
      Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
      // Set the max number of retry attempts to read from a card
      // This prevents us from waiting forever for a card, which is
      // the default behaviour of the PN532.
      nfc.setPassiveActivationRetries(0x3);
    
      // configure board to read RFID tags
      nfc.SAMConfig();
    
      lockStatus = loadState(0);    // Read last lock status from eeprom
      setLockState(lockStatus, true); // Now set the last known state and send it to controller 
    }
    
    void presentation()  {
      sendSketchInfo("RFID Lock", "1.0");
      present(CHILD_ID, S_LOCK);
    }
    
    void loop() {
      bool success;
      uint8_t key[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
      uint8_t currentKeyLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
    
    
      // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
      // 'uid' will be populated with the UID, and uidLength will indicate
      // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
      success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &key[0], &currentKeyLength);
    
      if (success) {
        Serial.print("Found tag id: ");
        for (uint8_t i=0; i < currentKeyLength; i++) 
        {
          if (i>0) Serial.print(",");
          Serial.print("0x");Serial.print(key[i], HEX); 
        }
        for (uint8_t i=currentKeyLength; i < maxKeyLength; i++) 
        {
          Serial.print(",0x00"); 
        }
    
    
        Serial.println("");
    
        bool valid = false;
        // Compare this key to the valid once registered here in sketch 
        for (int i=0;i<keyCount && !valid;i++) {
          for (int j=0;j<currentKeyLength && !valid;j++) {
            if (key[j] != validKeys[i][j]) {
              break;
            }
            if (j==currentKeyLength-1) {
              valid = true;
            }
          }
        }
        if (valid) {
          // Switch lock status
          setLockState(!lockStatus, true);       
        }
    
        // Wait for card/tag to leave reader    
        while(nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &key[0], &currentKeyLength));
      } 
    } 
    
    
    
    // Unlocks the door.
    void setLockState(bool state, bool doSend){
      if (state) 
         Serial.println("open lock");
      else
         Serial.println("close lock");
      if (doSend)
        send(lockMsg.set(state));
      digitalWrite(lockPin, state);
      saveState(0,state);
      lockStatus = state;
    }
    
    void receive(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
      if (message.type==V_LOCK_STATUS) {
         // Change relay state
         setLockState(message.getBool(), false); 
    
         // Write some debug info
         Serial.print("Incoming lock status:");
         Serial.println(message.getBool());
       } 
    }l```

  • Mod

    change

    void setLockState(bool state, bool doSend){
      if (state) 
         Serial.println("open lock");
      else
         Serial.println("close lock");
      if (doSend)
        send(lockMsg.set(state));
      digitalWrite(lockPin, state);
      saveState(0,state);
      lockStatus = state;
    }
    

    to

    void setLockState(bool state, bool doSend) {
      if (state)
      {
        Serial.println("open lock");
        digitalWrite(lockPin, true);
        wait(3000);
        Serial.println("close lock");
        digitalWrite(lockPin, false);
      }
    }
    


  • Thank you, it work´s perfect.
    greetings Holger



  • Hm,
    now in fhem the state is not transmitted.



  • @the-holgi
    That's obvious... as now the state of the lock switches rather fast, the behaviour should be differen. I'd suggest to send both info (on/off) (on before wait(), off after) to get the events in FHEM also.



  • I´ve change the code, now the state on transmitted to fhem, but state off not.

    void setLockState(bool state, bool doSend) {
      if (state)
      {
        Serial.println("open lock");
        digitalWrite(lockPin, true);
        wait(5000);
        Serial.println("close lock");
      if (doSend)
        send(lockMsg.set(state));
        digitalWrite(lockPin, false);
      }
    }```

  • Mod

    @the-holgi this should work

    void setLockState(bool state, bool doSend) {
      if (state)
      {
        Serial.println("open lock");
      if (doSend)
        send(lockMsg.set(true));
        digitalWrite(lockPin, true);
        wait(5000);
        Serial.println("close lock");
      if (doSend)
        send(lockMsg.set(false));
        digitalWrite(lockPin, false);
      } else {
      if (doSend)
        send(lockMsg.set(state));
    }
    }
    


  • Thank you it works perfect.
    Here the complete sketch:

    /**
     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     *
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
     *
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     *******************************
     *
     * REVISION HISTORY
     * Version 1.0 - Henrik Ekblad
     * 
     * DESCRIPTION
     * RFID Lock sensor/actuator
     * 
     * Use RFID tag to lock/unlock a door or trigger a scene on your controller.
     * This example sketch allows you to add an optional relay or solenoid 
     * which can be activated/opened by RFID or controller.  
     *
     * Use the I2C wiring option for your RFID module and connect to the following Arduino pins.
     * 
     * RFID       Arduino
     * -----      -------
     * GND   ->   GND
     * VCC   ->   +5V
     * SCL   ->   A5
     * SDA   ->   A4
     * 
     * Use normal wiring for NRF24L01 radio
     * 
     * Attach a optional relay or solonoid lock to pin 4
     * http://www.mysensors.org/build/rfid 
     */
    
    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    #include <SPI.h>
    #include <MySensors.h>  
    #include <Wire.h>
    #include <PN532_I2C.h>
    #include <PN532.h>
    
    
    // Add your valid rfid keys here. To find you your key just run sketch; hold your new RFID tag in fron ot the reader; 
    // and copy the key from serial output of this sketch.
    const uint8_t maxKeyLength = 7;
    uint8_t validKeys[][maxKeyLength] = {
                        { 0xB3, 0xC6, 0xD9, 0x80, 0x00, 0x00, 0x00 },
                        { 0x5B, 0xFC, 0x7A, 0xD, 0x00, 0x00, 0x00 },    // ADD YOUR KEYS HERE!
                        { 0xF1, 0x13, 0x54, 0x63, 0x00, 0x00, 0x00 },
                        { 0xCB, 0x6F, 0x2D, 0xD, 0x00, 0x00, 0x00 },
                        { 0x9B, 0x33, 0x2C, 0xD, 0x00, 0x00, 0x00 },
                        { 0x73, 0xFA, 0xF6, 0x1A, 0x00, 0x00, 0x00 },
                        { 0x83, 0x59, 0x36, 0x1A, 0x00, 0x00, 0x00 },
                        { 0x83, 0x1A, 0x3C, 0x1A, 0x00, 0x00, 0x00 },
                        { 0xB6, 0xB2, 0x52, 0xF8, 0x00, 0x00, 0x00 },
                        { 0x17, 0xE5, 0xD2, 0x2B, 0x00, 0x00, 0x00 },
                        { 0x79 ,0xF7, 0x88, 0x5A, 0x00, 0x00, 0x00 },
                        
                        { 0x2B, 0xDC, 0x49, 0xB, 0x00, 0x00, 0x00 }};
    int keyCount = sizeof validKeys / maxKeyLength; 
    
    #define CHILD_ID 99   // Id of the sensor child
    
    
    // Pin definition
    const int lockPin = 4;         // (Digital 4) The pin that activates the relay/solenoid lock.
    bool lockStatus;
    MyMessage lockMsg(CHILD_ID, V_LOCK_STATUS);
    PN532_I2C pn532i2c(Wire);
    PN532 nfc(pn532i2c);
    
    void setup() {
    
      pinMode(lockPin, OUTPUT);
    
      nfc.begin();
      uint32_t versiondata = nfc.getFirmwareVersion();
      if (! versiondata) {
        Serial.print("Couldn't find PN53x board");
        while (1); // halt
      }
      Serial.print("Found NFC chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
      Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
      Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
      // Set the max number of retry attempts to read from a card
      // This prevents us from waiting forever for a card, which is
      // the default behaviour of the PN532.
      nfc.setPassiveActivationRetries(0x3);
    
      // configure board to read RFID tags
      nfc.SAMConfig();
    
      lockStatus = loadState(0);    // Read last lock status from eeprom
      setLockState(lockStatus, true); // Now set the last known state and send it to controller 
    }
    
    void presentation()  {
      sendSketchInfo("RFID Lock", "1.0");
      present(CHILD_ID, S_LOCK);
    }
    
    void loop() {
      bool success;
      uint8_t key[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
      uint8_t currentKeyLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
    
    
      // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
      // 'uid' will be populated with the UID, and uidLength will indicate
      // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
      success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &key[0], &currentKeyLength);
    
      if (success) {
        Serial.print("Found tag id: ");
        for (uint8_t i=0; i < currentKeyLength; i++) 
        {
          if (i>0) Serial.print(",");
          Serial.print("0x");Serial.print(key[i], HEX); 
        }
        for (uint8_t i=currentKeyLength; i < maxKeyLength; i++) 
        {
          Serial.print(",0x00"); 
        }
    
    
        Serial.println("");
    
        bool valid = false;
        // Compare this key to the valid once registered here in sketch 
        for (int i=0;i<keyCount && !valid;i++) {
          for (int j=0;j<currentKeyLength && !valid;j++) {
            if (key[j] != validKeys[i][j]) {
              break;
            }
            if (j==currentKeyLength-1) {
              valid = true;
            }
          }
        }
        if (valid) {
          // Switch lock status
          setLockState(!lockStatus, true);       
        }
    
        // Wait for card/tag to leave reader    
        while(nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &key[0], &currentKeyLength));
      } 
    } 
    
    
    
    // Unlocks the door.
    void setLockState(bool state, bool doSend) {
      if (state)
      {
        Serial.println("open lock");
      if (doSend)
        send(lockMsg.set(true));
        digitalWrite(lockPin, true);
        wait(5000);
        Serial.println("close lock");
      if (doSend)
        send(lockMsg.set(false));
        digitalWrite(lockPin, false);
      } else {
      if (doSend)
        send(lockMsg.set(state));
    }
    }
    
    void receive(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
      if (message.type==V_LOCK_STATUS) {
         // Change relay state
         setLockState(message.getBool(), false); 
    
         // Write some debug info
         Serial.print("Incoming lock status:");
         Serial.println(message.getBool());
       } 
    }


  • Hello,
    now i´m write the sketch to another arduino with rfid and relay.
    It doesn´t work .
    From fhem i can trigger the relay and in serial monitor the card´s where shown with serial.
    In fhem the lockstatus is set to off, when the card is in near of the reader, the lockstatus on doesn´t send to fhem.
    But the relay doesn´t trigger by card.
    Where is the mistake?
    The problem is the lockstate doesnt set to on.

    /**
     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     *
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
     *
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     *******************************
     *
     * REVISION HISTORY
     * Version 1.0 - Henrik Ekblad
     * 
     * DESCRIPTION
     * RFID Lock sensor/actuator
     * 
     * Use RFID tag to lock/unlock a door or trigger a scene on your controller.
     * This example sketch allows you to add an optional relay or solenoid 
     * which can be activated/opened by RFID or controller.  
     *
     * Use the I2C wiring option for your RFID module and connect to the following Arduino pins.
     * 
     * RFID       Arduino
     * -----      -------
     * GND   ->   GND
     * VCC   ->   +5V
     * SCL   ->   A5
     * SDA   ->   A4
     * 
     * Use normal wiring for NRF24L01 radio
     * 
     * Attach a optional relay or solonoid lock to pin 4
     * http://www.mysensors.org/build/rfid 
     */
    
    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    #include <SPI.h>
    #include <MySensors.h>  
    #include <Wire.h>
    #include <PN532_I2C.h>
    #include <PN532.h>
    
    
    // Add your valid rfid keys here. To find you your key just run sketch; hold your new RFID tag in fron ot the reader; 
    // and copy the key from serial output of this sketch.
    const uint8_t maxKeyLength = 7;
    uint8_t validKeys[][maxKeyLength] = {
                        { 0xB3, 0xC6, 0xD9, 0x80, 0x00, 0x00, 0x00 },
                        { 0x5B, 0xFC, 0x7A, 0xD, 0x00, 0x00, 0x00 },    // ADD YOUR KEYS HERE!
                        { 0xF1, 0x13, 0x54, 0x63, 0x00, 0x00, 0x00 },
                        { 0xCB, 0x6F, 0x2D, 0xD, 0x00, 0x00, 0x00 },
                        { 0x9B, 0x33, 0x2C, 0xD, 0x00, 0x00, 0x00 },
                        { 0x73, 0xFA, 0xF6, 0x1A, 0x00, 0x00, 0x00 },
                        { 0x83, 0x59, 0x36, 0x1A, 0x00, 0x00, 0x00 },
                        { 0x83, 0x1A, 0x3C, 0x1A, 0x00, 0x00, 0x00 },
                        { 0xB6, 0xB2, 0x52, 0xF8, 0x00, 0x00, 0x00 },
                        { 0x17, 0xE5, 0xD2, 0x2B, 0x00, 0x00, 0x00 },
                        { 0x79 ,0xF7, 0x88, 0x5A, 0x00, 0x00, 0x00 },
                        { 0x2B, 0xDC, 0x49, 0xB, 0x00, 0x00, 0x00 }};
    int keyCount = sizeof validKeys / maxKeyLength; 
    
    #define CHILD_ID 99   // Id of the sensor child
    
    
    // Pin definition
    const int lockPin = 4;         // (Digital 4) The pin that activates the relay/solenoid lock.
    bool lockStatus;
    MyMessage lockMsg(CHILD_ID, V_LOCK_STATUS);
    PN532_I2C pn532i2c(Wire);
    PN532 nfc(pn532i2c);
    
    void setup() {
    
      pinMode(lockPin, OUTPUT);
    
      nfc.begin();
      uint32_t versiondata = nfc.getFirmwareVersion();
      if (! versiondata) {
        Serial.print("Couldn't find PN53x board");
        while (1); // halt
      }
      Serial.print("Found NFC chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
      Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
      Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
      // Set the max number of retry attempts to read from a card
      // This prevents us from waiting forever for a card, which is
      // the default behaviour of the PN532.
      nfc.setPassiveActivationRetries(0x3);
    
      // configure board to read RFID tags
      nfc.SAMConfig();
    
      lockStatus = loadState(0);    // Read last lock status from eeprom
      setLockState(lockStatus, true); // Now set the last known state and send it to controller 
    }
    
    void presentation()  {
      sendSketchInfo("RFID Lock", "1.0");
      present(CHILD_ID, S_LOCK);
    }
    
    void loop() {
      bool success;
      uint8_t key[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
      uint8_t currentKeyLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
    
    
      // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
      // 'uid' will be populated with the UID, and uidLength will indicate
      // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
      success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &key[0], &currentKeyLength);
    
      if (success) {
        Serial.print("Found tag id: ");
        for (uint8_t i=0; i < currentKeyLength; i++) 
        {
          if (i>0) Serial.print(",");
          Serial.print("0x");Serial.print(key[i], HEX); 
        }
        for (uint8_t i=currentKeyLength; i < maxKeyLength; i++) 
        {
          Serial.print(",0x00"); 
        }
    
    
        Serial.println("");
    
        bool valid = false;
        // Compare this key to the valid once registered here in sketch 
        for (int i=0;i<keyCount && !valid;i++) {
          for (int j=0;j<currentKeyLength && !valid;j++) {
            if (key[j] != validKeys[i][j]) {
              break;
            }
            if (j==currentKeyLength-1) {
              valid = true;
            }
          }
        }
        if (valid) {
          // Switch lock status
          setLockState(!lockStatus, true);       
        }
    
        // Wait for card/tag to leave reader    
        while(nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &key[0], &currentKeyLength));
      } 
    } 
    
    
    
    // Unlocks the door.
    void setLockState(bool state, bool doSend) {
      if (state)
      {
        Serial.println("open lock");
      if (doSend)
        send(lockMsg.set(true));
        digitalWrite(lockPin, true);
        wait(5000);
        Serial.println("close lock");
      if (doSend)
        send(lockMsg.set(false));
        digitalWrite(lockPin, false);
      } else {
      if (doSend)
        send(lockMsg.set(state));
    }
    }
    
    void receive(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
      if (message.type==V_LOCK_STATUS) {
         // Change relay state
         setLockState(message.getBool(), false); 
    
         // Write some debug info
         Serial.print("Incoming lock status:");
         Serial.println(message.getBool());
       } 
    }```
    
    Hm, with other arduino now it works.

 

245
Online

8.6k
Users

9.4k
Topics

99.0k
Posts