This is an old revision of the document!


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 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.

Scop

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.

Ideea de baza

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.

Utilitate practica

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

De ce e util

  • Precizie hardware reala (1ms rezolutie millis()) vs. aplicatii web/mobile cu latenta de zeci de ms
  • Detectie false start — apasare buton inainte de semnal, tratata si raportata separat
  • Delay pseudo-aleator — nu se poate anticipa momentul semnalului
  • Display local (LCD 2004 I2C) — feedback instant fara a privi spre ecranul PC-ului
  • WiFi integrat pe ESP32 — posibilitate de extindere wireless
  • Export CSV din aplicatie pentru analiza ulterioara

Descriere generala

Schema bloc a sistemului:

Schema bloc Reflex Analyzer

Fluxul de date pe scurt:

  1. Aplicatia desktop trimite comanda START prin portul serial catre ESP32.
  2. Microcontrollerul genereaza un delay aleator (1-4s) cu random(), dupa care activeaza LED-ul si buzzer-ul simultan.
  3. Display-ul LCD trece de la “Asteptare…” la “Gata…” si apoi la “GO!” la momentul semnalului.
  4. Utilizatorul apasa butonul — intreruperea pe GPIO4 opreste cronometrul si calculeaza diferenta de timp.
  5. Rezultatul in milisecunde este trimis prin Serial aplicatiei si afisat pe LCD.
  6. Daca butonul e apasat inainte de semnal, sistemul semnalizeaza false start 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 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.

Software Design

Mediu de dezvoltare

  • Arduino IDE 2.x cu suport ESP32 (Espressif ESP32 board package)
  • VS Code + PlatformIO — alternativa pentru editare cod firmware
  • Python 3.11 + PyQt5 — aplicatie desktop
  • Monitor Serial (115200 baud) — debugging in timp real

Librarii folosite

Firmware (Arduino / ESP32)

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

Aplicatie Desktop (Python)

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

Algoritm de functionare

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).

Automat de stari

Automat de stari

Sistemul are 5 stari:

  • IDLE — asteapta comanda START de la aplicatie prin Serial; LCD afiseaza “Asteptare…”
  • WAITING — genereaza delay aleator 1-4s; LCD afiseaza “Gata… Nu apasa inca!”; GPIO4 activ pentru detectie false start
  • SIGNAL — emite LED + buzzer (1kHz), salveaza millis(); LCD afiseaza “GO!”; asteapta apasare buton
  • RESULT — calculeaza si trimite timpul prin Serial (RESULT:<ms>); afiseaza pe LCD cu rating; reset automat dupa 3s
  • FALSE_START — buton apasat inainte de semnal; 3 beep-uri de eroare + mesaj LCD “FALSE START!” + mesaj Serial; reset automat dupa 2s

Comenzi Serial

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

Surse si functii principale

  • setup() — initializare pini, LEDC, I2C, LCD, interrupt
  • showIdle() / startWaiting() / startSignal() — tranzitii de stare
  • showResult(ms) — afisare si trimitere rezultat
  • goFalseStart() — tratare false start cu beep-uri de eroare
  • onButtonPress() — ISR IRAM_ATTR pe GPIO4, debounce 50ms
  • resetToIdle() — reset automat la starea initiala

Aplicatie Desktop

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.

Rezultate Obtinute

  • Sistem functional end-to-end: buton → ESP32 → Serial → aplicatie desktop
  • Precizie masurare timp de reactie: 1 milisecunda (millis() pe ESP32 la 240MHz)
  • Latenta Serial sub 5ms intre apasare buton si afisarea rezultatului in aplicatie
  • Detectie false start functionala in toate scenariile testate
  • Display LCD 2004 afiseaza starile stabil, cu mesaje clare pe 4 randuri

Concluzii

  • Utilizarea functiei millis() pe ESP32 (240MHz) ofera o rezolutie de 1ms, suficienta pentru masurarea precisa a timpului de reactie uman.
  • Arhitectura FSM (automat de stari) s-a dovedit esentiala — o implementare liniara ar fi ratat evenimentele de intrerupere sau ar fi blocat comunicatia Serial.
  • ISR-ul pe GPIO4 cu debounce software (50ms) elimina zgomotul mecanic al butonului fara componente externe.
  • ESP32 ofera WiFi integrat, permitand extinderea viitoare a proiectului cu control wireless sau salvarea rezultatelor in cloud.
  • Provocarea principala: variabilele partajate intre loop() si ISR necesita declarare volatile si debounce corect.

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 Scriere aplicatie Python + PyQt5, grafic matplotlib
2026-05-19 Testare end-to-end, debugging
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.1778948951.txt.gz · Last modified: 2026/05/16 19:29 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