This shows you the differences between two versions of the page.
pm:prj2022:robert:jewelry_box [2022/05/16 18:07] stefania.dina |
pm:prj2022:robert:jewelry_box [2022/05/20 19:39] (current) stefania.dina |
||
---|---|---|---|
Line 65: | Line 65: | ||
</note> | </note> | ||
- | <note> Parametrii de acționare | + | <note> Parametrii de acționare |
- | if (distance<30) | + | if (distance < 30) |
</note> | </note> | ||
- | <note> Pornire sunet | + | ---- |
- | for (int thisNote = 0; thisNote < notes * 2; thisNote = thisNote + 2) { | + | Explicație a melodiei, calcului duratei plus funcțiile folosite: |
+ | |||
+ | <note> **Sizeof** oferă numărul de octeți, fiecare valoare **int** este compusă din doi octeți (16 biți). Există două valori pe notă (**înălțimea și durata**), deci pentru fiecare notă sunt patru octeți. | ||
+ | int notes = sizeof(melody) / sizeof(melody[0]) / 2; | ||
+ | </note> | ||
+ | |||
+ | <note> Calculează durata unei **note întregi** în ms | ||
+ | int wholenote = ( 60000 * 4 ) / tempo; | ||
+ | </note> | ||
+ | |||
+ | <note> Selectare notă, prelucrare și emitere finală | ||
+ | // Itereazăm până la finalul notelor melodiei | ||
+ | // Vectorul de note conține atât notele cât și durata fiecăreia | ||
+ | for (int thisNote = 0; thisNote < notes * 2; thisNote = thisNote + 2) { | ||
+ | // Calculăm durata fiecărei note | ||
divider = pgm_read_word_near(melody+thisNote + 1); | divider = pgm_read_word_near(melody+thisNote + 1); | ||
- | if (divider > 0) { .... } | + | if (divider > 0) { |
- | } | + | // Notă obișnuită, merge mai departe |
+ | noteDuration = (wholenote) / divider; | ||
+ | // Dacă nota este cu durată negativă atunci se ia valoarea pozitivă însă se mărește durata cu jumătate | ||
+ | } else if (divider < 0) { | ||
+ | noteDuration = (wholenote) / abs(divider); | ||
+ | noteDuration *= 1.5; | ||
+ | } | ||
+ | // Cântăm nota doar pentru 90% din durată, lăsând 10% ca pauză | ||
+ | tone(buzzer, pgm_read_word_near(melody+thisNote), noteDuration * 0.9); | ||
+ | |||
+ | // Asteptăm durata specificată înainte de a reda următoarea notă | ||
+ | delay(noteDuration); | ||
+ | |||
+ | // Oprește generarea formei de undă înainte de următoarea notă | ||
+ | noTone(buzzer); | ||
</note> | </note> | ||
+ | <note> Pentru a accesa mai rapid variabila stocată în SRAM dar și pentru a susține cantitatea mare de date ce conține notele muzicale nemodificate dinamic în timpul execuției am folosit funcția: | ||
+ | pgm_read_word_near() | ||
+ | |||
+ | </note> | ||
+ | |||
+ | <note> Am generat o undă pătrată cu frecvența de **pgm_read_word_near(melody + thisNote)** pentru pinul //buzzer// și o durată de 90%, lăsând 10% ca pauză. | ||
+ | tone(buzzer, pgm_read_word_near(melody+thisNote), noteDuration * 0.9); | ||
+ | </note> | ||
+ | |||
+ | <note> Dacă nu specific durata, tonul va continua până când funcția **noTone** este apelată pe același pin //buzzer//. | ||
+ | noTone(buzzer); | ||
+ | </note> | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
<note tip> | <note tip> | ||
- | Rezultatele se pot urmării aici: | + | Rezultatele se pot urmării aici: [[https://youtube.com/shorts/4BrKCf2BfKQ?feature=share | YouTube]] |
</note> | </note> | ||
Line 88: | Line 128: | ||
<note warning> Proiectul poate fi descărcat de aici: | <note warning> Proiectul poate fi descărcat de aici: | ||
- | {{:pm:prj2022:robert:dina_stefania-gabriela-proiect_pm.zip| Arhiva}} | + | {{:pm:prj2022:robert:dina_stefania-gabriela-proiect_pm_1.zip| Arhiva }} |
</note> | </note> | ||
===== Jurnal ===== | ===== Jurnal ===== |