This shows you the differences between two versions of the page.
|
pm:prj2026:alexandru.jipa2803:dacian.pascu [2026/05/22 18:28] dacian.pascu |
pm:prj2026:alexandru.jipa2803:dacian.pascu [2026/05/22 20:40] (current) dacian.pascu |
||
|---|---|---|---|
| Line 33: | Line 33: | ||
| | 1 | Arduino Nano | 1 | Microcontroler principal, 5V logic | | | 1 | Arduino Nano | 1 | Microcontroler principal, 5V logic | | ||
| - | | 2 | Breadboard + modul alimentare MB102 | 1 set | Sursă 5V/3.3V din USB sau jack | | + | | 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 | | | 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 | | | 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, include card și breloc | | + | | 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 | | | 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 | | | 7 | LCD 1602 cu modul I2C (PCF8574) | 1 | Afișaj feedback acces, 5V, I2C | | ||
| Line 53: | Line 53: | ||
| | 3.3V | Alimentare ieșire | Furnizează 3.3V direct către VCC al RC522 și VCC al ESP8266 prin adaptorul de tensiune. | | | 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. | | | GND | Masă comună | Conectează masa comună pentru toate modulele din circuit. | | ||
| - | | D0 / RX | UART recepție | Primește datele seriale de la modulul ESP8266 (răspunsul serverului: permis/refuzat). | | + | | D2 / RX | UART recepție | Primește datele seriale de la modulul ESP8266 (răspunsul serverului: permis/refuzat). | |
| - | | D1 / TX | UART transmisie | Trimite UID-ul cardului RFID citit către modulul ESP8266 pentru verificare pe server. | | + | | 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. | | | 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. | | | D10 | SS / SDA RC522 | Pinul de Slave Select SPI, activează comunicația cu RC522 când este tras la LOW. | | ||
| Line 87: | Line 87: | ||
| | TX | UART transmisie | Trimite răspunsul serverului (permis/refuzat) către pinul RX al Arduino. | | | 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. | | | RX | UART recepție | Primește UID-ul cardului de la Arduino pentru a-l trimite serverului prin WiFi. | | ||
| - | | CH_PD / EN | Enable | Tras la 3.3V permanent pentru a menține modulul ESP8266 activ și funcțional. | | ||
| - | | RST | Reset | Tras la 3.3V pentru funcționare normală, poate fi folosit pentru reset software. | | ||
| - | | GPIO0 | Boot mode | Tras la 3.3V pentru boot în mod normal de operare (nu în mod programare). | | ||
| == LCD 1602 I2C == | == LCD 1602 I2C == | ||
| Line 102: | Line 99: | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| - | ===== Rezultate Obţinute ===== | + | |
| - | ===== Concluzii ===== | + | 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: | ||
| + | - ''twi_start()'' — generează condiția START, așteaptă TWINT | ||
| + | - ''twi_write()'' — încarcă byte-ul în TWDR, pornește transmisia, așteaptă TWINT | ||
| + | - ''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: | ||
| + | |||
| + | - ''AT+CIPSTART'' — deschide conexiune TCP pe portul 80 al serverului | ||
| + | - ''AT+CIPSEND'' — anunță câți bytes urmează | ||
| + | - GET /pm?uid=<uid> HTTP/1.1 — cererea efectivă | ||
| + | - parsează răspunsul după câmpul "verdict": 1 = acces permis, 0 = refuzat | ||
| + | - ''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 ===== | ===== Download ===== | ||
| https://github.com/dacianpascu06/proiect-pm | https://github.com/dacianpascu06/proiect-pm | ||
| - | ===== Jurnal ===== | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| + | |||
| + | * **Pentru LCD și controller:** [[https://web.stanford.edu/class/ee281/handouts/hd44780_lcd_controller_datasheet.pdf|Datasheet HD44780]] | ||
| + | * **Pentru Arduino (ATmega328P):** [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|Datasheet ATmega328P]] | ||
| + | * **Pentru modulul WiFi (ESP8266):** [[https://www.espressif.com/sites/default/files/4a-esp8266_at_instruction_set_en_v1.5.4_0.pdf|ESP8266 AT Instruction Set]] | ||
| + | * **Sursă de inspirație (LCD și controller):** [[https://github.com/Ovidiu22/LCD-1602/blob/main/LCD-1602/src/LCD.c|github repo]] | ||