Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Arduino Door Lock Access Control Project
- *
- * by Dejan Nedelkovski, www.HowToMechatronics.com
- *
- * Library: MFRC522, https://github.com/miguelbalboa/rfid
- */
- #include <SPI.h>
- #include <MFRC522.h>
- #include <LiquidCrystal_I2C.h>
- #include <Servo.h>
- #define RST_PIN 9
- #define SS_PIN 10
- byte readCard[4];
- char* myTags[100] = {};
- int tagsCount = 0;
- String tagID = "";
- boolean successRead = false;
- boolean correctTag = false;
- int proximitySensor;
- boolean doorOpened = false;
- // Create instances
- MFRC522 mfrc522(SS_PIN, RST_PIN);
- LiquidCrystal_I2C lcd(0x3F,16,2);
- Servo myServo; // Servo motor
- void setup() {
- // Initiating
- SPI.begin(); // SPI bus
- mfrc522.PCD_Init(); // MFRC522
- lcd.init(); // LCD screen
- lcd.backlight();
- myServo.attach(8); // Servo motor
- myServo.write(10); // Initial lock position of the servo motor
- // Prints the initial message
- lcd.print(" -zadny CIPy-");
- lcd.setCursor(0, 1);
- lcd.print(" naskenuj ");
- // Waits until a master card is scanned
- while (!successRead) {
- successRead = getID();
- if ( successRead == true) {
- myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print("VIP CIP nastaven");
- tagsCount++;
- }
- }
- successRead = false;
- printNormalModeMessage();
- }
- void loop() {
- int proximitySensor = analogRead(A0);
- // If door is closed...
- if (proximitySensor > 200) {
- if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
- return;
- }
- if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
- return;
- }
- tagID = "";
- // The MIFARE PICCs that we use have 4 byte UID
- for ( uint8_t i = 0; i < 4; i++) { //
- readCard[i] = mfrc522.uid.uidByte[i];
- tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
- }
- tagID.toUpperCase();
- mfrc522.PICC_HaltA(); // Stop reading
- correctTag = false;
- // Checks whether the scanned tag is the master tag
- if (tagID == myTags[0]) {
- lcd.clear();
- lcd.print("Nastaveni:");
- lcd.setCursor(0, 1);
- lcd.print("Pridat/odebrat ");
- while (!successRead) {
- successRead = getID();
- if ( successRead == true) {
- for (int i = 0; i < 100; i++) {
- if (tagID == myTags[i]) {
- myTags[i] = "";
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print(" Odebrano ");
- printNormalModeMessage();
- return;
- }
- }
- myTags[tagsCount] = strdup(tagID.c_str());
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print(" Pridano ");
- printNormalModeMessage();
- tagsCount++;
- return;
- }
- }
- }
- successRead = false;
- // Checks whether the scanned tag is authorized
- for (int i = 0; i < 100; i++) {
- if (tagID == myTags[i]) {
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print(" Vstup POVOLEN!");
- myServo.write(170); // Unlocks the door
- printNormalModeMessage();
- correctTag = true;
- }
- }
- if (correctTag == false) {
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print("Vstup ZAKAZAN");
- printNormalModeMessage();
- }
- }
- // If door is open...
- else {
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print("DVERE OTEVRENY");
- while (!doorOpened) {
- proximitySensor = analogRead(A0);
- if (proximitySensor > 200) {
- doorOpened = true;
- }
- }
- doorOpened = false;
- delay(500);
- myServo.write(10); // Locks the door
- printNormalModeMessage();
- }
- }
- uint8_t getID() {
- // Getting ready for Reading PICCs
- if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
- return 0;
- }
- if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
- return 0;
- }
- tagID = "";
- for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
- readCard[i] = mfrc522.uid.uidByte[i];
- tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
- }
- tagID.toUpperCase();
- mfrc522.PICC_HaltA(); // Stop reading
- return 1;
- }
- void printNormalModeMessage() {
- delay(1500);
- lcd.clear();
- lcd.print("-Rizeni VSTUPU-");
- lcd.setCursor(0, 1);
- lcd.print(" Naskenuj CIP");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement