This is an old revision of the document!
Author: Voicu Teodora-Andreea, 333CA
1. Dispozitivul e zguduit → accelerometrul detecteaza miscare peste SHAKE_THRESHOLD 2. Stare SHAKING → afiseaza “Shake!” si porneste redarea DICE.WAV pe buzzer 3. Dupa SHAKE_TIMEOUT fara miscare → opreste WAV, genereaza doua valori random (1–6) și le afiseaza pe OLED 4. Dupa RESULT_HOLD → revine la “READY!” și asteapta urmatorul shake
Lista Componente:
Functional Overview:
* OLED SSD1306 (I²C)
Sursa de alimentare a circuitului intern şi a driver-ului display-ului.
Reţeaua de masă comună.
Linia de date I²C: aici circulă octeţi de la Arduino către pixelii OLED-ului.
Linia de ceas I²C: sincronizează transferul de date pe SDA.
De ce OLED? – Afișează mesaje şi rezultatul zarurilor într-un format grafic compact, cu consum redus de energie.
* Modul SD-card (SPI)
Alimentează convertorul de nivel şi interfaţa SPI.
Referinţa de masă pentru comunicaţia SPI.
Selectează modulul SD pe magistrala SPI (când e LOW, modulul răspunde).
Trimite datele din Arduino spre SD (de exemplu, comenzi de citire).
Primeşte datele de la SD spre Arduino (conţinutul fişierului WAV).
Ceasul pentru sincronizarea transferului de biţi MOSI/MISO.
De ce SD-card? – Permite stocarea fişierului WAV de sunet de zaruri, fără să încarce memoria internă a plăcii.
* Buzzer pasiv
Pinul PWM generează semnalul audio propriu-zis (tonuri variabile conform valorilor citite din WAV).
Redă amplitudinea semnalului PWM către buzzer.
Întoarcerea curentului şi referinţa de masă.
Ce face PWM? – Pulse Width Modulation modulează lăţimea impulsurilor pentru a crea frecvenţe audio perceptibile ca sunet.
* Modul LIS2DH12 (I²C)
Alimentează senzorul cu tensiune stabilă de 3.3 V.
Stabilirea referinţei zero pentru măsurări.
Linia de date I²C: transmite valorile brute de acceleraţie.
Linia de ceas I²C pentru sincronizarea transferului de date.
Configurează adresa I²C la 0x19 (pull-up intern), astfel evitând conflicte pe bus.
CS rămâne HIGH; senzorul rămâne mereu activ pe I²C.
De ce accelerometru LIS2DH12? – Detectează gestul de „shake” cu precizie, fără butoane suplimentare, şi are consum redus.
comunicare I²C cu accelerometrul şi OLED
driver pentru citirea acceleraţiilor de la senzorul ‘‘LIS2DH12’’
suport hardware ‘‘SPI’’ pentru modulul SD
acces la sistemul de fişiere ‘‘FAT’’ de pe cardul micro-SD
redare fişiere ‘‘WAV’’ mono prin ‘‘PWM’’ (Timer1) pe buzzerul pasiv
comandă şi desen pe ‘‘OLED SSD1306’’ 128×64
Codul este împărţit în mai multe componente:
iniţializare şi citire continuă a accelerometrului ‘‘LIS2DH12’’
‘‘GATA’’ – aşteaptă un shake şi afişează “READY!” ‘‘SHAKING’’ – redă sunetul şi afişează “Shake!” cât timp mişcarea continuă ‘‘REZULTAT’’ – generează două valori aleatorii, le afişează pe OLED, apoi revine la ‘‘GATA’’
‘‘randomSeed(analogRead(A0))’’ pentru entropie la pornire ‘‘random(1,7)’’ pentru fiecare zar ‘‘drawCentered(text, y, font)’’ – calculează lăţimea textului şi îl plasează centrat
→ La pornire, ‘‘setup()’’ iniţializează senzorul, OLED-ul, SD-ul, audio şi RNG-ul, apoi pe ecran apare “READY!”.
→ În ‘‘loop()’’ se citesc acceleraţiile şi se calculează delta faţă de ultima citire. Dacă ‘‘delta > SHAKE_THRESHOLD’’, starea trece în ‘‘SHAKING’’.
→ În ‘‘SHAKING’’ se porneşte ‘‘audio.play(“DICE.WAV”)’’ şi se afişează “Shake!”. La fiecare citire de mişcare, timer-ul este resetat.
→ După ‘‘SHAKE_TIMEOUT’’ ms fără mişcare, ‘‘audio.stopPlayback()’’. Se generează două numere (1–6) şi se afişează cu font mare; starea devine ‘‘REZULTAT’’.
→ După ‘‘RESULT_HOLD’’ ms, ecranul revine la “READY!” iar starea revine în ‘‘GATA’’, aşteptând un nou shake.
→ Praguri configurabile:
→ Audio:
→ Desen pe OLED:
→ Random seed:
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.