SmartDoor

Introducere

SmartDoor este un sistem de control al accesului bazat pe carduri RFID. La scanarea unui card, Arduino Nano interoghează un server prin WiFi pentru a verifica dacă accesul este permis, afișează rezultatul pe un ecran LCD și trimite un log cu fiecare tentativă către server.

Utilitatea proiectului constă în:

  • securizarea ușilor fără chei tradiționale
  • feedback vizual imediat prin ecranul LCD (“Access Granted” / “Access Denied”)
  • înregistrarea automată a fiecărei tentative de acces (reușite sau nu)
  • posibilitatea de a revoca accesul unui card direct din baza de date, fără intervenție fizică

Descriere generală

Sistemul este compus din cinci blocuri principale:

  • Bloc de citire — Modulul RC522 citește UID-ul cardului RFID prezentat și îl trimite către Arduino Nano prin interfața SPI (prin intermediul level shifter-ului bidirecțional, deoarece RC522 lucrează la 3.3V iar Arduino la 5V).
  • Bloc de control — Arduino Nano primește UID-ul, îl formatează și îl transmite modulului ESP8266 prin comunicație serială UART (prin intermediul unui adaptor de tensiune 5V→3.3V).
  • Bloc de comunicație WiFi — ESP8266 ESP-01 se conectează la rețeaua WiFi și trimite o cerere HTTP către serverul de backend cu UID-ul cardului. Primește răspunsul (permis/refuzat) și îl transmite înapoi la Arduino.
  • Bloc de afișare — LCD 1602 cu modul I2C afișează mesajul corespunzător răspunsului primit: “Access Granted” sau “Access Denied”.
  • Bloc de alimentare — Modulul MB102 montat pe breadboard furnizează 5V pentru Arduino și LCD, respectiv 3.3V (prin adaptoare) pentru modulele ESP și RFID.

Schema bloc vizuală este prezentată mai jos.

Schemă bloc hardware SmartDoor

Hardware Design

Listă de piese:

1 Arduino Nano 1 Microcontroler principal, 5V logic
2 Breadboard + modul alimentare MB102 1 Sursă 5V/3.3V din USB sau jack
3 Modul WiFi ESP8266 ESP-01 1 UART la 3.3V
4 Adaptor 5V→3.3V pentru ESP8266 (4-pin) 1 Conversie nivel UART + alimentare 3.3V
5 Kit cititor RFID RC522 1 SPI la 3.3V
6 Level shifter 8 canale bidirecțional (5V↔3.3V) 1 Conversie logică SPI Arduino↔RC522
7 LCD 1602 cu modul I2C (PCF8574) 1 Afișaj feedback acces, 5V, I2C
8 Cabluri jumper ~25 M-M și M-F

Schema Electrica

Schemă Electrica SmartDoor

Descriere Pini

Arduino Nano
Pin Utilizare Descriere
VIN Alimentare intrare Primește tensiunea de 9V de la baterie pentru a alimenta întregul sistem prin regulatorul intern al Nano.
5V Alimentare ieșire Furnizează 5V către side-ul B al level shifter-ului, LCD și linia de alimentare a breadboard-ului.
3.3V Alimentare ieșire Furnizează 3.3V direct către VCC al RC522 și VCC al ESP8266 prin adaptorul de tensiune.
GND Masă comună Conectează masa comună pentru toate modulele din circuit.
D2 / RX UART recepție Primește datele seriale de la modulul ESP8266 (răspunsul serverului: permis/refuzat).
D3 / TX UART transmisie Trimite UID-ul cardului RFID citit către modulul ESP8266 pentru verificare pe server.
D9 RST RC522 Controlează pinul de reset al modulului RC522 pentru inițializarea și repornirea cititorului RFID.
D10 SS / SDA RC522 Pinul de Slave Select SPI, activează comunicația cu RC522 când este tras la LOW.
D11 / MOSI SPI date ieșire Transmite datele de comandă de la Arduino către RC522 prin protocolul SPI.
D12 / MISO SPI date intrare Primește datele citite de RC522 (UID card) înapoi la Arduino prin protocolul SPI.
D13 / SCK SPI clock Generează semnalul de clock pentru sincronizarea comunicației SPI cu RC522.
A4 / SDA I2C date LCD Linia de date I2C pentru trimiterea caracterelor și comenzilor către LCD 1602.
A5 / SCL I2C clock LCD Generează semnalul de clock I2C pentru sincronizarea comunicației cu LCD 1602.
RFID RC522
Pin Utilizare Descriere
VCC Alimentare 3.3V Primește 3.3V de la pinul 3.3V al Arduino prin side-ul A al level shifter-ului.
GND Masă Conectat la masa comună a circuitului.
SDA (SS) Chip Select SPI Activează modulul RC522 pentru comunicație atunci când Arduino îl selectează.
SCK Clock SPI Primește semnalul de clock SPI de la Arduino prin level shifter.
MOSI Date intrare SPI Primește comenzi și date de la Arduino prin level shifter.
MISO Date ieșire SPI Trimite UID-ul cardului citit înapoi către Arduino prin level shifter.
RST Reset Permite Arduino să reseteze și să reinițializeze modulul RC522 când e necesar.
Waveshare Level Shifter 8 Canale
Pin Utilizare Descriere
VCCA Alimentare 3.3V (side A) Referința de tensiune pentru side-ul de 3.3V, conectat la pinul 3.3V al Arduino.
VCCB Alimentare 5V (side B) Referința de tensiune pentru side-ul de 5V, conectat la pinul 5V al Arduino.
GND Masă Masă comună pentru ambele side-uri ale convertoarelor de nivel logic.
A0-A4 Side 3.3V → RC522 Pinii de 3.3V conectați direct la RC522 (SCK, MOSI, MISO, SS, RST).
B0-B4 Side 5V → Arduino Pinii de 5V conectați la Arduino (D13, D11, D12, D10, D9), realizând conversia bidirecțională.
ESP8266 ESP-01
Pin Utilizare Descriere
VCC Alimentare 3.3V Primește 3.3V prin adaptorul de tensiune dedicat ESP8266.
GND Masă Conectat la masa comună a circuitului.
TX UART transmisie Trimite răspunsul serverului (permis/refuzat) către pinul RX al Arduino.
RX UART recepție Primește UID-ul cardului de la Arduino pentru a-l trimite serverului prin WiFi.
LCD 1602 I2C
Pin Utilizare Descriere
VCC Alimentare 5V Primește 5V de pe linia de alimentare a breadboard-ului pentru a alimenta ecranul.
GND Masă Conectat la masa comună a circuitului.
SDA I2C date Primește datele de la Arduino (A4) pentru a afișa mesajele “Access Granted” / “Access Denied”.
SCL I2C clock Primește semnalul de clock I2C de la Arduino (A5) pentru sincronizarea comunicației.

