Table of Contents

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:

Descriere generală

Sistemul este compus din cinci blocuri principale:

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

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

Download

https://github.com/dacianpascu06/proiect-pm

Bibliografie/Resurse