This is an old revision of the document!
Autor: Enciu Cezar-Andrei, grupa 332CA
Asistent: Bianca Popa
Reflex Analyzer este un sistem embedded pentru masurarea precisa a timpului de reactie uman. Placa ESP32 DevKit V1 primeste o comanda de start dintr-o aplicatie desktop (sau prin WiFi), genereaza un interval de asteptare pseudo-aleator intre 1 si 4 secunde, dupa care emite simultan un semnal sonor (buzzer) si unul luminos (LED). La apasarea butonului de catre utilizator, cronometrul se opreste, iar rezultatul — exprimat in milisecunde — este trimis aplicatiei prin USB-Serial. Display-ul LCD 2004 I2C afiseaza starea sistemului in timp real. Aplicatia centralizeaza rezultatele si prezinta statistici: medie, minim, maxim si un grafic al evolutiei pe sesiune.
Crearea unui instrument simplu, precis si portabil care sa masoare obiectiv reflexele unui utilizator si sa permita urmarirea progresului in timp, cu o precizie superioara aplicatiilor software pure.
Microcontrollerul ESP32 DevKit V1 cronometreaza timpul de reactie folosind functia millis() cu rezolutie de 1ms, activata in momentul emiterii semnalului si oprita prin intreruperea pe GPIO4 la apasarea butonului. Rezultatul este trimis prin USB-Serial (115200 baud) catre o aplicatie desktop Python + PyQt5. Un display LCD 2004 I2C (0x27) ofera feedback local in timp real. Buzzer-ul pasiv este controlat prin modulul LEDC (PWM hardware) al ESP32.
Schema bloc a sistemului:
Fluxul de date pe scurt:
| Componenta | Cantitate | Rol |
|---|---|---|
| ESP32 DevKit V1 (38 pini) | 1 | Microcontroller principal cu WiFi/BT integrat |
| LED rosu 5mm | 1 | Stimul vizual de start |
| Rezistor 220 Ohm | 1 | Limitare curent LED |
| Buzzer pasiv | 1 | Stimul sonor de start, controlat prin PWM (LEDC) |
| Buton tactil 12x12mm | 1 | Input reactie utilizator |
| Display LCD 2004 I2C | 1 | Afisare stare sistem si timp de reactie (20×4 caractere) |
| Breadboard 830 puncte | 1 | Prototipare circuit |
| Fire jumper M-M | 1 set | Conexiuni intre componente |
| Cablu micro-USB | 1 | Programare + alimentare ESP32 |
| Pin ESP32 | Componenta |
|---|---|
| GPIO5 | Anod LED rosu (prin rezistor 220 Ohm la GND) |
| GPIO18 | Buzzer pasiv + pin (semnal PWM prin LEDC) |
| GPIO4 | Buton tactil (INPUT_PULLUP, cealalta latura la GND) |
| GPIO21 / SDA | SDA display LCD 2004 I2C |
| GPIO22 / SCL | SCL display LCD 2004 I2C |
| VIN (5V) | VCC display LCD 2004 I2C |
| GND | GND comun (LED, Buzzer, Buton, LCD) |
Nota: ESP32 lucreaza la 3.3V logic. LCD-ul necesita VCC 5V (pin VIN), dar semnalele I2C (SDA/SCL) la 3.3V sunt compatibile cu modulul I2C PCF8574 de pe LCD.
| Librarie | Sursa | Rol |
|---|---|---|
| Wire.h | Arduino built-in | Comunicare I2C (SDA/SCL) |
| LiquidCrystal_I2C | Library Manager | Control display LCD 2004 I2C |
| Arduino ESP32 LEDC | ESP32 built-in | PWM hardware pentru buzzer |
| attachInterrupt() | Arduino built-in | Intrerupere GPIO4 pentru buton |
| Librarie | Rol |
|---|---|
| pyserial | Comunicare seriala cu ESP32 prin USB |
| PyQt5 | Interfata grafica (ferestre, butoane, tabele) |
| matplotlib | Grafic evolutie timp de reactie pe sesiune |
| csv | Export rezultate in format CSV |
Sistemul functioneaza pe baza unui automat cu 5 stari. La primirea comenzii START pe Serial, se genereaza un delay aleator (random 1-4s). Dupa expirarea delay-ului, LED-ul si buzzer-ul sunt activate simultan, millis() salveaza momentul semnalului. Intreruperea pe GPIO4 (buton) opreste cronometrul si calculeaza timpul de reactie. Daca butonul e apasat inainte de semnal, se detecteaza false start si se emite avertisment sonor (3 beep-uri scurte).
Sistemul are 5 stari:
| Comanda | Directie | Efect |
|---|---|---|
| START | PC → ESP32 | Porneste o runda noua |
| RESET | PC → ESP32 | Reseteaza in starea IDLE |
| RESULT:<ms> | ESP32 → PC | Trimite timpul de reactie in ms |
| FALSE_START | ESP32 → PC | Semnaleaza false start |
| STATE:<stare> | ESP32 → PC | Notifica schimbarea starii curente |
Interfata grafica ofera butoanele Start proba, Stop sesiune si Export CSV. Comunicarea seriala ruleaza pe un thread separat pentru a nu bloca UI-ul. La fiecare proba finalizata, aplicatia adauga rezultatul in tabel, actualizeaza statisticile (medie, minim, maxim) si graficul matplotlib.
| Data | Activitate |
|---|---|
| 2026-05-05 | Alegerea temei, documentare ESP32 DevKit V1 |
| 2026-05-07 | Achizitie componente |
| 2026-05-09 | Montaj breadboard, testare Serial |
| 2026-05-11 | Implementare FSM, masurare timp de reactie cu millis() |
| 2026-05-13 | Implementare PWM buzzer (LEDC) + LED, testare false start |
| 2026-05-15 | Implementare driver LCD 2004 I2C, integrare FSM complet |
| 2026-05-17 | Scriere aplicatie Python + PyQt5, grafic matplotlib |
| 2026-05-19 | Testare end-to-end, debugging |
| 2026-05-21 | Documentatie OCW, scheme, poze montaj final |