Pages: [1] 2 3 4   Go Down
Author Topic: riproduzione melodia solo se il LED è acceso.. si può?!  (Read 1970 times)
0 Members and 1 Guest are viewing this topic.
Montalbano Jonico
Offline Offline
Sr. Member
****
Karma: 1
Posts: 287
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

lucadentella.it

BZ (I)
Online Online
Brattain Member
*****
Karma: 250
Posts: 21215
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Montalbano Jonico
Offline Offline
Sr. Member
****
Karma: 1
Posts: 287
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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..) smiley-sad:
Code:
// 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:

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? smiley

Grazie mille..!

Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
if(playing) playNextNote();

#isr
playing = false;

bye
Logged

lucadentella.it

BZ (I)
Online Online
Brattain Member
*****
Karma: 250
Posts: 21215
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A quel punto devi modificare la libreria. Ciao Uwe
Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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..) smiley-sad:

ciao

io farei il controllo qui:

Code:
    if(note)
    {
      Serial.print("Playing: ");
      Serial.print(scale, 10); Serial.print(' ');
      Serial.print(note, 10); Serial.print(" (");
      Serial.print(notes[(scale - 4) * 12 + note], 10);
      Serial.print(") ");
      Serial.println(duration, 10);
      tone1.play(notes[(scale - 4) * 12 + note]);
      delay(duration);
      tone1.stop();
    }

come vedi controlla - if(note) - se vi è una nota da suonare... qui potresti introdurre in AND anche il controllo sullo stato della fotoresistenza, una cosa tipo if(note AND "c'è buio")...
Logged

lucadentella.it

Montalbano Jonico
Offline Offline
Sr. Member
****
Karma: 1
Posts: 287
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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..) smiley-sad:

ciao

io farei il controllo qui:

Code:
    if(note)
    {
      Serial.print("Playing: ");
      Serial.print(scale, 10); Serial.print(' ');
      Serial.print(note, 10); Serial.print(" (");
      Serial.print(notes[(scale - 4) * 12 + note], 10);
      Serial.print(") ");
      Serial.println(duration, 10);
      tone1.play(notes[(scale - 4) * 12 + note]);
      delay(duration);
      tone1.stop();
    }

come vedi controlla - if(note) - se vi è una nota da suonare... qui potresti introdurre in AND anche il controllo sullo stato della fotoresistenza, una cosa tipo if(note AND "c'è buio")...


Ciao, ho provato a fare il controllo come hai detto, in particolare
Code:
if(note) & (luce>1))
    {
      Serial.print("Playing: ");
      Serial.print(scale, 10); Serial.print(' ');
      Serial.print(note, 10); Serial.print(" (");
      Serial.print(notes[(scale - 4) * 12 + note], 10);
      Serial.print(") ");
      Serial.println(duration, 10);
      tone1.play(notes[(scale - 4) * 12 + note]);
      delay(duration);
      tone1.stop();
    }
    else
    {
       tone1.stop();
      //Serial.print("Pausing: ");
      //Serial.println(duration, 10);
      //delay(duration);
    }

P.S dove luce>1 sta ad indicare se il LED è accesso o meno..

l'unica cosa è che effettivamente non appena torna la luce, si sente come un cambio di note, come se volesse fermarsi, ma poi continua.. smiley-eek-blue

Il problema secondo me sta in questa istruzione..
Code:
delay(duration);

togliendola infatti lo speker emette un "suono" strano appena il led si accende, appena si spegne, stacca immediatamente.. (proprio come vorrei io).

Solo che dovrebbe suonare la nota non quel "fruscio"..xD

Qualche consiglio?!

Grazie mille!!
Logged

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5784
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A quel punto devi modificare la libreria. Ciao Uwe
sul discorso iterrupt, si puo' fare in modo che quando arriva l'interrupt si resetta il micro ?
cosi' ripartirebbe e tutta andrebbe bene ?
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

BZ (I)
Online Online
Brattain Member
*****
Karma: 250
Posts: 21215
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

non volevate pausare la musica?
Logged

Montalbano Jonico
Offline Offline
Sr. Member
****
Karma: 1
Posts: 287
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

non volevate pausare la musica?

Si esatto, a me andrebbe bene sia che la musica si metta in pausa, sia che si stoppi del tutto, non appena il led si spegne..
Solo che sto riscontrando questi tipi di problemi..
Logged

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5784
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

quindi un bel reset post interrupt e via, poco elegante ma funzionale  smiley
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Mah... smiley-roll-sweat
Logged


0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5784
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

e' troppo brutto vero ?  smiley
pero' funziona smiley

se vuoi posso fartela ancora piu' brutta
si carica un codice che fa bloccare il micro, poi si attiva il watchdog che si accorge del blocco e resetta il micro, arrivando anche in questo casoalla soluzione  smiley
« Last Edit: September 01, 2011, 09:35:33 am by Testato » Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Vabbè... anche staccare l'alimentazione dall'Arduino funziona per stoppare la musica...  smiley-wink
Sarebbe carino fare in modo di modificare la libreria ed implementare una funzione di pausa.
Logged


Pages: [1] 2 3 4   Go Up
Jump to: