Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. My Project
  3. RFID Garage door opener

RFID Garage door opener

Scheduled Pinned Locked Moved My Project
47 Posts 23 Posters 37.5k Views 26 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • DannyMD Offline
    DannyMD Offline
    DannyM
    wrote on last edited by
    #9

    Hi @BartE,

    Works great, but I want to let the masterkey trigger a second alarm, what way should I think; I have tried to let the mastercard open a second relay, but it didn't work. Maybe I should use a second programmed key lets say personkey and trigger on that? Can you give me some directions?

    Thanks Danny

    BartEB 1 Reply Last reply
    0
    • DannyMD DannyM

      Hi @BartE,

      Works great, but I want to let the masterkey trigger a second alarm, what way should I think; I have tried to let the mastercard open a second relay, but it didn't work. Maybe I should use a second programmed key lets say personkey and trigger on that? Can you give me some directions?

      Thanks Danny

      BartEB Offline
      BartEB Offline
      BartE
      Contest Winner
      wrote on last edited by
      #10

      @DannyM With this sketch a second relay (on pin 3) is controlled by the master-key

      The sketch should work but i did not test it.

      /*
       * ----------------------------------------------------------------------------
       * This is a MFRC522 library example; see https://github.com/miguelbalboa/rfid
       * for further details and other examples.
       * 
       * NOTE: The library file MFRC522.h has a lot of useful info. Please read it.
       * 
       * Released into the public domain.
       * ----------------------------------------------------------------------------
       * Example sketch/program showing how to read data from a PICC (that is: a RFID
       * Tag or Card) using a MFRC522 based RFID Reader on the Arduino SPI interface.
       * 
       * When the Arduino and the MFRC522 module are connected (see the pin layout
       * below), load this sketch into Arduino IDE then verify/compile and upload it.
       * To see the output: use Tools, Serial Monitor of the IDE (hit Ctrl+Shft+M).
       * When you present a PICC (that is: a RFID Tag or Card) at reading distance
       * of the MFRC522 Reader/PCD, the serial output will show the ID/UID, type and
       * any data blocks it can read. Note: you may see "Timeout in communication"
       * messages when removing the PICC from reading distance too early.
       * 
       * If your reader supports it, this sketch/program will read all the PICCs
       * presented (that is: multiple tag reading). So if you stack two or more
       * PICCs on top of each other and present them to the reader, it will first
       * output all details of the first and then the next PICC. Note that this
       * may take some time as all data blocks are dumped, so keep the PICCs at
       * reading distance until complete.
       * 
       * Typical pin layout used:
       * -----------------------------------------------------------------------------------------
       *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
       *             Reader/PCD   Uno           Mega      Nano v3    Leonardo/Micro   Pro Micro
       * Signal      Pin          Pin           Pin       Pin        Pin              Pin
       * -----------------------------------------------------------------------------------------
       * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
       * SPI SS      SDA(SS)      10            53        D10        10               10
       * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
       * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
       * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
       */
      
      /*
       RFID Garagedoor opener by Bart Eversdijk
       
       This sketch is to open a Garage door with an mifare RIFD-tag 
        
        For an Arduino Nano v3
        Connection wiring :
          - nrf24l01+ as descibed on the MySensors website
          - MFRC522 reader/writer as described above EXCEPT for pin D9 and D10:  connect RST i.s.o. pin D9 to pin D7 and connect SDA(SS) i.s.o. pin D10 to pin D8 
          - LED with 470ohm resistor between GMD and pin A3 
          - push button between GND and pin D5
          - 5v relays coil between GND and  pin D4 -> switch pins of the relays should be connected in parallel with your garage door push button. 
        
        Features:
        This project can record up to 18 RFID-"tags"
        These card IDs are stored in to EEPROM by keeping them next to the RFID reader when the system in program mode. (Slow blinking LED) When a card is accepted as new card the LED will blink fast for a short time.
        To keep the master-tags (choose your own) next to the RFID reader when pressing the push button. To clear all cards (except the master card) press the push button in program mode for 6 seconds. The LED will now fast blink for a couple of seconds.
        
        Your garage your can be opened by keep a registered RFID tag next to the reader or by clicking the open icon on lock node presented by this plugin.
        By by-passing the alarm node presented by this plug in the RFID will be temporarily disabled.
        When an incorrect (not registered) RFID tag is scanned the alarm is triggered to detect illegal scan attempts   
      
      */
      
      #include <SPI.h>
      #include <MFRC522.h>
      #include <MySensor.h> 
      #include <Bounce2.h>
      
      #define RF_INIT_DELAY   125
      #define ONE_SEC         1000
      #define MAX_CARDS       18
      #define PROG_WAIT       10
      #define HEARTBEAT       10
      #define BAUD            115200
      
      /*Pin definitions*/
      #define LED_PIN         A3
      #define SECONDRELAY     3
      #define GARAGEPIN       4
      #define SWITCH_PIN      5
      #define RST_PIN         7       //  MFRC 
      #define SS_PIN          8       //  MFRC 
      
      MFRC522      mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance
      MFRC522::Uid olduid;
      MFRC522::Uid masterkey = { 10, {0,0,0,0, 0,0,0,0, 0,0 },  0 };
      
      byte       countValidCards  = 0;
      MFRC522::Uid validCards[MAX_CARDS];
      
      void       ShowCardData(MFRC522::Uid* uid);
      bool       sameUid(MFRC522::Uid* old, MFRC522::Uid* check);
      void       copyUid(MFRC522::Uid* src, MFRC522::Uid* dest);
      bool       isValidCard(MFRC522::Uid* uid);
      int        releasecnt = 0;
      
      #define    CHILD_ID_ALARM    1
      #define    CHILD_ID_LOCK     2
      #define    CHILD_ID_LOCK2    3
      MySensor   gw;
      Bounce     debouncer = Bounce();
      
      int        oldSwitchValue=-1;
      int        switchValue = 0;
      long       timer = -1;
      bool       programmode = false;
      bool       ledon;
      int        programTimer = 0;
      bool       armed = true;
      unsigned long lastTime = 0;
      
      MyMessage  lockMsg(CHILD_ID_LOCK,          V_LOCK_STATUS);
      MyMessage  lock2Msg(CHILD_ID_LOCK2,          V_LOCK_STATUS);
      MyMessage  lockArmMsg(CHILD_ID_ALARM,      V_ARMED);
      MyMessage  wrongMsg(CHILD_ID_ALARM,        V_TRIPPED);
      
      void setup() {
              Serial.begin(BAUD);     // Initialize serial communications with the PC
              pinMode(GARAGEPIN, OUTPUT);     // Initialise in/output ports
              pinMode(SECONDRELAY, OUTPUT);     // Initialise in/output ports
              
              // Make sure MFRC will be disabled on the SPI bus
              pinMode(RST_PIN, OUTPUT);     
              digitalWrite(RST_PIN, LOW);
              pinMode(SS_PIN, OUTPUT);     
              digitalWrite(SS_PIN, LOW);
      
              pinMode(LED_PIN, OUTPUT);
              digitalWrite(LED_PIN, LOW);
              // Setup the button
              pinMode(SWITCH_PIN, INPUT_PULLUP);
      
              // After setting up the button, setup debouncer
              debouncer.attach(SWITCH_PIN);
              debouncer.interval(5);
      
              // Init mysensors library
              gw.begin(incomingMessage, 5);
              gw.sendSketchInfo("RFID Garage", "1.2"); delay(RF_INIT_DELAY);
              
              // Register all sensors to gw (they will be created as child devices)
              gw.present(CHILD_ID_LOCK, S_LOCK);      delay(RF_INIT_DELAY);
              gw.present(CHILD_ID_LOCK2, S_LOCK);      delay(RF_INIT_DELAY);
              gw.present(CHILD_ID_ALARM, S_MOTION);   delay(RF_INIT_DELAY);
      
              recallEeprom();
              
              // Init MFRC RFID sensor
              SPI.begin();            // Init SPI bus
              mfrc522.PCD_Init();     // Init MFRC522
              ShowReaderDetails();            // Show details of PCD - MFRC522 Card Reader details
      
              gw.send(lockArmMsg.set(armed));
              Serial.println(F("Init done..."));
      }
      
      void loop() {
              timer++;
              delay(HEARTBEAT);
              gw.process();
              debouncer.update();
      
              // Get the update value
              int switchValue = debouncer.read();
              if (switchValue != oldSwitchValue) {
                // Send in the new value
                Serial.print (F("Switch "));
                Serial.println (switchValue);
                
                if (switchValue && programmode) {
                     lastTime     = millis() / 1000;
                }
                
                if (!switchValue && programmode && lastTime > 0) {
                     if ( (millis() / 1000) - lastTime > 3) {
                          Serial.println(F("Reset all cards"));  
                          countValidCards  = 0;
                          blinkFast(50);
                     } else {
                        Serial.println(F("Program off"));  
                        digitalWrite(LED_PIN, LOW);
                        programmode = false;
                        
                        storeEeprom();
                     }
                }
                
                if (!switchValue)   {
                    programTimer = 0;
                }
                oldSwitchValue = switchValue;
              }
              
              if (programmode && ((timer % (ONE_SEC / HEARTBEAT)) == 0 ))  {
                  ledon = !ledon;
                  digitalWrite(LED_PIN, ledon);
                  programTimer++;
      
                  // Stop program mode after 20 sec inactivity
                  if (programTimer > PROG_WAIT)  {
                     programmode = false;
                     digitalWrite(LED_PIN, false);
                     Serial.println(F("Program expired"));  
                  }
              }
              
              if ((timer % (200 / HEARTBEAT)) == 0 )   {
                   // Look for new cards
                   if ( ! mfrc522.PICC_IsNewCardPresent()) {
                        if (releasecnt > 0)   {
                            releasecnt--;
                            if (!releasecnt)  {
                                olduid.size = 0;
                                Serial.println(F("release"));
                            }
                          }
                  return;
                  }
                  releasecnt = 5;
          
                 // Select one of the cards
                 if ( ! mfrc522.PICC_ReadCardSerial()) {
                    return;
                 }
          
                 // Dump debug info about the card; PICC_HaltA() is automatically called
                 //mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
                 if (!olduid.size || !sameUid(&(mfrc522.uid), &olduid))  {
                      ShowCardData(&(mfrc522.uid));
                      copyUid(&(mfrc522.uid), &olduid);
                      if ( isValidCard(&olduid) )   {
                           OpenDoor(programmode);
                      } else  {
                         if (sameUid(&(mfrc522.uid), &masterkey)) {
                             // Only switch in program mode when mastercard is found AND the program button is pressed
                             if (switchValue)  {
                               Serial.println(F("Program mode"));
                               programmode = true;
                               programTimer = 0;
                               lastTime     = 0;
                             } else {
                               OpenDoor2(programmode);
                             }
                         } else {
                             if (programmode) {
                               Serial.println(F("new card"));
                               programTimer = 0;
                               
                               if (countValidCards < MAX_CARDS)
                               {
                                  // Add card to list...
                                  copyUid(&(mfrc522.uid), &validCards[countValidCards]);
                                  countValidCards++;
                                  blinkFast(15);
                               }
                             } else {
                               Serial.println(F("Invalid card"));
                               if (armed) {
                                  gw.send(wrongMsg.set(1));
                                  delay(2000);
                                  gw.send(wrongMsg.set(0));
                               }
                             }
                         }
                      }
                 }
              }
      }
      
      void ShowCardData(MFRC522::Uid* uid) 
      {
          Serial.print(F("Card UID:"));
          for (byte i = 0; i < uid->size; i++) {
              if(uid->uidByte[i] < 0x10) {
                  Serial.print(F(" 0"));
              } else {
                  Serial.print(F(" "));
                      }
              Serial.print(uid->uidByte[i], HEX);
          } 
          Serial.println();
      }
      
      void copyUid(MFRC522::Uid* src, MFRC522::Uid* dest)
      {
          dest->size = src->size;
          dest->sak  = src->sak;
          
          for (byte i = 0; i < src->size; i++) {
          dest->uidByte[i] = src->uidByte[i];
          }
      }
      
      bool sameUid(MFRC522::Uid* old, MFRC522::Uid* check)
      {
          if (old->size != check->size) {
             return false;
          }
          for (byte i = 0; i < old->size; i++) {
              if (old->uidByte[i] != check->uidByte[i]) {
                  return false;
              }
          }
          return true;
      }
      
      bool isValidCard(MFRC522::Uid* uid)
      {
            for (byte i = 0; i < countValidCards; i++)  {
                if (validCards[i].size != uid->size)  {
                    break;
                }
                for (int j = 0; j < uid->size; j++) {
                    if (validCards[i].uidByte[j] != uid->uidByte[j])  {
                        break;
                    }
                    if (j == (uid->size - 1)) {  
                        return true;
                    }
                }
            }
            return false;
      }
      
      
      void storeEeprom()
      {
          byte address = 0;
          gw.saveState(address++, countValidCards);
          
          for (byte i = 0; i < countValidCards; i++) {
             gw.saveState(address++, validCards[i].size);
             for (byte j = 0; j < 10; j++) {
                gw.saveState(address++, validCards[i].uidByte[j]);
             } 
          }
      }
      
      void recallEeprom()
      {
          byte address = 0;
          
          countValidCards = gw.loadState(address++);
          if (countValidCards > MAX_CARDS) {
             Serial.println(F("Not a valid EEPROM reading set to default"));
             countValidCards = 0;
             storeEeprom();
             return;
          }
          
          for (byte i = 0; i < countValidCards; i++)  {
             validCards[i].size = gw.loadState(address++);
             for (byte j = 0; j < 10; j++)  {
                validCards[i].uidByte[j] = gw.loadState(address++);
             } 
          }
        
      }
      
      void blinkFast(int times)
      {
          for (int i = 0; i < times; i++) { 
             ledon = !ledon;
             digitalWrite(LED_PIN, ledon);
             delay(100);
          }
      }
      
      void OpenDoor(bool fakeOpen)
      {
          Serial.println(F("Open door!"));
          gw.send(lockMsg.set(false));
          
          if (!fakeOpen) { 
            digitalWrite(LED_PIN, HIGH);
            digitalWrite(GARAGEPIN, HIGH); 
          }
          delay(1000);
          
          if (!fakeOpen) { 
            digitalWrite(GARAGEPIN, LOW); 
            digitalWrite(LED_PIN, LOW);
          }
          
          gw.send(lockMsg.set(true));
      }
      
      void OpenDoor2(bool fakeOpen)
      {
          Serial.println(F("Open door 2!"));
          gw.send(lock2Msg.set(false));
          
          if (!fakeOpen) { 
            digitalWrite(LED_PIN, HIGH);
            digitalWrite(SECONDRELAY, HIGH); 
          }
          delay(1000);
          
          if (!fakeOpen) { 
            digitalWrite(SECONDRELAY, LOW); 
            digitalWrite(LED_PIN, LOW);
          }
          
          gw.send(lock2Msg.set(true));
      }
      
      void ShowReaderDetails() {
          // Get the MFRC522 software version
          byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg);
          Serial.print(F("MFRC522 Software Version: 0x"));
          Serial.print(v, HEX);
          if (v == 0x91) {
              Serial.print(F(" = v1.0"));
              } else if (v == 0x92) {
              Serial.print(F(" = v2.0"));
              } else {
              Serial.print(F(" (unknown)"));
              }
          Serial.println("");
          
              // When 0x00 or 0xFF is returned, communication probably failed
          if ((v == 0x00) || (v == 0xFF)) {
              Serial.println(F("WARNING: Communication failure, is the MFRC522 properly connected?"));
          }
      }
      
      
      void incomingMessage(const MyMessage &message) 
      {
         if (message.type == V_LOCK_STATUS) {
           // Change relay state
           if (!message.getBool())  {
              switch (message.sensor)
              {
                 case CHILD_ID_LOCK:
                    OpenDoor(false);
                    break;
                 case CHILD_ID_LOCK2:
                    OpenDoor2(false);
                    break;
              }
           }
        
           // Write some debug info
           Serial.print(F("Lock:  "));
           Serial.print(message.sensor);
           Serial.print(F(" status: "));
           Serial.println(message.getBool());
         }
         else 
         {
           if (message.type == V_ARMED)  {
             // Change relay state
             armed = message.getBool();
        
             // Write some debug info
             Serial.print(F("Arm status: "));
             Serial.println(message.getBool());
           }
           else
           {
             // Write some debug info
             Serial.print(F("Incoming msg type: "));
             Serial.print(message.type);
             Serial.print(F(" id: "));
             Serial.print(message.sensor);
             Serial.print(F(" content: "));
             Serial.println(message.getInt());
           }
         }
      }
      
      1 Reply Last reply
      0
      • S Offline
        S Offline
        SVLoneStar
        wrote on last edited by
        #11

        Hello BartE,
        I have the same issue as cyberfilou...
        Sketch works beautifully...but if I power off the Arduino (Pro Mini in my case) and power it on again, all stored cards are gone. Any ideas what could cause this, and how to prevent it?

        Thx a lot, Stefan

        BartEB 1 Reply Last reply
        0
        • S SVLoneStar

          Hello BartE,
          I have the same issue as cyberfilou...
          Sketch works beautifully...but if I power off the Arduino (Pro Mini in my case) and power it on again, all stored cards are gone. Any ideas what could cause this, and how to prevent it?

          Thx a lot, Stefan

          BartEB Offline
          BartEB Offline
          BartE
          Contest Winner
          wrote on last edited by
          #12

          @SVLoneStar That is weird.

          Do you get this message each time you boot the Arduino? "Not a valid EEPROM reading set to default"
          What is the UID size (how many bytes) of the recorded cards?

          1 Reply Last reply
          0
          • S Offline
            S Offline
            SVLoneStar
            wrote on last edited by
            #13

            Hi BartE - thanks for your reply!
            I do not receive any error regarding invalid EEPROM - not while writing, not at boot time.
            My cards are shown in this format: D4 04 E2 E9
            I register a Master Card like this (and it works until reboot):
            MFRC522::Uid masterkey = { 4, {0xD4,0x04,0xE2,0xE9}, 0 };

            BartEB 1 Reply Last reply
            0
            • AnticimexA Offline
              AnticimexA Offline
              Anticimex
              Contest Winner
              wrote on last edited by
              #14

              Cool stuff! You probably what some signing in there as well :) would be a shame if someone snooped the open command from your controller and decided to pay a visit.

              Do you feel secure today? No? Start requiring some signatures and feel better tomorrow ;)

              BartEB 1 Reply Last reply
              0
              • S SVLoneStar

                Hi BartE - thanks for your reply!
                I do not receive any error regarding invalid EEPROM - not while writing, not at boot time.
                My cards are shown in this format: D4 04 E2 E9
                I register a Master Card like this (and it works until reboot):
                MFRC522::Uid masterkey = { 4, {0xD4,0x04,0xE2,0xE9}, 0 };

                BartEB Offline
                BartEB Offline
                BartE
                Contest Winner
                wrote on last edited by
                #15

                @SVLoneStar That should work, did you try the sketch shown in the topic?

                The function recallEeprom(); reads the EEPROM content and after closing the program mode this function storeEeprom();
                writes the EEPROM. Please add some debug info (Serial.print) and validate that these functions actually are called on

                • recallEeprom(); --> on start up
                • storeEeprom(); --> ending program mode.
                ChakkieC 2 Replies Last reply
                0
                • AnticimexA Anticimex

                  Cool stuff! You probably what some signing in there as well :) would be a shame if someone snooped the open command from your controller and decided to pay a visit.

                  BartEB Offline
                  BartEB Offline
                  BartE
                  Contest Winner
                  wrote on last edited by
                  #16

                  @Anticimex yes your right but when i wrote this sketch signing was not in the released branch.

                  1 Reply Last reply
                  0
                  • Rod MacPhersonR Offline
                    Rod MacPhersonR Offline
                    Rod MacPherson
                    wrote on last edited by
                    #17

                    Nice work. I have yet to pick up an RFID reader to give that part of it a try, but I've modified it a little to have reed sensors for the 2 doors so that I can easily see if the door is open on my phone, and get notifications when the door opens at an unexpected time, like when the controller is set to vacation mode, or at times of night when we would not normally be coming and going.
                    I'll be watching for someone to post up a signing version.

                    Here's my 2 relay, 2 door sensor version.

                    /*
                     RFID Garagedoor opener by Bart Eversdijk
                     Modified to add door sensors by Rod MacPherson
                     
                     This sketch is to open a Garage door with an mifare RIFD-tag 
                      
                      For an Arduino Nano v3
                      Connection wiring :
                        - nrf24l01+ as descibed on the MySensors website
                        - MFRC522 reader/writer MOSI, MISO, SCK, 3.3V and GND as they are on the nrf24101+, but connect RST to pin D7 and connect SDA(SS) to pin D8 
                        - LED with 470ohm resistor between GND and pin A3 
                        - push button between GND and pin D5
                        - 5v relays coil between GND and  pin D4 -> switch pins of the relays should be connected in parallel with your garage door push button. 
                        - second relay for second door on pin D3
                        
                      Features:
                      This project can record up to 18 RFID-"tags"
                      These card IDs are stored in to EEPROM by keeping them next to the RFID reader when the system in program mode. (Slow blinking LED) When a card is accepted as new card the LED will blink fast for a short time.
                      To keep the master-tags (choose your own) next to the RFID reader when pressing the push button. To clear all cards (except the master card) press the push button in program mode for 6 seconds. The LED will now fast blink for a couple of seconds.
                      
                      Your garage your can be opened by keep a registered RFID tag next to the reader or by clicking the open icon on lock node presented by this plugin.
                      By by-passing the alarm node presented by this plug in the RFID will be temporarily disabled.
                      When an incorrect (not registered) RFID tag is scanned the alarm is triggered to detect illegal scan attempts   
                    
                    */
                    
                    #include <SPI.h>
                    #include <MFRC522.h>
                    #include <MySensor.h> 
                    #include <Bounce2.h>
                    
                    #define RF_INIT_DELAY   125
                    #define ONE_SEC         1000
                    #define MAX_CARDS       18
                    #define PROG_WAIT       10
                    #define HEARTBEAT       10
                    #define BAUD            115200
                    
                    /*Pin definitions*/
                    #define LED_PIN         A3
                    #define SECONDRELAY     3
                    #define GARAGEPIN       4
                    #define SWITCH_PIN      5
                    #define RST_PIN         7       //  MFRC 
                    #define SS_PIN          8       //  MFRC 
                    #define DOOR_PIN_L  A0  // Arduino Digital I/O pin for button/reed switch
                    #define DOOR_PIN_R  A1  // Arduino Digital I/O pin for button/reed switch
                    
                    
                    MFRC522      mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance
                    MFRC522::Uid olduid;
                    MFRC522::Uid masterkey = { 10, {0,0,0,0, 0,0,0,0, 0,0 },  0 };
                    
                    byte       countValidCards  = 0;
                    MFRC522::Uid validCards[MAX_CARDS];
                    
                    void       ShowCardData(MFRC522::Uid* uid);
                    bool       sameUid(MFRC522::Uid* old, MFRC522::Uid* check);
                    void       copyUid(MFRC522::Uid* src, MFRC522::Uid* dest);
                    bool       isValidCard(MFRC522::Uid* uid);
                    int        releasecnt = 0;
                    
                    #define    CHILD_ID_ALARM    1
                    #define    CHILD_ID_LOCK     2
                    #define    CHILD_ID_LOCK2    3
                    #define    CHILD_ID_DOOR_L    4
                    #define    CHILD_ID_DOOR_R    5
                    
                    MySensor   gw;
                    Bounce     debouncer = Bounce();
                    Bounce     debouncerDoorR = Bounce();
                    Bounce     debouncerDoorL = Bounce();
                    int oldValueR=-1;
                    int oldValueL=-1;
                    
                    int        oldSwitchValue=-1;
                    int        switchValue = 0;
                    long       timer = -1;
                    bool       programmode = false;
                    bool       ledon;
                    int        programTimer = 0;
                    bool       armed = true;
                    unsigned long lastTime = 0;
                    
                    MyMessage  lockMsg(CHILD_ID_LOCK,          V_LOCK_STATUS);
                    MyMessage  lock2Msg(CHILD_ID_LOCK2,          V_LOCK_STATUS);
                    MyMessage  lockArmMsg(CHILD_ID_ALARM,      V_ARMED);
                    MyMessage  wrongMsg(CHILD_ID_ALARM,        V_TRIPPED);
                    MyMessage  doorRmsg(CHILD_ID_DOOR_R, V_TRIPPED);
                    MyMessage  doorLmsg(CHILD_ID_DOOR_L, V_TRIPPED);
                    
                    void setup() {
                            Serial.begin(BAUD);     // Initialize serial communications with the PC
                            pinMode(GARAGEPIN, OUTPUT);     // Initialise in/output ports
                            pinMode(SECONDRELAY, OUTPUT);     // Initialise in/output ports
                            
                            // Make sure MFRC will be disabled on the SPI bus
                            pinMode(RST_PIN, OUTPUT);     
                            digitalWrite(RST_PIN, LOW);
                            pinMode(SS_PIN, OUTPUT);     
                            digitalWrite(SS_PIN, LOW);
                    
                            pinMode(LED_PIN, OUTPUT);
                            digitalWrite(LED_PIN, LOW);
                            // Setup the button
                            pinMode(SWITCH_PIN, INPUT_PULLUP);
                    
                            // After setting up the button, setup debouncer
                            debouncer.attach(SWITCH_PIN);
                            debouncer.interval(5);
                    
                            // Setup the right door sensor
                            pinMode(DOOR_PIN_R,INPUT);
                            // Activate internal pull-up
                            digitalWrite(DOOR_PIN_R,HIGH);
                      
                            // After setting up the button, setup debouncer
                            debouncerDoorR.attach(DOOR_PIN_R);
                            debouncerDoorR.interval(5);
                            
                            // Setup the left door sensor
                            pinMode(DOOR_PIN_L,INPUT);
                            // Activate internal pull-up
                            digitalWrite(DOOR_PIN_L,HIGH);
                      
                            // After setting up the button, setup debouncer
                            debouncerDoorL.attach(DOOR_PIN_L);
                            debouncerDoorL.interval(5);
                      
                    
                            // Init mysensors library
                            gw.begin(incomingMessage, 5);
                            gw.sendSketchInfo("RFID Garage", "1.2"); delay(RF_INIT_DELAY);
                            
                            // Register all sensors to gw (they will be created as child devices)
                            gw.present(CHILD_ID_LOCK, S_LOCK);      delay(RF_INIT_DELAY);
                            gw.present(CHILD_ID_LOCK2, S_LOCK);      delay(RF_INIT_DELAY);
                            gw.present(CHILD_ID_ALARM, S_MOTION);   delay(RF_INIT_DELAY);
                            gw.present(CHILD_ID_DOOR_R, S_DOOR); 
                            gw.present(CHILD_ID_DOOR_L, S_DOOR); 
                            
                            recallEeprom();
                            
                            // Init MFRC RFID sensor
                            SPI.begin();            // Init SPI bus
                            mfrc522.PCD_Init();     // Init MFRC522
                            ShowReaderDetails();            // Show details of PCD - MFRC522 Card Reader details
                    
                            gw.send(lockArmMsg.set(armed));
                            Serial.println(F("Init done..."));
                    }
                    
                    void loop() {
                            timer++;
                            delay(HEARTBEAT);
                            gw.process();
                            debouncer.update();
                            debouncerDoorL.update();
                            // Get the update value for Left
                            int valueL = debouncerDoorL.read(); 
                            if (valueL != oldValueL) {
                               // Send in the new value for Left
                               gw.send(doorLmsg.set(valueL==HIGH ? 1 : 0));
                               oldValueL = valueL;
                            }
                            debouncerDoorR.update();
                            // Get the update value for Right
                            int valueR = debouncerDoorR.read();
                            if (valueR != oldValueR) {
                               // Send in the new value for Right
                               gw.send(doorRmsg.set(valueR==HIGH ? 1 : 0));
                               oldValueR = valueR;
                            }
                    
                            // Get the update value
                            int switchValue = debouncer.read();
                            if (switchValue != oldSwitchValue) {
                              // Send in the new value
                              Serial.print (F("Switch "));
                              Serial.println (switchValue);
                              
                              if (switchValue && programmode) {
                                   lastTime     = millis() / 1000;
                              }
                              
                              if (!switchValue && programmode && lastTime > 0) {
                                   if ( (millis() / 1000) - lastTime > 3) {
                                        Serial.println(F("Reset all cards"));  
                                        countValidCards  = 0;
                                        blinkFast(50);
                                   } else {
                                      Serial.println(F("Program off"));  
                                      digitalWrite(LED_PIN, LOW);
                                      programmode = false;
                                      
                                      storeEeprom();
                                   }
                              }
                              
                              if (!switchValue)   {
                                  programTimer = 0;
                              }
                              oldSwitchValue = switchValue;
                            }
                            
                            if (programmode && ((timer % (ONE_SEC / HEARTBEAT)) == 0 ))  {
                                ledon = !ledon;
                                digitalWrite(LED_PIN, ledon);
                                programTimer++;
                    
                                // Stop program mode after 20 sec inactivity
                                if (programTimer > PROG_WAIT)  {
                                   programmode = false;
                                   digitalWrite(LED_PIN, false);
                                   Serial.println(F("Program expired"));  
                                }
                            }
                            
                            if ((timer % (200 / HEARTBEAT)) == 0 )   {
                                 // Look for new cards
                                 if ( ! mfrc522.PICC_IsNewCardPresent()) {
                                      if (releasecnt > 0)   {
                                          releasecnt--;
                                          if (!releasecnt)  {
                                              olduid.size = 0;
                                              Serial.println(F("release"));
                                          }
                                        }
                                return;
                                }
                                releasecnt = 5;
                        
                               // Select one of the cards
                               if ( ! mfrc522.PICC_ReadCardSerial()) {
                                  return;
                               }
                        
                               // Dump debug info about the card; PICC_HaltA() is automatically called
                               //mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
                               if (!olduid.size || !sameUid(&(mfrc522.uid), &olduid))  {
                                    ShowCardData(&(mfrc522.uid));
                                    copyUid(&(mfrc522.uid), &olduid);
                                    if ( isValidCard(&olduid) )   {
                                         OpenDoor(programmode);
                                    } else  {
                                       if (sameUid(&(mfrc522.uid), &masterkey)) {
                                           // Only switch in program mode when mastercard is found AND the program button is pressed
                                           if (switchValue)  {
                                             Serial.println(F("Program mode"));
                                             programmode = true;
                                             programTimer = 0;
                                             lastTime     = 0;
                                           } else {
                                             OpenDoor2(programmode);
                                           }
                                       } else {
                                           if (programmode) {
                                             Serial.println(F("new card"));
                                             programTimer = 0;
                                             
                                             if (countValidCards < MAX_CARDS)
                                             {
                                                // Add card to list...
                                                copyUid(&(mfrc522.uid), &validCards[countValidCards]);
                                                countValidCards++;
                                                blinkFast(15);
                                             }
                                           } else {
                                             Serial.println(F("Invalid card"));
                                             if (armed) {
                                                gw.send(wrongMsg.set(1));
                                                delay(2000);
                                                gw.send(wrongMsg.set(0));
                                             }
                                           }
                                       }
                                    }
                               }
                            }
                    }
                    
                    void ShowCardData(MFRC522::Uid* uid) 
                    {
                        Serial.print(F("Card UID:"));
                        for (byte i = 0; i < uid->size; i++) {
                            if(uid->uidByte[i] < 0x10) {
                                Serial.print(F(" 0"));
                            } else {
                                Serial.print(F(" "));
                                    }
                            Serial.print(uid->uidByte[i], HEX);
                        } 
                        Serial.println();
                    }
                    
                    void copyUid(MFRC522::Uid* src, MFRC522::Uid* dest)
                    {
                        dest->size = src->size;
                        dest->sak  = src->sak;
                        
                        for (byte i = 0; i < src->size; i++) {
                        dest->uidByte[i] = src->uidByte[i];
                        }
                    }
                    
                    bool sameUid(MFRC522::Uid* old, MFRC522::Uid* check)
                    {
                        if (old->size != check->size) {
                           return false;
                        }
                        for (byte i = 0; i < old->size; i++) {
                            if (old->uidByte[i] != check->uidByte[i]) {
                                return false;
                            }
                        }
                        return true;
                    }
                    
                    bool isValidCard(MFRC522::Uid* uid)
                    {
                          for (byte i = 0; i < countValidCards; i++)  {
                              if (validCards[i].size != uid->size)  {
                                  break;
                              }
                              for (int j = 0; j < uid->size; j++) {
                                  if (validCards[i].uidByte[j] != uid->uidByte[j])  {
                                      break;
                                  }
                                  if (j == (uid->size - 1)) {  
                                      return true;
                                  }
                              }
                          }
                          return false;
                    }
                    
                    
                    void storeEeprom()
                    {
                        byte address = 0;
                        gw.saveState(address++, countValidCards);
                        
                        for (byte i = 0; i < countValidCards; i++) {
                           gw.saveState(address++, validCards[i].size);
                           for (byte j = 0; j < 10; j++) {
                              gw.saveState(address++, validCards[i].uidByte[j]);
                           } 
                        }
                    }
                    
                    void recallEeprom()
                    {
                        byte address = 0;
                        
                        countValidCards = gw.loadState(address++);
                        if (countValidCards > MAX_CARDS) {
                           Serial.println(F("Not a valid EEPROM reading set to default"));
                           countValidCards = 0;
                           storeEeprom();
                           return;
                        }
                        
                        for (byte i = 0; i < countValidCards; i++)  {
                           validCards[i].size = gw.loadState(address++);
                           for (byte j = 0; j < 10; j++)  {
                              validCards[i].uidByte[j] = gw.loadState(address++);
                           } 
                        }
                      
                    }
                    
                    void blinkFast(int times)
                    {
                        for (int i = 0; i < times; i++) { 
                           ledon = !ledon;
                           digitalWrite(LED_PIN, ledon);
                           delay(100);
                        }
                    }
                    
                    void OpenDoor(bool fakeOpen)
                    {
                        Serial.println(F("Open door!"));
                        gw.send(lockMsg.set(false));
                        
                        if (!fakeOpen) { 
                          digitalWrite(LED_PIN, HIGH);
                          digitalWrite(GARAGEPIN, HIGH); 
                        }
                        delay(1000);
                        
                        if (!fakeOpen) { 
                          digitalWrite(GARAGEPIN, LOW); 
                          digitalWrite(LED_PIN, LOW);
                        }
                        
                        gw.send(lockMsg.set(true));
                    }
                    
                    void OpenDoor2(bool fakeOpen)
                    {
                        Serial.println(F("Open door 2!"));
                        gw.send(lock2Msg.set(false));
                        
                        if (!fakeOpen) { 
                          digitalWrite(LED_PIN, HIGH);
                          digitalWrite(SECONDRELAY, HIGH); 
                        }
                        delay(1000);
                        
                        if (!fakeOpen) { 
                          digitalWrite(SECONDRELAY, LOW); 
                          digitalWrite(LED_PIN, LOW);
                        }
                        
                        gw.send(lock2Msg.set(true));
                    }
                    
                    void ShowReaderDetails() {
                        // Get the MFRC522 software version
                        byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg);
                        Serial.print(F("MFRC522 Software Version: 0x"));
                        Serial.print(v, HEX);
                        if (v == 0x91) {
                            Serial.print(F(" = v1.0"));
                            } else if (v == 0x92) {
                            Serial.print(F(" = v2.0"));
                            } else {
                            Serial.print(F(" (unknown)"));
                            }
                        Serial.println("");
                        
                            // When 0x00 or 0xFF is returned, communication probably failed
                        if ((v == 0x00) || (v == 0xFF)) {
                            Serial.println(F("WARNING: Communication failure, is the MFRC522 properly connected?"));
                        }
                    }
                    
                    
                    void incomingMessage(const MyMessage &message) 
                    {
                       if (message.type == V_LOCK_STATUS) {
                         // Change relay state
                         if (!message.getBool())  {
                            switch (message.sensor)
                            {
                               case CHILD_ID_LOCK:
                                  OpenDoor(false);
                                  break;
                               case CHILD_ID_LOCK2:
                                  OpenDoor2(false);
                                  break;
                            }
                         }
                      
                         // Write some debug info
                         Serial.print(F("Lock:  "));
                         Serial.print(message.sensor);
                         Serial.print(F(" status: "));
                         Serial.println(message.getBool());
                       }
                       else 
                       {
                         if (message.type == V_ARMED)  {
                           // Change relay state
                           armed = message.getBool();
                      
                           // Write some debug info
                           Serial.print(F("Arm status: "));
                           Serial.println(message.getBool());
                         }
                         else
                         {
                           // Write some debug info
                           Serial.print(F("Incoming msg type: "));
                           Serial.print(message.type);
                           Serial.print(F(" id: "));
                           Serial.print(message.sensor);
                           Serial.print(F(" content: "));
                           Serial.println(message.getInt());
                         }
                       }
                    }
                    
                    1 Reply Last reply
                    1
                    • codergirl56C Offline
                      codergirl56C Offline
                      codergirl56
                      wrote on last edited by
                      #18

                      Hi @BartE - thanks for putting this together! It has been very helpful.

                      I am working on a project with two wireless MFRC522 modules and RFID Reader. I want to be able to read PICC cards with the RFID reader and send it the UID between the modules. So essentially a more bare version of the code you have written with the garage door opening code. I was wondering if you could help me out in simplifying the code to just reading the UID off the PICC cards and outputting that date between the RCF522 modules.

                      Thanks in advance.

                      BartEB 1 Reply Last reply
                      0
                      • codergirl56C codergirl56

                        Hi @BartE - thanks for putting this together! It has been very helpful.

                        I am working on a project with two wireless MFRC522 modules and RFID Reader. I want to be able to read PICC cards with the RFID reader and send it the UID between the modules. So essentially a more bare version of the code you have written with the garage door opening code. I was wondering if you could help me out in simplifying the code to just reading the UID off the PICC cards and outputting that date between the RCF522 modules.

                        Thanks in advance.

                        BartEB Offline
                        BartEB Offline
                        BartE
                        Contest Winner
                        wrote on last edited by
                        #19

                        @codergirl56 there are a number of examples in the MFRC522 library which might help you.
                        You can find them here: https://github.com/miguelbalboa/rfid

                        Please feel free to ask questions if the examples does not help you further

                        codergirl56C 1 Reply Last reply
                        0
                        • BartEB BartE

                          @codergirl56 there are a number of examples in the MFRC522 library which might help you.
                          You can find them here: https://github.com/miguelbalboa/rfid

                          Please feel free to ask questions if the examples does not help you further

                          codergirl56C Offline
                          codergirl56C Offline
                          codergirl56
                          wrote on last edited by
                          #20

                          @BartE thanks for getting back to me. I've looked through the examples on the MFRC522 library. I think the main thing I'm struggling with is setting up and initializing the N24L01 module and the RFID on the same arduino uno. My plan is to have one N24L01 and RFID on one arduino module, and a second N24L01 on a second arduino. I want the RFID to read the UID off of PICC cards and be able to wirelessly transmit the UID between the N24L01 modules. I think it's simpler than the code you have written here, but I'm struggling to simplify the code you have to only what I need. Could you possibly walk through what each function in your program is used for? Thanks in advance.

                          BartEB 1 Reply Last reply
                          0
                          • codergirl56C codergirl56

                            @BartE thanks for getting back to me. I've looked through the examples on the MFRC522 library. I think the main thing I'm struggling with is setting up and initializing the N24L01 module and the RFID on the same arduino uno. My plan is to have one N24L01 and RFID on one arduino module, and a second N24L01 on a second arduino. I want the RFID to read the UID off of PICC cards and be able to wirelessly transmit the UID between the N24L01 modules. I think it's simpler than the code you have written here, but I'm struggling to simplify the code you have to only what I need. Could you possibly walk through what each function in your program is used for? Thanks in advance.

                            BartEB Offline
                            BartEB Offline
                            BartE
                            Contest Winner
                            wrote on last edited by
                            #21

                            @codergirl56 Oke i will give it a try:

                            Basic IO pin set up

                            void setup() {
                                    Serial.begin(BAUD);     // Initialize serial communications with the PC
                                    pinMode(GARAGEPIN, OUTPUT);     // Initialise in/output ports
                                    pinMode(SECONDRELAY, OUTPUT);     // Initialise in/output ports
                            

                            This part initializes the SPI I/O pins used by the RFID reader so it release the SPI bus for thr NFR radio

                                    // Make sure MFRC will be disabled on the SPI bus
                                    pinMode(RST_PIN, OUTPUT);     
                                    digitalWrite(RST_PIN, LOW);
                                    pinMode(SS_PIN, OUTPUT);     
                                    digitalWrite(SS_PIN, LOW);
                            

                            Init LED and button I/O-pin

                                    pinMode(LED_PIN, OUTPUT);
                                    digitalWrite(LED_PIN, LOW);
                                    // Setup the button
                                    pinMode(SWITCH_PIN, INPUT_PULLUP);
                            
                                    // After setting up the button, setup debouncer
                                    debouncer.attach(SWITCH_PIN);
                                    debouncer.interval(5);
                            

                            Init radion module

                                    // Init mysensors library
                                    gw.begin(incomingMessage, 5);
                                    gw.sendSketchInfo("RFID Garage", "1.2"); delay(RF_INIT_DELAY);
                                    
                                    // Register all sensors to gw (they will be created as child devices)
                                    gw.present(CHILD_ID_LOCK, S_LOCK);      delay(RF_INIT_DELAY);
                                    gw.present(CHILD_ID_LOCK2, S_LOCK);      delay(RF_INIT_DELAY);
                                    gw.present(CHILD_ID_ALARM, S_MOTION);   delay(RF_INIT_DELAY);
                            

                            Read eeprom settings

                                    recallEeprom();
                            

                            nit SPI bus for MFRC RFID sensor

                                    SPI.begin();            // Init SPI bus
                                    mfrc522.PCD_Init();     // Init MFRC522
                                    ShowReaderDetails();            // Show details of PCD - MFRC522 Card Reader details
                            
                                    gw.send(lockArmMsg.set(armed));
                                    Serial.println(F("Init done..."));
                            }
                            
                            void loop() {
                                    timer++;
                                    delay(HEARTBEAT);
                                    gw.process();
                                    debouncer.update();
                            
                                    // Get the update value
                                    int switchValue = debouncer.read();
                                    if (switchValue != oldSwitchValue) {
                                      // Send in the new value
                                      Serial.print (F("Switch "));
                                      Serial.println (switchValue);
                                      
                                      if (switchValue && programmode) {
                                           lastTime     = millis() / 1000;
                                      }
                                      
                                      if (!switchValue && programmode && lastTime > 0) {
                                           if ( (millis() / 1000) - lastTime > 3) {
                                                Serial.println(F("Reset all cards"));  
                                                countValidCards  = 0;
                                                blinkFast(50);
                                           } else {
                                              Serial.println(F("Program off"));  
                                              digitalWrite(LED_PIN, LOW);
                                              programmode = false;
                                              
                                              storeEeprom();
                                           }
                                      }
                                      
                                      if (!switchValue)   {
                                          programTimer = 0;
                                      }
                                      oldSwitchValue = switchValue;
                                    }
                                    
                                    if (programmode && ((timer % (ONE_SEC / HEARTBEAT)) == 0 ))  {
                                        ledon = !ledon;
                                        digitalWrite(LED_PIN, ledon);
                                        programTimer++;
                            
                                        // Stop program mode after 20 sec inactivity
                                        if (programTimer > PROG_WAIT)  {
                                           programmode = false;
                                           digitalWrite(LED_PIN, false);
                                           Serial.println(F("Program expired"));  
                                        }
                                    }
                                    
                                    if ((timer % (200 / HEARTBEAT)) == 0 )   {
                                         // Look for new cards
                                         if ( ! mfrc522.PICC_IsNewCardPresent()) {
                                              if (releasecnt > 0)   {
                                                  releasecnt--;
                                                  if (!releasecnt)  {
                                                      olduid.size = 0;
                                                      Serial.println(F("release"));
                                                  }
                                                }
                                        return;
                                        }
                                        releasecnt = 5;
                            

                            Check if a RFID card is held at the RFID reader if not: skip the rest and start over with loop()

                                       // Select one of the cards
                                       if ( ! mfrc522.PICC_ReadCardSerial()) {
                                          return;
                                       }
                                
                                       // Dump debug info about the card; PICC_HaltA() is automatically called
                                       //mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
                            

                            Check if this card is the same as the previous loop if not enter the IF loop

                                       if (!olduid.size || !sameUid(&(mfrc522.uid), &olduid))  {
                                            ShowCardData(&(mfrc522.uid));
                                            copyUid(&(mfrc522.uid), &olduid);
                                            if ( isValidCard(&olduid) )   {
                                                 OpenDoor(programmode);
                                            } else  {
                            

                            Check if the master card was presented and the button was pressed enter program mode

                                               if (sameUid(&(mfrc522.uid), &masterkey)) {
                                                   // Only switch in program mode when mastercard is found AND the program button is pressed
                                                   if (switchValue)  {
                                                     Serial.println(F("Program mode"));
                                                     programmode = true;
                                                     programTimer = 0;
                                                     lastTime     = 0;
                                                   } else {
                                                     OpenDoor2(programmode);
                                                   }
                                               } else {
                            

                            If not the master card and this card in not known and we're in program mode add this as a new card

                                                   if (programmode) {
                                                     Serial.println(F("new card"));
                                                     programTimer = 0;
                                                     
                                                     if (countValidCards < MAX_CARDS)
                                                     {
                                                        // Add card to list...
                                                        copyUid(&(mfrc522.uid), &validCards[countValidCards]);
                                                        countValidCards++;
                                                        blinkFast(15);
                                                     }
                                                   } else {
                                                     Serial.println(F("Invalid card"));
                                                     if (armed) {
                                                        gw.send(wrongMsg.set(1));
                                                        delay(2000);
                                                        gw.send(wrongMsg.set(0));
                                                     }
                                                   }
                                               }
                                            }
                                       }
                                    }
                            }
                            

                            These are support functions

                            void ShowCardData(MFRC522::Uid* uid) 
                            {
                                Serial.print(F("Card UID:"));
                                for (byte i = 0; i < uid->size; i++) {
                                    if(uid->uidByte[i] < 0x10) {
                                        Serial.print(F(" 0"));
                                    } else {
                                        Serial.print(F(" "));
                                            }
                                    Serial.print(uid->uidByte[i], HEX);
                                } 
                                Serial.println();
                            }
                            
                            void copyUid(MFRC522::Uid* src, MFRC522::Uid* dest)
                            {
                                dest->size = src->size;
                                dest->sak  = src->sak;
                                
                                for (byte i = 0; i < src->size; i++) {
                                dest->uidByte[i] = src->uidByte[i];
                                }
                            }
                            
                            bool sameUid(MFRC522::Uid* old, MFRC522::Uid* check)
                            {
                                if (old->size != check->size) {
                                   return false;
                                }
                                for (byte i = 0; i < old->size; i++) {
                                    if (old->uidByte[i] != check->uidByte[i]) {
                                        return false;
                                    }
                                }
                                return true;
                            }
                            
                            bool isValidCard(MFRC522::Uid* uid)
                            {
                                  for (byte i = 0; i < countValidCards; i++)  {
                                      if (validCards[i].size != uid->size)  {
                                          break;
                                      }
                                      for (int j = 0; j < uid->size; j++) {
                                          if (validCards[i].uidByte[j] != uid->uidByte[j])  {
                                              break;
                                          }
                                          if (j == (uid->size - 1)) {  
                                              return true;
                                          }
                                      }
                                  }
                                  return false;
                            }
                            
                            
                            void storeEeprom()
                            {
                                byte address = 0;
                                gw.saveState(address++, countValidCards);
                                
                                for (byte i = 0; i < countValidCards; i++) {
                                   gw.saveState(address++, validCards[i].size);
                                   for (byte j = 0; j < 10; j++) {
                                      gw.saveState(address++, validCards[i].uidByte[j]);
                                   } 
                                }
                            }
                            
                            void recallEeprom()
                            {
                                byte address = 0;
                                
                                countValidCards = gw.loadState(address++);
                                if (countValidCards > MAX_CARDS) {
                                   Serial.println(F("Not a valid EEPROM reading set to default"));
                                   countValidCards = 0;
                                   storeEeprom();
                                   return;
                                }
                                
                                for (byte i = 0; i < countValidCards; i++)  {
                                   validCards[i].size = gw.loadState(address++);
                                   for (byte j = 0; j < 10; j++)  {
                                      validCards[i].uidByte[j] = gw.loadState(address++);
                                   } 
                                }
                              
                            }
                            
                            void blinkFast(int times)
                            {
                                for (int i = 0; i < times; i++) { 
                                   ledon = !ledon;
                                   digitalWrite(LED_PIN, ledon);
                                   delay(100);
                                }
                            }
                            
                            void OpenDoor(bool fakeOpen)
                            {
                                Serial.println(F("Open door!"));
                                gw.send(lockMsg.set(false));
                                
                                if (!fakeOpen) { 
                                  digitalWrite(LED_PIN, HIGH);
                                  digitalWrite(GARAGEPIN, HIGH); 
                                }
                                delay(1000);
                                
                                if (!fakeOpen) { 
                                  digitalWrite(GARAGEPIN, LOW); 
                                  digitalWrite(LED_PIN, LOW);
                                }
                                
                                gw.send(lockMsg.set(true));
                            }
                            
                            void OpenDoor2(bool fakeOpen)
                            {
                                Serial.println(F("Open door 2!"));
                                gw.send(lock2Msg.set(false));
                                
                                if (!fakeOpen) { 
                                  digitalWrite(LED_PIN, HIGH);
                                  digitalWrite(SECONDRELAY, HIGH); 
                                }
                                delay(1000);
                                
                                if (!fakeOpen) { 
                                  digitalWrite(SECONDRELAY, LOW); 
                                  digitalWrite(LED_PIN, LOW);
                                }
                                
                                gw.send(lock2Msg.set(true));
                            }
                            
                            void ShowReaderDetails() {
                                // Get the MFRC522 software version
                                byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg);
                                Serial.print(F("MFRC522 Software Version: 0x"));
                                Serial.print(v, HEX);
                                if (v == 0x91) {
                                    Serial.print(F(" = v1.0"));
                                    } else if (v == 0x92) {
                                    Serial.print(F(" = v2.0"));
                                    } else {
                                    Serial.print(F(" (unknown)"));
                                    }
                                Serial.println("");
                                
                                    // When 0x00 or 0xFF is returned, communication probably failed
                                if ((v == 0x00) || (v == 0xFF)) {
                                    Serial.println(F("WARNING: Communication failure, is the MFRC522 properly connected?"));
                                }
                            }
                            
                            
                            void incomingMessage(const MyMessage &message) 
                            {
                               if (message.type == V_LOCK_STATUS) {
                                 // Change relay state
                                 if (!message.getBool())  {
                                    switch (message.sensor)
                                    {
                                       case CHILD_ID_LOCK:
                                          OpenDoor(false);
                                          break;
                                       case CHILD_ID_LOCK2:
                                          OpenDoor2(false);
                                          break;
                                    }
                                 }
                              
                                 // Write some debug info
                                 Serial.print(F("Lock:  "));
                                 Serial.print(message.sensor);
                                 Serial.print(F(" status: "));
                                 Serial.println(message.getBool());
                               }
                               else 
                               {
                                 if (message.type == V_ARMED)  {
                                   // Change relay state
                                   armed = message.getBool();
                              
                                   // Write some debug info
                                   Serial.print(F("Arm status: "));
                                   Serial.println(message.getBool());
                                 }
                                 else
                                 {
                                   // Write some debug info
                                   Serial.print(F("Incoming msg type: "));
                                   Serial.print(message.type);
                                   Serial.print(F(" id: "));
                                   Serial.print(message.sensor);
                                   Serial.print(F(" content: "));
                                   Serial.println(message.getInt());
                                 }
                               }
                            }
                            1 Reply Last reply
                            1
                            • BartEB BartE

                              @SVLoneStar That should work, did you try the sketch shown in the topic?

                              The function recallEeprom(); reads the EEPROM content and after closing the program mode this function storeEeprom();
                              writes the EEPROM. Please add some debug info (Serial.print) and validate that these functions actually are called on

                              • recallEeprom(); --> on start up
                              • storeEeprom(); --> ending program mode.
                              ChakkieC Offline
                              ChakkieC Offline
                              Chakkie
                              wrote on last edited by
                              #22

                              @BartE

                              Hi BartE, I have the same issue regarding tags lost after power off. I run the debug instruction using Serial print as you mentioned. I found out that the storeEeprom line did not run after closing the program mode. I think this is why the tags are lost after power cycle.

                              send: 210-210-0-0 s=255,c=3,t=15,pt=2,l=2,sg=0,st=ok:0
                              send: 210-210-0-0 s=255,c=0,t=17,pt=0,l=5,sg=0,st=ok:1.5.4
                              send: 210-210-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:0
                              read: 0-0-210 s=255,c=3,t=6,pt=0,l=1,sg=0:M
                              sensor started, id=210, parent=0, distance=1
                              send: 210-210-0-0 s=255,c=3,t=11,pt=0,l=9,sg=0,st=ok:RFID Lock
                              send: 210-210-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=ok:1.1
                              send: 210-210-0-0 s=2,c=0,t=19,pt=0,l=0,sg=0,st=ok:
                              send: 210-210-0-0 s=1,c=0,t=1,pt=0,l=0,sg=0,st=ok:
                              RecallEeprom
                              MFRC522 Software Version: 0x92 = v2.0
                              send: 210-210-0-0 s=1,c=1,t=15,pt=2,l=2,sg=0,st=ok:1
                              Init done...
                              Switch 1
                              Card UID: 26 13 80 41
                              Invalid card
                              send: 210-210-0-0 s=1,c=1,t=16,pt=2,l=2,sg=0,st=ok:1
                              send: 210-210-0-0 s=1,c=1,t=16,pt=2,l=2,sg=0,st=ok:0
                              release
                              Card UID: xx xx xx xx
                              Program mode
                              release
                              Card UID: xx xx xx xx
                              new card
                              release
                              Program expired
                              

                              Thanks

                              Raspberry Pi 2
                              Domoticz
                              RFXCOM
                              ZWAVE Aeon stick
                              Coming soon Arduino mysensors GW

                              1 Reply Last reply
                              0
                              • BartEB BartE

                                @SVLoneStar That should work, did you try the sketch shown in the topic?

                                The function recallEeprom(); reads the EEPROM content and after closing the program mode this function storeEeprom();
                                writes the EEPROM. Please add some debug info (Serial.print) and validate that these functions actually are called on

                                • recallEeprom(); --> on start up
                                • storeEeprom(); --> ending program mode.
                                ChakkieC Offline
                                ChakkieC Offline
                                Chakkie
                                wrote on last edited by
                                #23

                                @BartE

                                I've just solved the issue regarding tags lost after power off.

                                Simply add the line "StoreEeprom();" after the program mode function

                                  if (programmode && ((timer % (ONE_SEC / HEARTBEAT)) == 0 ))  {
                                            ledon = !ledon;
                                            digitalWrite(LED_PIN, ledon);
                                            programTimer++;
                                
                                            // Stop program mode after 20 sec inactivity
                                            if (programTimer > PROG_WAIT)  {
                                               programmode = false;
                                               digitalWrite(LED_PIN, false);
                                               Serial.println(F("Program expired"));  
                                
                                               storeEeprom();
                                               Serial.println(F("Store Card to EEPROM"));  ```

                                Raspberry Pi 2
                                Domoticz
                                RFXCOM
                                ZWAVE Aeon stick
                                Coming soon Arduino mysensors GW

                                BartEB 1 Reply Last reply
                                0
                                • ChakkieC Chakkie

                                  @BartE

                                  I've just solved the issue regarding tags lost after power off.

                                  Simply add the line "StoreEeprom();" after the program mode function

                                    if (programmode && ((timer % (ONE_SEC / HEARTBEAT)) == 0 ))  {
                                              ledon = !ledon;
                                              digitalWrite(LED_PIN, ledon);
                                              programTimer++;
                                  
                                              // Stop program mode after 20 sec inactivity
                                              if (programTimer > PROG_WAIT)  {
                                                 programmode = false;
                                                 digitalWrite(LED_PIN, false);
                                                 Serial.println(F("Program expired"));  
                                  
                                                 storeEeprom();
                                                 Serial.println(F("Store Card to EEPROM"));  ```
                                  BartEB Offline
                                  BartEB Offline
                                  BartE
                                  Contest Winner
                                  wrote on last edited by
                                  #24

                                  @Chakkie sorry for the slow response (i was on a pre summer holiday)

                                  Thx for analyzing this report. The fix you did made is not what i meant with program expired.

                                  The idea is that you start program mode by pressing the program button and holding the master card.
                                  And now one can add one or more new RFID cards and when your oke press the program button for a short period to END the program mode and store the new cards.

                                  If you wait too long the program mode will expire and the new cards are NOT stored. Off course you can change this behavior by adding this line as you suggested.

                                  1 Reply Last reply
                                  1
                                  • Michel - ItM Offline
                                    Michel - ItM Offline
                                    Michel - It
                                    wrote on last edited by Michel - It
                                    #25

                                    hello to all guys, I noticed some problems, if the power goes away there is a flaw in the system. I modified the source as needed to me, now you turn the sensor on domoticz when you turn on and off when you turn off. I modified the project to create an alarm homemade I configured via lua script the motion sensors. I mounted on the bell so as to turn on and off when I go out or within the home. thank you all

                                    0_1464953572731_rfidCompreto.jpg 0_1464953579700_rfidmoduloporta-180x180.jpg 0_1464953586849_rfidcentralina-180x180.jpg
                                    0_1464953864460_mysensor nano+radio+rfid_pcb.jpg
                                    0_1464954180603_allarm.jpg

                                    1 Reply Last reply
                                    0
                                    • electromakerE Offline
                                      electromakerE Offline
                                      electromaker
                                      wrote on last edited by
                                      #26

                                      Hi Everyone,
                                      I have tested this code http://etabetastudio.blogspot.it/2016/07/tutorial-lettore-rfid-rc522-arduino-idea.html to test RFID RC-522 with Arduino 2009 and all is ok, also to registred RFID card on EEPROM...
                                      I hope to help uo...bye

                                      1 Reply Last reply
                                      0
                                      • Mercury69M Offline
                                        Mercury69M Offline
                                        Mercury69
                                        wrote on last edited by
                                        #27

                                        Dear All,

                                        I'm a newbie and I found in MySensors website the project for RFID Lock Sensors that use PN532 RFID Reader, but as I already have with me a RC-522 RFID reader, searching on the forum I found this post that I thinked it will suit my case.

                                        I assembled the various hardware parts as described on first post, but when I copied the sketch code in my arduino IDE, I'm not able to get it work.

                                        I get some error message that is not so clear for me.

                                        It's seems the sketch is for a previous version of MySensors Library or Arduino IDE, but I'm not sure of this.

                                        As I use Arduino IDE 1.6.12 that has included MySensors Library 2.0.0, is the Sketch you included in the first post already valid for that setup ?

                                        It' will be possible to have a valid sketch working with new setup or eventually to know how to proceed to make the actual one working ?

                                        Thank you in advance for your attention.

                                        Rod MacPhersonR 1 Reply Last reply
                                        0
                                        • Mercury69M Mercury69

                                          Dear All,

                                          I'm a newbie and I found in MySensors website the project for RFID Lock Sensors that use PN532 RFID Reader, but as I already have with me a RC-522 RFID reader, searching on the forum I found this post that I thinked it will suit my case.

                                          I assembled the various hardware parts as described on first post, but when I copied the sketch code in my arduino IDE, I'm not able to get it work.

                                          I get some error message that is not so clear for me.

                                          It's seems the sketch is for a previous version of MySensors Library or Arduino IDE, but I'm not sure of this.

                                          As I use Arduino IDE 1.6.12 that has included MySensors Library 2.0.0, is the Sketch you included in the first post already valid for that setup ?

                                          It' will be possible to have a valid sketch working with new setup or eventually to know how to proceed to make the actual one working ?

                                          Thank you in advance for your attention.

                                          Rod MacPhersonR Offline
                                          Rod MacPhersonR Offline
                                          Rod MacPherson
                                          wrote on last edited by
                                          #28

                                          @Mercury69
                                          It was written prior to the MySensors 2.0 update.

                                          You can convert pre- 2.0 sketches by following the instructions on https://forum.mysensors.org/topic/4276/converting-a-sketch-from-1-5-x-to-2-0-x

                                          If you need a hand just post here with your question, I'll try to help, but it's really not too bad once you get started. I'm in the process of converting all of my code to 2.0 as well.

                                          Mercury69M 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          12

                                          Online

                                          11.7k

                                          Users

                                          11.2k

                                          Topics

                                          113.1k

                                          Posts


                                          Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • MySensors
                                          • OpenHardware.io
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular