// Source : http://tronixstuff.com/2013/11/19/arduino-tutorials-chapter-15-rfid/ // with just a mod to print the tag nb before "Accepted"/"Rejected" #include #include #include //Pin definitions #define RED_LED 12 #define GREEN_LED 13 #define RFID_RX 2 #define RFID_TX 3 #define PROG_BUTTON 4 #define SERVO_CTRL 5 // Others parameters #define SERVO_SPEED 2 #define SERVO_PWR_TIME 500 //time to stop powering servomotor after the end of move #define DOOR_OPENED_TIME 3000 #define EMPTY_TAG {0,0,0,0,0,0,0,0,0,0,0,0,0,0} #define UNWRITTEN_TAG {255,255,255,255,255,255,255,255,255,255,255,255,255,255} //Globals declarations SoftwareSerial RFID(RFID_RX, RFID_TX); // RX and TX Servo door_servo; int data1 = 0; int tag_ok = -1; byte servo_pos = 180; bool door_state = 0; // door opened ? bool door_move = false; // door moving ? long door_timer = 0; // timer to close the door long servo_timer = 0; //timer to stop powering servomotor long red_led_timer = 0; byte tag1[14] = {2,52,54,48,48,57,49,48,57,56,48,53,69,3}; byte newtag[14] = EMPTY_TAG; // used for read comparisons const byte emptytag[14] = EMPTY_TAG; const byte unwrittentag[14] = UNWRITTEN_TAG; byte * readeepromtag(short tagnb=0) { // Read the n-th RFID tag in EEPROM //First check if the # of tag is out of the capacity of EEPROM //Return an null tag if so. if ((tagnb+1)*14 > EEPROM.length()) { Serial.print(F("Error: Tag Nb to high : ")); Serial.println(tagnb); byte tag[14] = EMPTY_TAG; return tag; } byte tag[14] = EMPTY_TAG; for (int i=0; i<14; i++) { tag[i]=EEPROM.read(i + tagnb*14); delay(2); //small delay to avoid misreading } return tag; } int maxeepromtags() { // Return maximum number of tag that can be stored in EEPROM return EEPROM.length() / 14; } boolean comparetag(byte taga[14], byte tagb[14]) { // Compare two RFID tag int x = 0; for (int i = 0 ; i < 14 ; i++) { if (taga[i] == tagb[i]) x++; } return (x == 14); } int findtag(byte searchtag[14]) { //Find a given tag in EEPROM byte *tag; for (int i=0; i < maxeepromtags(); i++) { tag = readeepromtag(i); if (comparetag(tag, searchtag)) return i; } return -1; } void setup() { // start serial to PC Serial.begin(115200); // start serial to RFID reader RFID.begin(9600); // empty the data cache while (RFID.available()) { RFID.read(); } //attaches servo door_servo.attach(SERVO_CTRL); // for status LEDs pinMode(GREEN_LED, OUTPUT); pinMode(RED_LED, OUTPUT); //Mode for button and end-stop pinMode(PROG_BUTTON, INPUT_PULLUP); Serial.print(F("EEPROM length : ")); Serial.print(EEPROM.length()); Serial.print(F(" bytes (")); Serial.print(maxeepromtags()); Serial.println(F(" tags)")); Serial.println(findtag(newtag)); Serial.println(findtag(unwrittentag)); for(byte n=0; n0) break; } // now do something based on tag type if (tag_ok > 0) tagOK(); else tagNoOK(); // empty the data cache while (RFID.available()) { RFID.read(); } } void disableServo() { //Disable servomotor once they stop moving if (!door_move and servo_timer < millis() and door_servo.attached()) { door_servo.detach(); Serial.println(F("Servo disabled")); } } void updateDoor() { //Check if the need to move and move it //Apply door status if (door_state) { digitalWrite(GREEN_LED, HIGH); digitalWrite(RED_LED, LOW); if (servo_pos >= 180) { //if door has to be open and already open, disable servomotor disableServo(); if (door_move) { Serial.println(F("Door : opened")); door_timer = millis() + DOOR_OPENED_TIME; servo_timer = millis() + SERVO_PWR_TIME; door_move = false; } } else { //Keep opening the door door_move = true; servo_pos += SERVO_SPEED; door_servo.attach(SERVO_CTRL); door_servo.write(servo_pos); Serial.print(F("Door : opening ")); Serial.println(servo_pos); } //Check opened-door timer if (millis() < door_timer) { Serial.print(F("Door timer :")); Serial.println(door_timer - millis()); } else if (!door_move) { door_state = 0; } } else { digitalWrite(GREEN_LED, LOW); if (servo_pos <= 0) { //if door has to be open and already open, disable servomotor disableServo(); if (door_move) { Serial.println(F("Door : closed")); digitalWrite(RED_LED, LOW); servo_timer = millis() + SERVO_PWR_TIME; door_move = false; } } else { //Keep closing the door door_move = true; servo_pos -= SERVO_SPEED; door_servo.attach(SERVO_CTRL); door_servo.write(servo_pos); Serial.print(F("Door : closing ")); Serial.println(servo_pos); } } } void updateRedLED() { //Check the redLED timer and turn ON or OFF the LED if (millis() < red_led_timer) { digitalWrite(RED_LED, HIGH); Serial.print(F("Red LED timer : ")); Serial.println(red_led_timer - millis()); } else digitalWrite(RED_LED, LOW); } void addNewTag(byte tag[14]) { Serial.print(F("Adding new tag to EEPROM : ")); for (int z = 0; z < 14 ; z++) Serial.print(tag[z]); } void delTag(byte tag[14]) { Serial.print(F("Deleting tag from EEPROM : ")); for (int z = 0; z < 14 ; z++) Serial.print(tag[z]); } void loop() { tag_ok = -1; if (RFID.available() > 0 and !door_state ) readRFID(); updateDoor(); updateRedLED(); delay(10); }