Poza Proiect

Poza Proiect SmartDoor

Software Design

Codul combina librării Arduino (MFRC522, SoftwareSerial) cu cod bare-metal AVR scris de mână pentru TWI și LCD.

Structura proiectului

  • twi.c / twi.h — driver I2C bare-metal
  • lcd.c / lcd.h — driver LCD 1602 peste PCF8574, mod 4-bit
  • main.cpp — logica principală: RFID, WiFi, heartbeat, afisare

Driverul TWI (I2C)

Am implementat comunicația I2C direct pe registrele ATmega328P.

Fiecare tranzacție urmează secvența clasică I2C:

  1. twi_start() — generează condiția START, așteaptă TWINT
  2. twi_write() — încarcă byte-ul în TWDR, pornește transmisia, așteaptă TWINT
  3. twi_stop() — generează condiția STOP, așteaptă ca TWSTO să se reseteze singur

Driverul LCD

LCD-ul comunică prin PCF8574, un expander I2C de 8 biți. Asta înseamnă că un singur byte trimis prin I2C controlează simultan RS, EN, backlight și pinii D4-D7 ai HD44780.

Display-ul lucrează în modul 4-bit, deci fiecare comandă sau caracter se trimite în două etape — nibble-ul de sus primul, apoi cel de jos. Pentru fiecare nibble se pulsează pinul EN ca HD44780 sa captureze datele.

Logica principală

Heartbeat

Am folosit Timer1 în mod CTC cu prescaler 1024 și OCR1A = 15624, ceea ce generează o întrerupere la fiecare secundă. O data la 90 de secunde resetam flagul triggerHeartbeat.

La fiecare 90 de secunde, Arduino verifică dacă serverul este în viață printr-un GET /alive. Dacă serverul răspunde cu 200 OK e bine. Dacă WiFi-ul a căzut între timp, încearcă reconectarea înainte să trimită heartbeat-ul.

Citirea cardului RFID

Librăria MFRC522 comunică cu cititorul RC522 prin SPI. PICC_IsNewCardPresent() și PICC_ReadCardSerial() sunt apelate continuu în loop. Când un card e detectat, UID-ul (de obicei 4 bytes) e formatat ca string hex (ex. A3 4F 12 BC) pentru afișare pe LCD și concatenat fără spații pentru cererea HTTP.

Comunicația cu serverul

ESP8266 ESP-01 e controlat prin comenzi AT pe un SoftwareSerial pe pinii D2/D3. Fluxul pentru o verificare de card este:

  1. AT+CIPSTART — deschide conexiune TCP pe portul 80 al serverului
  2. AT+CIPSEND — anunță câți bytes urmează
  3. GET /pm?uid=<uid> HTTP/1.1 — cererea efectivă
  4. parsează răspunsul după câmpul “verdict”: 1 = acces permis, 0 = refuzat
  5. AT+CIPCLOSE — închide conexiunea

Răspunsul e afișat pe LCD: “WELCOME!” sau “DENIED ENTRY!” timp de 2 secunde, după care ecranul revine la “Ready to scan!”.

Biblioteci folosite

  • MFRC522 — comunicație SPI cu cititorul RFID
  • SoftwareSerial — UART software pentru ESP8266 pe D2/D3
  • SPI (Arduino built-in) — bus SPI hardware pentru RC522
  • avr/interrupt.h — macro-uri ISR și sei()/cli() pentru Timer1
  • util/delay.h — delay-uri precise în µs/ms pentru protocolul LCD

Download

Bibliografie/Resurse

pm/prj2026/alexandru.jipa2803/dacian.pascu.txt · Last modified: 2026/05/22 20:40 by dacian.pascu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0