This shows you the differences between two versions of the page.
pm:prj2023:danield:musical-xmas-lights [2023/05/28 17:53] roxana.popa2703 |
pm:prj2023:danield:musical-xmas-lights [2023/05/28 19:19] (current) roxana.popa2703 |
||
---|---|---|---|
Line 27: | Line 27: | ||
===== Software Design ===== | ===== Software Design ===== | ||
- | Codul sursă poate se găsește aici: {{ :pm:prj2023:danield:musical_xmas_lights.zip }} | + | Codul sursă se găsește aici: {{ :pm:prj2023:danield:musical_xmas_lights.zip }} |
+ | |||
+ | Detalii de implementare: | ||
+ | |||
+ | În funcția setup() se seteaza pinii, se configurează întreruperile și se inițializează parametrii matricei de LED-uri. | ||
+ | Tot aici se inițializează cardul SD și se citesc cele 3 cântece care vor fi redate de buzzer. | ||
+ | |||
+ | În funcția loop() se controlează matricea de LED-uri și buzzer-ul. Inițial se pornește cu un pattern de lumini și un | ||
+ | cântec predefinite care pot fi schimbate prin apăsarea butoanelor NEXT, PAUSE, BACK și butonul asignat matricei. | ||
+ | Apăsarea butoanelor modifică variabilele __song_num__ și __matrix_opt__ care rețin numărul melodiei și al pattern-ului | ||
+ | de lumini. Apăsarea butoanelor declanșează întreruperi de tip PIN Change, în interiorul cărora se actualizează variabilele. | ||
+ | Tot aici se citește input-ul dat de potențiometru pentru a determina intensitatea luminii LED-urilor. | ||
+ | |||
+ | Pattern-urile de lumini folosite sunt definite în fișierele header incluse și sunt definite în librăria FastLED. Cântecele | ||
+ | pentru buzzer sunt definite sub forma unor vectori de perechi (notă, durată) care sunt citiți la începutul execuției. Pentru | ||
+ | a reda cântecele, am definit funcția playSong() care citește nota și durata sa și stabilește parametrii necesari pentru | ||
+ | metoda tone(): | ||
+ | |||
+ | Code snippet din funcția playSong(): | ||
+ | |||
+ | int wholenote = (60000 * 4) / 140; | ||
+ | int divider = 0, noteDuration = 0; | ||
+ | for (int thisNote = 0; thisNote < size * 2 && !pause; thisNote = thisNote + 2) { | ||
+ | lightMatrix(val); | ||
+ | divider = melody[thisNote + 1]; | ||
+ | if (divider > 0) { | ||
+ | noteDuration = (wholenote) / divider; | ||
+ | } else if (divider < 0) { | ||
+ | noteDuration = (wholenote) / abs(divider); | ||
+ | noteDuration *= 1.5; | ||
+ | } | ||
+ | tone(BUZZER_PIN, melody[thisNote], noteDuration*0.9); | ||
+ | delay(noteDuration); | ||
+ | noTone(BUZZER_PIN); | ||
+ | lightMatrix(val); | ||
+ | } | ||
+ | |||
+ | Dacă este apăsat butonul de pauză, se setează un fapt care indică acest lucru și cântecul se oprește. Matricea de LED-uri | ||
+ | se updatează în funcția playSong() pentru a asigura sincronizarea cu cântecul. Dacă cântecul este oprit, pattern-ul de lumini | ||
+ | va continua într-un ritm predefinit. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | TBD | + | Pentru demo, ne vedem la PM Fair =) . |
===== Concluzii ===== | ===== Concluzii ===== | ||
- | TBD | + | Acest proiect a fost primul proiect hardware pe care l-am realizat și m-a ajutat foarte mult să-mi dezvolt abilitățile de lucru |
+ | cu hardware. Totodată, m-a ajutat să-mi dezvolt abilitățile de organizare și documentare a procesului de proiectare și dezvoltare. | ||
===== Download ===== | ===== Download ===== | ||
- | TBD | + | Codul sursă se găsește aici: {{ :pm:prj2023:danield:musical_xmas_lights.zip }} |
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> |