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 comanda de start prin USB-Serial, genereaza un interval de asteptare pseudo-aleator intre 1 si 4 secunde, dupa care emite simultan un semnal sonor prin buzzer si un semnal luminos prin LED. La apasarea butonului de catre utilizator, cronometrul se opreste, iar rezultatul — exprimat in milisecunde — este afisat pe display-ul LCD 2004 I2C si transmis in Monitorul Serial.
Sistemul functioneaza independent, fara aplicatie desktop externa, folosind doar firmware-ul incarcat pe ESP32 si componentele hardware conectate.
Crearea unui instrument simplu, precis si portabil care sa masoare obiectiv reflexele unui utilizator, folosind componente hardware accesibile si o implementare embedded bazata pe ESP32.
Microcontrollerul ESP32 DevKit V1 cronometreaza timpul de reactie folosind functia millis() cu rezolutie de 1ms. Cronometrul porneste in momentul activarii semnalului luminos si sonor, iar oprirea se face prin intreruperea de pe GPIO4, declansata la apasarea butonului.
Rezultatul este afisat local pe display-ul LCD 2004 I2C (0x27) si este transmis prin USB-Serial (115200 baud) pentru debugging si verificare. Buzzer-ul pasiv este controlat prin modulul LEDC (PWM hardware) al ESP32.
Schema bloc a sistemului:
Fluxul de functionare 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 |
| GPIO18 | Buzzer pasiv + pin, semnal PWM prin LEDC |
| GPIO4 | Buton tactil, configurat 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 pentru LED, buzzer, buton si LCD |
Nota: ESP32 lucreaza la 3.3V logic. LCD-ul este alimentat din VIN/5V, iar comunicatia I2C se face prin liniile SDA si SCL. Modulul I2C al LCD-ului foloseste de obicei adresa 0x27, dar unele module pot folosi 0x3F.
| Librarie | Sursa | Rol |
|---|---|---|
| Wire.h | Arduino built-in | Comunicare I2C intre ESP32 si LCD |
| LiquidCrystal_I2C | Library Manager | Control display LCD 2004 I2C |
| Arduino ESP32 LEDC | ESP32 built-in | Generare PWM hardware pentru buzzer |
| attachInterrupt() | Arduino built-in | Intrerupere pe GPIO4 pentru detectarea apasarii butonului |
Programul ruleaza pe ESP32 si este organizat sub forma unui automat finit de stari. Sistemul porneste in starea IDLE, unde asteapta comanda START primita prin USB-Serial. Dupa primirea comenzii, intra in starea WAITING, unde genereaza un delay pseudo-aleator intre 1 si 4 secunde. In aceasta perioada, daca utilizatorul apasa butonul, sistemul detecteaza un false start.
Dupa expirarea delay-ului, sistemul intra in starea SIGNAL, activeaza LED-ul si buzzer-ul si salveaza momentul de start folosind functia millis(). Cand utilizatorul apasa butonul, intreruperea pe GPIO4 seteaza un flag, iar in loop() se calculeaza timpul de reactie ca diferenta dintre momentul apasarii si momentul semnalului.
Rezultatul este afisat pe LCD 2004 I2C si transmis prin Serial sub forma `RESULT:<ms>`. Dupa cateva secunde, sistemul revine automat in starea IDLE.
Sistemul are 5 stari:
| Comanda | Directie | Efect |
|---|---|---|
| START | Utilizator → ESP32 | Porneste o runda noua |
| RESET | Utilizator → ESP32 | Reseteaza sistemul in starea IDLE |
| RESULT:<ms> | ESP32 → Serial Monitor | Trimite timpul de reactie in milisecunde |
| FALSE_START | ESP32 → Serial Monitor | Semnaleaza apasarea butonului inainte de semnal |
| STATE:<stare> | ESP32 → Serial Monitor | Afiseaza starea curenta a sistemului |
Butonul este conectat pe GPIO4 si este configurat cu INPUT_PULLUP, astfel incat pinul este in stare HIGH in repaus si trece in LOW cand butonul este apasat. Detectia se face prin intrerupere pe front descrescator, folosind `attachInterrupt(digitalPinToInterrupt(PIN_BUTTON), onButtonPress, FALLING)`.
Pentru evitarea citirilor multiple cauzate de zgomotul mecanic al butonului, in rutina de intrerupere se foloseste un debounce software de 50ms. Variabila `buttonPressed` este declarata `volatile`, deoarece este modificata in ISR si citita in functia `loop()`.
Buzzer-ul pasiv este controlat cu PWM hardware prin modulul LEDC al ESP32. Pentru semnalul de start se foloseste o frecventa de 1000Hz, iar pentru false start se emit 3 beep-uri scurte la 300Hz. La finalizarea unei probe valide, sistemul emite un beep scurt la 1500Hz.
Display-ul LCD 2004 I2C este controlat prin magistrala I2C folosind pinii GPIO21 pentru SDA si GPIO22 pentru SCL. Pe LCD sunt afisate mesajele corespunzatoare fiecarei stari: asteptare, pregatire, semnal, rezultat si false start.
| 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 | Testare comenzi Serial START/RESET si afisare rezultat pe LCD |
| 2026-05-19 | Testare end-to-end: LED, buzzer, buton, LCD si Serial Monitor |
| 2026-05-21 | Documentatie OCW, scheme, poze montaj final |