Keresés

Új hozzászólás Aktív témák

  • gyapo11

    őstag

    válasz Ghandi #4943 üzenetére

    A led villogtató részben nem látok késleltetést, ettől olyan gyorsan kellene villognia, hogy egy folyamatos 50 %-os fényt kellene látni.

    De még ennél is nagyobb baj, hogy a loopban a második for ciklusban ez van:
    delay(noteDuration * 4 / 3);

    Vagyis a toneAC csak játssza a hangot a háttérben, az időzítés meg delay-jel történik. :(
    Ráadásul a for ciklusból ki se lép, amíg a zene tart, és így a ledet se tudja villogtatni.
    A led villogtatást is és a zene lejátszását is delay nélkül kell megoldani.

    Azt kell megérteni, hogy ha egy dolognál több történik, akkor biztosítani kell a loop folyamatos pörgését, hogy mindegyik programrészlet futni tudjon. A delay megállítja a loop futását a megadott időre, és addig a többi programrészlet nem fut, nem tudja végezni a feladatát.
    Vagy a while(1) örökre ott fog állni. Ez jó akkor, ha csak 1 feladatot egyszer akarunk lefuttatni, mint a példában a zenét, és utána resetig nem történik más, csak a while fut le újra és újra.

    A program elején kell a feltétel, hogy kell-e akciózni, meg hogy fut-e az 1 perces időzítés. Ha beérkezett a jel, akkor elindítani egy számlálót az 1 perchez, ha jól emlékszem ennyi ideig akarod villogtatni a ledet és játszani a zenét.
    Ezután elindítani a led villogtatást és a zene lejátszását.
    Amikor letelik az 1 perc, akkor leállítani a villogtatást és a zenét, és várni a következő eseményre.
    Amikor az 1 perc mérő aktív, akkor nem figyel semmit, csak villogtat és zenél.

    A led villogtatására küldtem linket.
    A zenénél is a delayt le kell cserélni a ledvillogtatóban látható módon. Tehát elteszed a pillanatnyi millist egy változóba, és minden loop lefutáskor ezt az értéket hasonlítod a pillanatnyi millishez. Amikor pl. 1000-rel több, akkor eltelt 1 másodperc.

    Amikor elkezd egy hangot játszani, utána rögtön a delay van a kódban, ezt kell lecserélni a millises megoldásra, és kell egy jelzőváltozó, ami biztosítja, hogy ne fusson rá újra a
    toneAC(melody[thisNote], 10, noteDuration, true);
    sorra amíg az időzítés véget nem ér, különben minden loop lefutáskor újra és újra elkezdi játszani ugyanazt a hangot a végtelenségig.
    For ciklus helyett egyszerűen növelni kell a thisNote változó értékét, tehát a ciklus helyett a programnak kell léptetnie amikor az előző hang lejátszása véget ért.

  • Janos250

    őstag

    válasz Ghandi #4943 üzenetére

    Én ezt próbálnám:
    a "digitalWrite(8, LOW)" (vagy a digitalWrite(8, HIGH)) után betenném a második loopban lévő egész pakkot a "while(1);" kivételével.
    Az include és a deklaráció persze menne az elejére.
    Felelősség nélkül ;)

Új hozzászólás Aktív témák

Hirdetés