Go Down

Topic: riproduzione melodia solo se il LED è acceso.. si può?! (Read 2 times) previous topic - next topic

Nik_90

Ciao, è possibile far eseguire una melodia ad arduino SOLO quando il led è acceso?! Mi spiego meglio:

Ho un led collegato che si accende tramite fotoresistenza, se è buio si accende il LED.

Io vorrei che quando il led è acceso parta una melodia, ma non appena il led si spegne la melodia si fermi di colpo!

Sto trovando delle difficolta perchè praticamente ho implementato la libreria <tune.h>, e la melodia parte tranquillamente non appena accendo il led si accende, ma poi per far in modo che il led si spegne devo attendere la fine della melodia! :smiley-eek-blue:

Cioè è come se la funzione che ho trovato per riprodurre la melodia RTTTL necessita di finire per completare il tutto..

LINK CON CODICE CHE HO USATO:
http://code.google.com/p/arduino-tone/source/browse/trunk/examples/RTTTL/RTTTL.pde?r=4

Infatti non appena la melodia finisce si spegne anche il LED.. io invece vorrei che non appena magari ritorna la luce, il led si spegne, e la melodia si fermi.

Grazie mille in anticipo!

lucadentella

ciao

all'interno dello sketch vedrai che viene chiamata la funzione play_rtttl() che suona l'intera canzone prima di ritornare... non essendo multitasking, il tuo Arduino a questo punto è impegnato ad eseguire tale funzione ed ecco il motivo per cui non controlla se non al termine la fotoresistenza.

hai due possibilità:
- o utilizzi gli interrupt, legando lo stato della fotoresistenza ad uno di essi
- oppure se guardi bene la funzione, vedrai che suona nota per nota... potresti al termine di ogni nota e prima di suonare la successiva aggiungere il controllo sullo stato della fotoresistenza (controllo che quindi viene eseguito molto + frequentemente rispetto ad attendere la fine dell'intera canzone)

bye
lucadentella.it

uwefed

Quote from: lucad79
- o utilizzi gli interrupt, legando lo stato della fotoresistenza ad uno di essi

Mi devi spiegare come interrompi la musica. Col interrupt chiami la funzione interrupt ma cosa poi?
Ciao Uwe

Nik_90

Quote

hai due possibilità:
- o utilizzi gli interrupt, legando lo stato della fotoresistenza ad uno di essi
- oppure se guardi bene la funzione, vedrai che suona nota per nota... potresti al termine di ogni nota e prima di suonare la successiva aggiungere il controllo sullo stato della fotoresistenza (controllo che quindi viene eseguito molto + frequentemente rispetto ad attendere la fine dell'intera canzone)


ok ho visto un po quello che mi hai detto, praticamente, per il secondo metodo che hai speigato, il controllo lo devo fare su questo pezzo? (forse sto dicendo un str..) :(:
Code: [Select]

// now get the note
    note = 0;

    switch(*p)
    {
      case 'c':
        note = 1;
        break;
      case 'd':
        note = 3;
        break;
      case 'e':
        note = 5;
        break;
     }


tipo un controllo del genere:

Code: [Select]


case 'c':
if (LEDbrightness > 1)
{
note = 1;
break;
}
else
{
break;
}



..e quindi così con tutte le note.. sarebbe giusto?

Per quanto riguarda gli interrupt invece è un argomento che ancora non ho trattato.. vedrò di approfondire..

P.S: secondo te quale sarebbe la soluzione + elegante da implementare? :)

Grazie mille..!


lucadentella

Ciao


Mi devi spiegare come interrompi la musica. Col interrupt chiami la funzione interrupt ma cosa poi?
Ciao Uwe


banalmente pensavo ad un classico "flag" che setti nella ISR e controlli durante il play della canzone (nota per nota?)...
una cosa tipo

Code: [Select]
if(playing) playNextNote();

#isr
playing = false;


bye
lucadentella.it

Go Up