Pages: 1 2 [3] 4   Go Down
Author Topic: riproduzione melodia solo se il LED è acceso.. si può?!  (Read 2062 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Se l'if non funziona è perché una delle due condizioni è false.
Magari metti le parentesi fra le condizioni:
if ((tone) && (luce>1))
non vorrei che ti eseguisse (tone && luce) e poi (>1)
Logged


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

Se l'if non funziona è perché una delle due condizioni è false.
Magari metti le parentesi fra le condizioni:
if ((tone) && (luce>1))
non vorrei che ti eseguisse (tone && luce) e poi (>1)

Il fatto secondo me è che l'if funziona.. perchè lui si accorge che luce è maggiore di 1, e che note sta ad indicare che ce una nota da suonare..
quindi,  se (ce una nota da suonare && luce è maggiore di 1) riproduci quella nota.. Infatti appena con l'arduino avviato e la luce in camera accesa non succede nulla.. (perchè luce non è maggiore di 1 in quel momento). Non appena spengo la luce inizia a suonare (perchè luce in quel momento è maggiore di 1). Per questo dico che l'if dovrebbe funzionare.. solo che non suona tutte le note come dovrebbe.. Lui una volta entrato nell'if dovrebbe suonarmi tutta la melodia fino a quando il led non si spenge.. invece è come se costringe il led a restare acceso.. In pratica, entra nell'if ma non riesce ad uscirne quando dovrebbe... forse è questo.. smiley-confuse
Logged

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

Hai stampato sulla seriale i valori delle variabili prima dell'if?

Ciao, ho fatto le prove che mi avevi detto, lascio in allegato un file che mostra la situazione! La condizione if a questo punto dovrebbe funzionare tranquillamente o no? solo che non va per niente. smiley-sad Secondo me sto sbagliando il controllo dell'if.. non devo farlo lì.. perchè praticamente quello dice che se ce una nota, riproducila.. altrimenti "pausing..."  smiley-confuse


* IMG.jpg (256.13 KB, 1674x689 - viewed 8 times.)
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ah, ho capito. Luce indica l'intensità del led, non il rilevamento fatto dalla fotocellula.
Però ti suona sempre la stessa nota. Quindi nell'if ci entra ma il puntatore non viene aggiornato e ad ogni passatto nell'if ripete la stessa nota.

Ricorda che l'if non è come il while. L'If è una condizione controllata per entrare in una porzione di codice. Mentre il while è un controllo sull'uscita. Quindi dall'if il micro esce.

C'è un'altra possibilità. Nell'if hai:
tone1.play(notes[(scale - 4) * 12 + note]);
delay(duration);
tone1.stop();

Ho letto che tone() non è compatibile con la funzione PWM sui pin 3 e 11 perché usa lo stesso timer del segnale PWM. Tu che pin usi?
Logged


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

Ah, ho capito. Luce indica l'intensità del led, non il rilevamento fatto dalla fotocellula.
Però ti suona sempre la stessa nota. Quindi nell'if ci entra ma il puntatore non viene aggiornato e ad ogni passatto nell'if ripete la stessa nota.

Ricorda che l'if non è come il while. L'If è una condizione controllata per entrare in una porzione di codice. Mentre il while è un controllo sull'uscita. Quindi dall'if il micro esce.

C'è un'altra possibilità. Nell'if hai:
tone1.play(notes[(scale - 4) * 12 + note]);
delay(duration);
tone1.stop();

Ho letto che tone() non è compatibile con la funzione PWM sui pin 3 e 11 perché usa lo stesso timer del segnale PWM. Tu che pin usi?

Questi sono i pin che uso:

Fotoresistenza: PIN analogico 0
LED: PIN digitale 6
Speaker: PIN digitale7

Quindi non dobrebbero esserci problemi di compatibilità giusto?

Comunque il pin digitale 3 ed 11 sono collegati al display.. (potrebbe essere questo il problema?)

Grazie!
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

No, solo per il PWM .
Logged


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

No, solo per il PWM .

Capito.. quindi non ci dovrebbero essereci di questi problemi.. Oddio inizio a non sopportare questo problema..xD E' anche poco documentato questo argomento comunque.. cioè alemno io non ho trovato quasi niente su qualcuno che vorrebbe far riprodurre una melodia quando si verifica una condizione.. e poi staccarsi quando quella condizione non ce.. anche di esempi con la tone.h non ne ho travati granchè..  smiley-confuse
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma usare while in entrata no? smiley-roll
Logged

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

ma usare while in entrata no? smiley-roll

Ho provato in questo modo:
Code:

 while (luce>1)

   

     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();
     }
   
    else
    {
     // return;
   Serial.print("Pausing: ");
   Serial.println(duration, 10);
   delay(duration);
      }

ho messo quindi
Code:
while (luce >1)

ma non va a quanto pare.. appena rivela la luce il risultato è quello che ho messo in allegato.. suona sempre una nota.. e ad esempio riaccendendo la luce nella stanza.. la fotoresistenza non rivela niente, il led non si spenge.. e la nota continua all'infinito.. smiley-roll


* img_2.jpg (128.71 KB, 827x651 - viewed 10 times.)
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

e se levi il delay dopo il play?
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non può uscire dal delay perché la lettura della fotoresistenza la fa prima di entrare nel loop.
Dovresti fare una lettura all'interno del ciclo in modo da aggiornare il valore di luce.
Logged


Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

perchè non direttamente nel while
tipo
while (analogRead ecc...
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il "dove" esattamente è un dettaglio. Chiarivo la cosa perché mi pare che Niko non abbia una conoscenza molto approfondita della programmazione. Cmq secondo me c'è il puntatore alle note che non è incrementato, perché se entra nell'if e suona sempre la prima nota, l'errore è lì. O no?

Poi, ripeto. Io non conosco la lib tone quindi non so come opera, non l'ho mai usata.
Logged


Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

io non ho capito ancora se non cammima il puntatore o se il delay(duation) non dà il tempo di avanzare smiley-sweat
per prova potresti sostituire duration con un numero tipo 5000?
Logged

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

io non ho capito ancora se non cammima il puntatore o se il delay(duation) non dà il tempo di avanzare smiley-sweat
per prova potresti sostituire duration con un numero tipo 5000?

"delay (duration)" è fondamentale a quanto pare.. già avevo provato a fare questo tentativo... praticamente se si sostituisce a duration un intero tipo 5000... ogni nota suona per 5 secondi.. quindi è una cosa fondamentale, sarebbe i millisecondi che la nota deve suonare..
Logged

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