This shows you the differences between two versions of the page.
|
pm:prj2026:bianca.popa1106:cezar_andrei.enciu [2026/05/09 14:13] cezar_andrei.enciu |
pm:prj2026:bianca.popa1106:cezar_andrei.enciu [2026/05/18 18:25] (current) cezar_andrei.enciu |
||
|---|---|---|---|
| Line 8: | Line 8: | ||
| ==== Descriere generala ==== | ==== Descriere generala ==== | ||
| - | Reflex Analyzer este un sistem embedded pentru masurarea precisa a timpului de reactie uman. Placa ATmega324P primeste o comanda de start dintr-o aplicatie desktop, 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 hardware se opreste, iar rezultatul — exprimat in milisecunde — este trimis aplicatiei prin USART. Display-ul OLED I2C afiseaza starea sistemului in timp real. Aplicatia centralizeaza rezultatele si prezinta statistici: medie, minim, maxim si un grafic al evolutiei pe sesiune. | + | 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 ==== | ==== 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 (care sunt limitate de latenta sistemului de operare). | + | 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 ==== | ==== Ideea de baza ==== | ||
| - | Microcontrollerul **ATmega324P** cronometreaza timpul de reactie folosind **Timer1 pe 16 biti** (rezolutie ~4μs), activat in momentul emiterii semnalului si oprit prin intreruperea externa **INT0** la apasarea butonului. Rezultatul este trimis prin **USART** catre o aplicatie desktop **Python + PyQt5** care afiseaza statistici si un grafic de evolutie. Un display **OLED I2C (SSD1306)** ofera feedback local fara a fi nevoie de calculator. | + | 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 ==== | ==== Utilitate practica ==== | ||
| - | * **Sportivi** care vor sa isi masoare si imbunateasca reflexele in antrenament | + | * **Sportivi** care vor sa isi masoare si imbunatateasca reflexele in antrenament |
| - | * **Utilizatori generali** curiosi sa isi testeze timpul de reactie cu precizie reala, nu estimata de browser | + | * **Utilizatori generali** curiosi sa isi testeze timpul de reactie cu precizie reala |
| - | * **Demonstratii educationale** — proiectul ilustra concret cum functioneaza timerele hardware, intreruperile si comunicatia seriala | + | * **Demonstratii educationale** — ilustreaza concret timere, intreruperi, PWM, I2C si comunicatie seriala |
| ==== De ce e util ==== | ==== De ce e util ==== | ||
| - | * Precizie hardware reala (~4μs rezolutie) vs. aplicatii web/mobile cu latenta de zeci de ms | + | * Precizie hardware reala, cu rezolutie de 1ms folosind millis() |
| - | * Detectie **false start** — apasare buton inainte de semnal, tratata si raportata separat | + | * Detectie **false start** — apasare buton inainte de semnal, tratata separat |
| - | * Delay **pseudo-aleator** (LFSR) — nu se poate anticipa momentul semnalului | + | * Delay **pseudo-aleator** intre 1 si 4 secunde, pentru a evita anticiparea semnalului |
| - | * **Display local** (OLED I2C) — feedback instant fara a privi spre ecranul PC-ului | + | * **Display local LCD 2004 I2C** — afiseaza starea sistemului si rezultatul fara a depinde de o aplicatie externa |
| - | * **Export CSV** din aplicatie pentru analiza ulterioara | + | * Feedback dublu: semnal luminos prin LED si semnal sonor prin buzzer |
| + | * Implementare clara folosind automat de stari, intreruperi si PWM hardware | ||
| ===== Descriere generala ===== | ===== Descriere generala ===== | ||
| Line 36: | Line 41: | ||
| Schema bloc a sistemului: | Schema bloc a sistemului: | ||
| - | {{ :pm:prj2026:bianca.popa1106:schema_bloc_cezar.png?direct&700 |Schema bloc Reflex Analyzer}} | + | {{ :pm:prj2026:bianca.popa1106:schema_bloc_cezar_1.png?700 |Schema bloc Reflex Analyzer}} |
| - | Fluxul de date pe scurt: | + | Fluxul de functionare pe scurt: |
| - | - Aplicatia desktop trimite comanda ''S'' (start) prin portul serial catre ATmega324P. | + | - Utilizatorul trimite comanda START prin Monitorul Serial catre ESP32. |
| - | - Microcontrollerul genereaza un delay aleator (1–4s) cu LFSR, dupa care activeaza LED-ul si buzzer-ul simultan. | + | - Microcontrollerul genereaza un delay aleator intre 1 si 4 secunde cu random(). |
| - | - Display-ul OLED trece de la „Gata..." la „GO!" la momentul semnalului. | + | - Display-ul LCD trece de la "Asteptare" la "Gata..." si apoi la "GO!". |
| - | - Utilizatorul apasa butonul — intreruperea externa **INT0** opreste Timer1 si calculeaza diferenta de timp. | + | - La momentul semnalului, ESP32 activeaza simultan LED-ul si buzzer-ul. |
| - | - Rezultatul in milisecunde este trimis prin USART aplicatiei si afisat pe OLED. | + | - Utilizatorul apasa butonul, iar intreruperea de pe GPIO4 opreste cronometrul. |
| - | - Daca butonul e apasat inainte de semnal, sistemul semnalizeaza **false start** si se reseteaza. | + | - Timpul de reactie este calculat in milisecunde, afisat pe LCD si trimis prin Serial. |
| + | - Daca butonul este apasat inainte de semnal, sistemul detecteaza false start, emite 3 beep-uri scurte si se reseteaza automat. | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| Line 51: | Line 57: | ||
| ==== Lista de piese ==== | ==== Lista de piese ==== | ||
| - | ^ Componenta ^ Cantitate ^ Rol ^ | + | ^ Componenta ^ Cantitate ^ Rol ^ |
| - | | ATmega324P-PU (DIP-40) | 1 | Microcontroller principal | | + | | ESP32 DevKit V1 (38 pini) | 1 | Microcontroller principal cu WiFi/BT integrat | |
| - | | USBasp Programmer | 1 | Programare firmware prin ISP | | + | | LED rosu 5mm | 1 | Stimul vizual de start | |
| - | | Crystal 16MHz | 1 | Sursa de ceas externa | | + | | Rezistor 220 Ohm | 1 | Limitare curent LED | |
| - | | Condensator 22pF | 2 | Stabilizare crystal | | + | | Buzzer pasiv | 1 | Stimul sonor de start, controlat prin PWM (LEDC) | |
| - | | Condensator 100nF | 1 | Decuplare alimentare | | + | | Buton tactil 12x12mm | 1 | Input reactie utilizator | |
| - | | LED rosu 5mm | 1 | Stimul vizual de start | | + | | Display LCD 2004 I2C | 1 | Afisare stare sistem si timp de reactie (20x4 caractere) | |
| - | | Rezistor 220Ω | 1 | Limitare curent LED | | + | | Breadboard 830 puncte | 1 | Prototipare circuit | |
| - | | Buzzer pasiv 5V | 1 | Stimul sonor de start, controlat prin PWM | | + | | Fire jumper M-M | 1 set | Conexiuni intre componente | |
| - | | Buton tactil 6×6mm | 1 | Input reactie utilizator | | + | | Cablu micro-USB | 1 | Programare + alimentare ESP32 | |
| - | | Display OLED I2C 0.96" SSD1306 | 1 | Afisare stare sistem si timp de reactie | | + | |
| - | | Convertor USB-UART (CP2102/CH340) | 1 | Comunicare seriala cu PC | | + | ==== Schema electrica ==== |
| - | | Breadboard + fire jumper | 1 set | Conectica si prototipare | | + | |
| - | | Sursa alimentare 5V (USB) | 1 | Alimentare circuit | | + | {{ :pm:prj2026:bianca.popa1106:schema_electrica_czr.png?700 |Schema electrica Reflex Analyzer}} |
| ==== Schema de conexiuni ==== | ==== Schema de conexiuni ==== | ||
| - | ^ Pin ATmega324P ^ Componenta ^ | + | ^ Pin ESP32 ^ Componenta ^ |
| - | | PB0 | Anod LED rosu (prin 220Ω → GND) | | + | | GPIO5 | Anod LED rosu, prin rezistor 220 Ohm | |
| - | | PD5 / OC0B | Buzzer pasiv (semnal PWM) | | + | | GPIO18 | Buzzer pasiv + pin, semnal PWM prin LEDC | |
| - | | PD2 / INT0 | Buton (pull-up intern, cealalta latura GND) | | + | | GPIO4 | Buton tactil, configurat INPUT_PULLUP, cealalta latura la GND | |
| - | | PC0 / SCL | SCL display OLED SSD1306 | | + | | GPIO21 / SDA | SDA display LCD 2004 I2C | |
| - | | PC1 / SDA | SDA display OLED SSD1306 | | + | | GPIO22 / SCL | SCL display LCD 2004 I2C | |
| - | | PD1 / TXD | TX convertor USB-UART | | + | | VIN (5V) | VCC display LCD 2004 I2C | |
| - | | PD0 / RXD | RX convertor USB-UART | | + | | GND | GND comun pentru LED, buzzer, buton si LCD | |
| - | | XTAL1 / XTAL2 | Crystal 16MHz (cu 2× 22pF la GND) | | + | |
| - | | VCC / AVCC / GND | Alimentare 5V + 100nF decuplare | | + | **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 ===== | ===== Software Design ===== | ||
| Line 83: | Line 89: | ||
| ==== Mediu de dezvoltare ==== | ==== Mediu de dezvoltare ==== | ||
| - | * **avr-gcc + avrdude** — compilare si incarcare firmware in limbaj C | + | * **Arduino IDE 2.x** cu suport ESP32 prin pachetul Espressif ESP32 |
| - | * **VS Code** — editare cod firmware | + | * **VS Code + PlatformIO** — alternativa pentru editare si incarcare firmware |
| - | * **Python 3.11 + PyQt5** — aplicatie desktop | + | * **Monitor Serial (115200 baud)** — trimitere comenzi si verificare mesaje de stare |
| - | * **Monitor Serial** — debugging USART in timp real | + | |
| ==== Librarii folosite ==== | ==== Librarii folosite ==== | ||
| - | === Firmware (C / avr-gcc) === | + | ^ Librarie ^ Sursa ^ Rol ^ |
| - | + | | Wire.h | Arduino built-in | Comunicare I2C intre ESP32 si LCD | | |
| - | ^ Librarie ^ Sursa ^ Rol ^ | + | | LiquidCrystal_I2C | Library Manager | Control display LCD 2004 I2C | |
| - | | ''avr/io.h'' | avr-libc (built-in)| Acces la registrele I/O ale ATmega324P | | + | | Arduino ESP32 LEDC | ESP32 built-in | Generare PWM hardware pentru buzzer | |
| - | | ''avr/interrupt.h'' | avr-libc (built-in)| Gestionarea intreruperilor hardware | | + | | attachInterrupt() | Arduino built-in | Intrerupere pe GPIO4 pentru detectarea apasarii butonului | |
| - | | ''util/delay.h'' | avr-libc (built-in)| Delay-uri de initializare | | + | |
| - | | Driver SSD1306 I2C | open-source adaptat| Initializare display si afisare text | | + | |
| - | + | ||
| - | === Aplicatie Desktop (Python) === | + | |
| - | + | ||
| - | ^ Librarie ^ Rol ^ | + | |
| - | | ''pyserial'' | Comunicare seriala cu microcontrollerul prin USB-UART | | + | |
| - | | ''PyQt5'' | Interfata grafica (ferestre, butoane, tabele) | | + | |
| - | | ''matplotlib'| Grafic evolutie timp de reactie pe sesiune | | + | |
| - | | ''csv'' | Export rezultate in format CSV | | + | |
| ==== Algoritm de functionare ==== | ==== Algoritm de functionare ==== | ||
| - | <code c> | + | 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**. |
| - | setup(): | + | |
| - | initializeaza USART (9600 baud) | + | |
| - | initializeaza I2C + display OLED SSD1306 | + | |
| - | configureaza PB0 ca OUTPUT (LED) | + | |
| - | configureaza PD5 ca OUTPUT (buzzer PWM) | + | |
| - | configureaza PD2 ca INPUT cu pull-up intern (buton) | + | |
| - | activeaza intreruperea externa INT0 (front descrescator) | + | |
| - | activeaza intreruperile globale (sei) | + | |
| - | oled_print("Asteptare...") | + | |
| - | loop(): | + | 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. |
| - | daca s-a primit 'S' pe USART: | + | |
| - | fsm_state = WAITING | + | |
| - | delay_ms = lfsr_rand(1000, 4000) | + | |
| - | timer1_start() | + | |
| - | oled_print("Gata...") | + | |
| - | daca fsm_state == WAITING si timer1_get_ms() >= delay_ms: | + | Rezultatul este afisat pe LCD 2004 I2C si transmis prin Serial sub forma `RESULT:<ms>`. Dupa cateva secunde, sistemul revine automat in starea IDLE. |
| - | led_on() | + | |
| - | pwm_buzzer_beep(1000, 200) // ton 1kHz, 200ms | + | |
| - | oled_print("GO!") | + | |
| - | timer1_restart() // restart pentru masurare reactie | + | |
| - | fsm_state = SIGNAL | + | |
| - | daca fsm_state == RESULT: | + | ==== Automat de stari ==== |
| - | usart_send_int(reaction_time_ms) | + | |
| - | oled_print_time(reaction_time_ms) | + | |
| - | fsm_state = IDLE | + | |
| - | daca fsm_state == FALSE_START: | + | {{ :pm:prj2026:bianca.popa1106:fsm.png?700 |Automat de stari}} |
| - | pwm_buzzer_beep(400, 100) // ton eroare | + | |
| - | pwm_buzzer_beep(400, 100) | + | |
| - | oled_print("False start!") | + | |
| - | usart_send_char('F') | + | |
| - | fsm_state = IDLE | + | |
| - | ISR(INT0_vect): | + | Sistemul are 5 stari: |
| - | daca fsm_state == SIGNAL: | + | |
| - | reaction_time_ms = timer1_get_ms() | + | |
| - | led_off() | + | |
| - | fsm_state = RESULT | + | |
| - | daca fsm_state == WAITING: | + | |
| - | led_off() | + | |
| - | fsm_state = FALSE_START | + | |
| - | </code> | + | |
| - | ==== Automat de 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 | ||
| - | {{ :pm:prj2026:bianca.popa1106:fsm.png?direct&700 |Automat de stari Reflex Analyzer}} | + | ==== Comenzi Serial ==== |
| - | Sistemul are **5 stari**: | + | ^ Comanda ^ Directie ^ Efect ^ |
| - | + | | START | Utilizator -> ESP32 | Porneste o runda noua | | |
| - | * **IDLE** — asteapta comanda ''S'' de la aplicatie prin USART | + | | RESET | Utilizator -> ESP32 | Reseteaza sistemul in starea IDLE | |
| - | * **WAITING** — genereaza delay aleator cu LFSR, Timer1 numara; INT0 activ (detectie false start) | + | | RESULT:<ms> | ESP32 -> Serial Monitor | Trimite timpul de reactie in milisecunde | |
| - | * **SIGNAL** — emite LED + buzzer, Timer1 restartat pentru masurare; asteapta apasare buton (INT0) | + | | FALSE_START | ESP32 -> Serial Monitor | Semnaleaza apasarea butonului inainte de semnal | |
| - | * **RESULT** — calculeaza si trimite timpul prin USART, afiseaza pe OLED | + | | STATE:<stare> | ESP32 -> Serial Monitor | Afiseaza starea curenta a sistemului | |
| - | * **FALSE_START** — buton apasat inainte de semnal; avertisment sonor + USART + revenire la IDLE | + | |
| ==== Surse si functii principale ==== | ==== Surse si functii principale ==== | ||
| - | * ''usart_init(uint16_t ubrr)'' — configurare registre UBRR, activare TX/RX | + | * **setup()** — initializeaza Serial, pini, LED, buzzer, I2C, LCD si intreruperea pe buton |
| - | * ''usart_send_int(uint16_t val)'' — trimite numarul ca sir de caractere prin USART | + | * **loop()** — citeste comenzile Serial si gestioneaza tranzitiile automatului de stari |
| - | * ''timer1_start()'' / ''timer1_restart()'' / ''timer1_get_ms()'' — control cronometru hardware | + | * **showIdle()** — trece sistemul in starea IDLE si afiseaza mesajul initial pe LCD |
| - | * ''pwm_buzzer_beep(uint16_t hz, uint16_t ms)'' — ton PWM pe buzzer la frecventa data | + | * **startWaiting()** — genereaza delay-ul aleator si pregateste sistemul pentru semnal |
| - | * ''i2c_init()'' / ''oled_clear()'' / ''oled_print(const char *text)'' — driver display I2C | + | * **startSignal()** — activeaza LED-ul si buzzer-ul si porneste cronometrul |
| - | * ''lfsr_rand(uint16_t min, uint16_t max)'' — generator pseudo-aleator pe 16 biti | + | * **showResult(ms)** — afiseaza timpul de reactie pe LCD si il trimite prin Serial |
| - | * ''ISR(INT0_vect)'' — intrerupere buton: oprire timer (RESULT) sau false start (FALSE_START) | + | * **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)`. | ||
| - | ==== Aplicatie Desktop (Python + PyQt5) ==== | + | 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()`. |
| - | Interfata grafica ofera butoanele **Start proba**, **Stop sesiune** si **Export CSV**. Comunicarea seriala ruleaza pe un thread separat (''QThread'') pentru a nu bloca UI-ul. La fiecare proba finalizata, aplicatia: | + | 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. |
| - | - Citeste rezultatul de pe portul serial (''pyserial'') | + | 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. |
| - | - Il adauga in tabelul sesiunii | + | |
| - | - Actualizeaza statisticile (medie, minim, maxim) in timp real | + | |
| - | - Actualizeaza graficul ''matplotlib'' integrat in fereastra PyQt5 | + | |
| - | - Detecteaza si marcheaza probele de tip false start (codul ''F'') | + | |
| ===== Rezultate Obtinute ===== | ===== Rezultate Obtinute ===== | ||
| - | * Sistem functional end-to-end: buton → ATmega324P → USART → aplicatie desktop | + | * Sistem functional end-to-end: buton -> ESP32 -> LCD 2004 I2C / Serial Monitor |
| - | * Precizie masurare timp de reactie: **±4μs** (limitata de rezolutia Timer1 la 16MHz/64) | + | * Masurare a timpului de reactie cu rezolutie de 1 milisecunda folosind millis() |
| - | * Latenta USART sub **5ms** intre apasare buton si afisarea rezultatului in aplicatie | + | * Detectie false start functionala prin intreruperea de pe GPIO4 |
| - | * Detectie false start functionala in toate scenariile testate | + | * Feedback vizual prin LED si feedback sonor prin buzzer pasiv controlat PWM |
| - | * Display OLED afiseaza stari stabil, fara artefacte vizuale | + | * Display-ul LCD 2004 I2C afiseaza starile sistemului si rezultatul final pe 4 randuri |
| - | * Aplicatie Python stabila pe sesiuni de peste 50 de probe consecutive | + | * Reset automat dupa afisarea rezultatului sau dupa detectarea unui false start |
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| - | * Utilizarea **Timer1 pe 16 biti** cu prescaler 1/64 ofera o rezolutie de ~4μs — suficienta pentru masurarea timpului de reactie uman (tipic 150–300ms), cu o eroare relativa sub 0.003%. | + | * 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 esentiala — o implementare liniara cu ''delay()'' ar fi ratat evenimentele de intrerupere sau ar fi blocat comunicatia USART. | + | * Arhitectura FSM (automat de stari) s-a dovedit utila pentru separarea clara a etapelor: asteptare, semnal, rezultat si false start. |
| - | * Generatorul **LFSR** este simplu de implementat in C pur fara librarii externe si produce o distributie uniform imprevizibila a delay-ului de start. | + | * ISR-ul pe GPIO4 cu debounce software de 50ms permite detectarea rapida a apasarii butonului si reduce efectul zgomotului mecanic. |
| - | * **Display-ul OLED I2C** cu doar 4 fire (VCC, GND, SDA, SCL) este net superior oricarei solutii cu LCD paralel. | + | * Display-ul LCD 2004 I2C permite afisarea locala a starilor si rezultatului, fara a depinde de o aplicatie externa. |
| - | * **Provocarea principala** a fost sincronizarea corecta intre ISR si FSM — variabilele partajate intre main loop si ISR necesita declarare ''volatile'' si dezactivarea temporara a intreruperilor la citire. | + | * 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 ===== | ===== Jurnal ===== | ||
| - | ^ Data ^ Activitate ^ | + | ^ Data ^ Activitate ^ |
| - | | 2026-05-05 | Alegerea temei, documentare datasheet ATmega324P (Timer1, INT0, TWI, USART) | | + | | 2026-05-05 | Alegerea temei, documentare ESP32 DevKit V1 | |
| - | | 2026-05-07 | Achizitie componente (ATmega324P, USBasp, OLED, buzzer, buton, LED) | | + | | 2026-05-07 | Achizitie componente | |
| - | | 2026-05-09 | Montaj breadboard, testare USART (trimitere/primire caractere pe Serial Monitor) | | + | | 2026-05-09 | Montaj breadboard, testare Serial | |
| - | | 2026-05-11 | Implementare Timer1 + INT0, masurare timp de reactie, testare precizie | | + | | 2026-05-11 | Implementare FSM, masurare timp de reactie cu millis() | |
| - | | 2026-05-13 | Implementare PWM buzzer + LED, generare delay LFSR, testare false start | | + | | 2026-05-13 | Implementare PWM buzzer (LEDC) + LED, testare false start | |
| - | | 2026-05-15 | Implementare driver I2C + OLED SSD1306, integrare FSM complet | | + | | 2026-05-15 | Implementare driver LCD 2004 I2C, integrare FSM complet | |
| - | | 2026-05-17 | Scriere aplicatie Python + PyQt5, grafic matplotlib, export CSV | | + | | 2026-05-17 | Testare comenzi Serial START/RESET si afisare rezultat pe LCD | |
| - | | 2026-05-19 | Testare end-to-end, debugging, calibrare parametri | | + | | 2026-05-19 | Testare end-to-end: LED, buzzer, buton, LCD si Serial Monitor | |
| - | | 2026-05-21 | Documentatie OCW, scheme bloc, poze montaj final | | + | | 2026-05-21 | Documentatie OCW, scheme, poze montaj final | |
| ===== Bibliografie / Resurse ===== | ===== Bibliografie / Resurse ===== | ||
| - | - [[https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega324P.pdf|Datasheet ATmega324P — Microchip]] | + | - [[https://docs.espressif.com/projects/esp-idf/en/latest/esp32/|ESP32 Technical Reference Manual]] |
| - | - [[https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf|Datasheet SSD1306 OLED Controller — Solomon Systech]] | + | - [[https://github.com/espressif/arduino-esp32|Arduino ESP32 GitHub]] |
| - | - [[https://pyserial.readthedocs.io|pyserial — documentatie oficiala]] | + | - [[https://github.com/johnrickman/LiquidCrystal_I2C|LiquidCrystal_I2C librarie]] |
| - | - [[https://www.riverbankcomputing.com/software/pyqt/|PyQt5 — documentatie oficiala]] | + | - Cursurile PM - Lab 1 USART, Lab 2 Intreruperi Timere, Lab 3 PWM, Lab 6 I2C |
| - | - [[https://en.wikipedia.org/wiki/Linear-feedback_shift_register|Linear-feedback shift register — Wikipedia]] | + | |
| - | - Cursurile PM — Lab 1 (USART), Lab 2 (Intreruperi + Timere), Lab 3 (PWM), Lab 6 (I2C) | + | |