Ce Face?
Este o descuietoare de usa cu un cititor de RFID tags, care daca a detectat un card care are acces atunci va actiona servo-motor-ul care va deschide zavorul.
Care este scopul lui?
Scopul lui este sa deschida/inchida usa numai oamenilor care au acces.
Care este ideea de la care ati pornit?
Pai la camin eu imi uit mereu cheia si ma gandeam prima data sa fac cu cod pin ca sa nu mai trebuiasca sa imi iau cheia cu mine dar dupa m-am gandit ca aceasta deschizatoare cu un card RFID ar fi mai interesanta si fancy.
De ce credeti ca este util pentru altii si pentru voi?
Este util pentru securitate, adica sa aiba acces sa deschida o camera sau ceva doar anumite persoane care au cardul respectiv.
Cum o sa functioneze mecanismul:
Am inceput sa conectez doar LCD-ul si RFID la placuta Arduino UNO pentru a detecta ce cod are cardul RFID care va avea acces sa intre in cladire sau nu. Deci toate codurile pe care acesta le va scana le va afisa pe ecranul LCD si daca vreau le stochez in baza de date.
#include <LiquidCrystal_I2C.h> #include <SPI.h> #include <MFRC522.h>
LiquidCrystal_I2C.h pentru a interactiona cu un display LCD folosind protocolul I2C.
SPI.h pentru comunicarea SPI (Serial Peripheral Interface).
MFRC522.h pentru a lucra cu cititorul RFID RC522.
#define RST_PIN 9 #define SS_PIN 10 byte readCard[4]; byte a = 0;
RST_PIN și SS_PIN sunt pini pentru comunicarea cu cititorul RFID.
readCard este un array de 4 bytes pentru a stoca UID-ul cardului RFID citit.
a este o variabila pentru a controla pozitia cursorului pe LCD.
LiquidCrystal_I2C lcd(0x27, 16, 2); MFRC522 mfrc522(SS_PIN, RST_PIN);
Obiectul lcd pentru a controla display-ul LCD (adresa I2C 0x27, 16×2 caractere).
Obiectul mfrc522 pentru a controla cititorul RFID.
void setup() { Serial.begin(9600); lcd.init(); lcd.backlight(); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); delay(4); mfrc522.PCD_DumpVersionToSerial(); lcd.setCursor(2, 0); lcd.print("Put your card"); }
Pornim comunicarea seriala.
Initializam LCD-ul si activam iluminarea de fundal.
Asteptam sa fie disponibil portul serial.
Incepem comunicarea SPI.
Initializam cititorul RFID.
Introducem un mic delay pentru stabilizare.
Afisam versiunea cititorului RFID in Serial Monitor.
Setam cursorul LCD-ului si afisam mesajul “Put your card”.
void loop() { if ( ! mfrc522.PICC_IsNewCardPresent()) { return 0; } if ( ! mfrc522.PICC_ReadCardSerial()) { return 0; } lcd.clear(); lcd.setCursor(0, 0); lcd.print("Scanned UID"); a = 0; Serial.println(F("Scanned PICC's UID:")); // Proximity Integrated Circuit Card for ( uint8_t i = 0; i < 4; i++) { // readCard[i] = mfrc522.uid.uidByte[i]; Serial.print(readCard[i], HEX); Serial.print(" "); lcd.setCursor(a, 1); lcd.print(readCard[i], HEX); lcd.print(" "); delay(500); a += 3; } Serial.println(""); mfrc522.PICC_HaltA(); return 1; }
Daca nu este detectat un card nou, functia loop() se termina si reincepe (returneaza 0).
Daca este detectat un card, dar nu poate fi citit, functia loop() se termina si reincepe (returneaza 0).
Daca un card este citit cu succes:
Curatam LCD-ul.
Setam cursorul si afisam mesajul “Scanned UID”.
Resetam variabila a la 0 pentru pozitionarea cursorului pe LCD.
Afisam UID-ul cardului în Serial Monitor si pe LCD:
Iteram prin fiecare byte din UID-ul cardului citit.
Stocam fiecare byte in array-ul readCard.
Afisam byte-ul in hexazecimal in Serial Monitor si pe LCD.
Afisam fiecare byte la o pozitie diferita pe LCD, cu un spatiu intre ele, si adaugam un delay de 500 ms intre afiasri.
Incrementez variabila a pentru a schimba pozitia cursorului pe LCD.
După afisarea completă a UID-ului, opresc comunicatia cu cardul RFID folosind mfrc522.PICC_HaltA().
Functia loop() se termina returnând 1.
Acest cod permite deschiderea si inchiderea unei usi folosind un card RFID specific. LED-urile si buzzer-ul sunt folosite pentru a semnaliza starea corectă sau incorectă a cardului.
#include <Servo.h> #include <LiquidCrystal_I2C.h> #include <SPI.h> #include <MFRC522.h>
Servo.h pentru a controla un servo motor.
LiquidCrystal_I2C.h pentru a interactiona cu un display LCD folosind protocolul I2C.
SPI.h pentru comunicarea SPI (Serial Peripheral Interface).
MFRC522.h pentru a lucra cu cititorul RFID RC522.
#define SS_PIN 10 #define RST_PIN 9 #define CORRECT_LED_PIN 5 #define WRONG_LED_PIN 6 #define BUZZER_PIN 7
SS_PIN și RST_PIN sunt pini pentru comunicarea cu cititorul RFID.
CORRECT_LED_PIN este pinul pentru LED-ul verde (corect).
WRONG_LED_PIN este pinul pentru LED-ul rosu (gresit).
BUZZER_PIN este pinul pentru buzzer (avertizare sonora).
String UID = "4C 35 8D 64"; byte lock = 0;
Aici definim un sir care contine UID-ul cardului RFID autorizat si o variabila lock care indica starea usii (0 pentru deschisa, 1 pentru inchisa).
Servo servo; LiquidCrystal_I2C lcd(0x27, 16, 2); MFRC522 rfid(SS_PIN, RST_PIN);
Obiectul servo pentru a controla servo motorul.
Obiectul lcd pentru a controla display-ul LCD (adresă I2C 0x27, 16×2 caractere).
Obiectul rfid pentru a controla cititorul RFID.
void setup() { Serial.begin(9600); servo.write(0); lcd.init(); lcd.backlight(); servo.attach(3); SPI.begin(); rfid.PCD_Init(); // Set pins 5, 6, and 7 as outputs using DDRD register DDRD |= (1 << DDD5) | (1 << DDD6) | (1 << DDD7); // Ensure LEDs are off initially using PORTD register PORTD &= ~((1 << PORTD5) | (1 << PORTD6) | (1 << PORTD7)); }
Pornim comunicarea seriala.
Setam servo la pozitia 0 grade.
Initializam LCD-ul si activam iluminarea de fundal.
Atasam servo la pinul 3.
Incepem comunicarea SPI.
Initializam cititorul RFID.
Setam pinii pentru LED-uri și buzzer ca output si ii inițializam in starea LOW (oprit).
void loop() { lcd.setCursor(4, 0); lcd.print("Welcome!"); lcd.setCursor(1, 1); lcd.print("Put your card"); if (!rfid.PICC_IsNewCardPresent()) return; if (!rfid.PICC_ReadCardSerial()) return; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Scanning"); Serial.print("NUID tag is :"); String ID = ""; for (byte i = 0; i < rfid.uid.size; i++) { lcd.print("."); ID.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ")); ID.concat(String(rfid.uid.uidByte[i], HEX)); delay(300); } ID.toUpperCase();
Daca nu este detectat un card nou, functia loop() se termina si reincepe.
Daca este detectat un card, il citim.
Afisam un mesaj de “Scanning” pe LCD si construim string-ul ID din UID-ul cardului detectat.
if (ID.substring(1) == UID && lock == 0) { servo.write(0); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Door is locked"); // Turn on correct LED and turn off wrong LED using PORTD register PORTD |= (1 << PORTD5); // Turn on CORRECT_LED_PIN PORTD &= ~(1 << PORTD6); // Turn off WRONG_LED_PIN delay(1500); lcd.clear(); lock = 1; PORTD &= ~(1 << PORTD5); // Turn off CORRECT_LED_PIN } else if (ID.substring(1) == UID && lock == 1) { servo.write(180); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Door is open"); // Turn on correct LED and turn off wrong LED using PORTD register PORTD |= (1 << PORTD5); // Turn on CORRECT_LED_PIN PORTD &= ~(1 << PORTD6); // Turn off WRONG_LED_PIN delay(1500); lcd.clear(); lock = 0; PORTD &= ~(1 << PORTD5); // Turn off CORRECT_LED_PIN } else { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wrong card!"); // Turn off correct LED and turn on wrong LED using PORTD register PORTD &= ~(1 << PORTD5); // Turn off CORRECT_LED_PIN PORTD |= (1 << PORTD6); // Turn on WRONG_LED_PIN tone(BUZZER_PIN, 1000); delay(1500); noTone(BUZZER_PIN); lcd.clear(); PORTD &= ~(1 << PORTD6); // Turn off WRONG_LED_PIN } }
Daca UID-ul cardului citit corespunde cu UID si usa este deschisa (lock == 0), inchidem usa (servo la 0 grade), aprindem LED-ul verde, asteptam 1.5 secunde, actualizam lock la 1 (usa inchisa) si stingem LED-ul verde.
Daca UID-ul cardului corespunde cu UID si usa este inchisa (lock == 1), deschidem usa (servo la 180 grade), aprindem LED-ul verde, asteptam 1.5 secunde, actualizam lock la 0 (usa deschisa) si stingem LED-ul verde.
Daca UID-ul cardului nu corespunde, afisam un mesaj de eroare pe LCD, aprindem LED-ul rosu si activam buzzer-ul pentru 1.5 secunde, dupa care stingem LED-ul rosu si buzzer-ul.
Mi-a placut tare mult sa lucrez la acest proiect singurul regret pe care il am este ca am un motor cam slabut si nu poate sa traga de zavor, puteam sa iau o broasca automata in loc sa fac cu servo si cu zavor si cel mai mare regret este ca nu am facut un proiect mai complex, de la ideea initiala am mai incercat sa aduc modificari dar nu foarte complexe. In rest a fost super fain