Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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]]
pm/prj2026/alexandru.jipa2803/dacian.pascu.1779463704.txt.gz · Last modified: 2026/05/22 18:28 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