Reflex Analyzer — Sistem de masurare si analiza a timpului de reactie

Autor: Enciu Cezar-Andrei, grupa 332CA
Asistent: Bianca Popa

Introducere

Descriere generala

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.

Scop

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.

Ideea de baza

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.

Utilitate practica

  • Sportivi care vor sa isi masoare si imbunatateasca reflexele in antrenament
  • Utilizatori generali curiosi sa isi testeze timpul de reactie cu precizie reala
  • Demonstratii educationale — ilustreaza concret timere, intreruperi, PWM, I2C si comunicatie seriala

De ce e util

  • Precizie hardware reala, cu rezolutie de 1ms folosind millis()
  • Detectie false start — apasare buton inainte de semnal, tratata separat
  • Delay pseudo-aleator intre 1 si 4 secunde, pentru a evita anticiparea semnalului
  • Display local LCD 2004 I2C — afiseaza starea sistemului si rezultatul fara a depinde de o aplicatie externa
  • Feedback dublu: semnal luminos prin LED si semnal sonor prin buzzer
  • Implementare clara folosind automat de stari, intreruperi si PWM hardware

Descriere generala

Schema bloc a sistemului:

Schema bloc Reflex Analyzer

Fluxul de functionare pe scurt:

  1. Utilizatorul trimite comanda START prin Monitorul Serial catre ESP32.
  2. Microcontrollerul genereaza un delay aleator intre 1 si 4 secunde cu random().
  3. Display-ul LCD trece de la “Asteptare” la “Gata…” si apoi la “GO!”.
  4. La momentul semnalului, ESP32 activeaza simultan LED-ul si buzzer-ul.
  5. Utilizatorul apasa butonul, iar intreruperea de pe GPIO4 opreste cronometrul.
  6. Timpul de reactie este calculat in milisecunde, afisat pe LCD si trimis prin Serial.
  7. Daca butonul este apasat inainte de semnal, sistemul detecteaza false start, emite 3 beep-uri scurte si se reseteaza automat.

Hardware Design

Lista de piese

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

Schema electrica

Schema electrica Reflex Analyzer

Schema de conexiuni

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.

Software Design

Mediu de dezvoltare

  • Arduino IDE 2.x cu suport ESP32 prin pachetul Espressif ESP32
  • VS Code + PlatformIO — alternativa pentru editare si incarcare firmware
  • Monitor Serial (115200 baud) — trimitere comenzi si verificare mesaje de stare

Librarii folosite

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

Algoritm de functionare

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.

Automat de stari

Automat de stari

Sistemul are 5 stari:

  • IDLE — asteapta comanda START prin Serial; LCD afiseaza mesajul de asteptare
  • WAITING — genereaza delay aleator 1-4s; LCD afiseaza “Gata…” si “Nu apasa inca!”
  • SIGNAL — activeaza LED-ul si buzzer-ul; LCD afiseaza “GO!”
  • RESULT — calculeaza timpul de reactie, il afiseaza pe LCD si il trimite prin Serial
  • FALSE_START — detecteaza apasarea prea devreme a butonului, emite 3 beep-uri si afiseaza mesaj de eroare

Comenzi Serial

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

Surse si functii principale

  • setup() — initializeaza Serial, pini, LED, buzzer, I2C, LCD si intreruperea pe buton
  • loop() — citeste comenzile Serial si gestioneaza tranzitiile automatului de stari
  • showIdle() — trece sistemul in starea IDLE si afiseaza mesajul initial pe LCD
  • startWaiting() — genereaza delay-ul aleator si pregateste sistemul pentru semnal
  • startSignal() — activeaza LED-ul si buzzer-ul si porneste cronometrul
  • showResult(ms) — afiseaza timpul de reactie pe LCD si il trimite prin Serial
  • goFalseStart() — trateaza cazul in care butonul este apasat prea devreme
  • onButtonPress() — rutina de intrerupere pentru buton, cu debounce software de 50ms
  • resetToIdle() — reseteaza sistemul la starea initiala

Detalii de implementare

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.

Rezultate Obtinute

  • Sistem functional end-to-end: buton → ESP32 → LCD 2004 I2C / Serial Monitor
  • Masurare a timpului de reactie cu rezolutie de 1 milisecunda folosind millis()
  • Detectie false start functionala prin intreruperea de pe GPIO4
  • Feedback vizual prin LED si feedback sonor prin buzzer pasiv controlat PWM
  • Display-ul LCD 2004 I2C afiseaza starile sistemului si rezultatul final pe 4 randuri
  • Reset automat dupa afisarea rezultatului sau dupa detectarea unui false start

Concluzii

  • Utilizarea functiei millis() pe ESP32 ofera o rezolutie de 1ms, suficienta pentru masurarea timpului de reactie uman.
  • Arhitectura FSM (automat de stari) s-a dovedit utila pentru separarea clara a etapelor: asteptare, semnal, rezultat si false start.
  • ISR-ul pe GPIO4 cu debounce software de 50ms permite detectarea rapida a apasarii butonului si reduce efectul zgomotului mecanic.
  • Display-ul LCD 2004 I2C permite afisarea locala a starilor si rezultatului, fara a depinde de o aplicatie externa.
  • PWM-ul hardware LEDC al ESP32 permite controlul buzzer-ului fara a bloca permanent executia programului.
  • Provocarea principala a fost sincronizarea corecta intre intreruperea butonului si logica principala din loop(), prin folosirea variabilelor volatile.

Jurnal

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

Bibliografie / Resurse

  1. Cursurile PM - Lab 1 USART, Lab 2 Intreruperi Timere, Lab 3 PWM, Lab 6 I2C
pm/prj2026/bianca.popa1106/cezar_andrei.enciu.txt · Last modified: 2026/05/18 18:25 by cezar_andrei.enciu
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