Problema con funzione tone...

Salve ragazzi, quel che voglio fare è associare ad ogni tasto del mio telecomando una nota… Il telecomando funziona perfettamente, l’ho usato anche per cose decisamente più complesse però non capisco perchè utilizzando la funzione tone non vada bene…
Il problema è il seguente;
Premo il tasto, la cassa emette il suono corrispondente alla nota (fin quì tutto bene).
Vado a ripremere nuovamente il tasto e non succede più nulla… Non capisco il perchè…
Questo è il codice:

#include <IRremote.h> // includi la libreria IRremote

int RECV_PIN = 7; // Assegna al pin 7 l'uscita del ricevitore

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Avvia il ricevitore
}




void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);


    if(results.value==0x38C7807F){ // codice tasto 1 del telecomando
      for(int x =0; x<1; x++){
      tone(6, 494, 500);
      delay(500);
      noTone(6);
    }
    }


    irrecv.resume(); // flush
  }
}

Sapete come aiutarmi??? =(

p.s. l’altoparlante è collegato fra il pin 7 e massa

=(

p.s. l'altoparlante è collegato fra il pin 7 e massa

Ma il tone lo dai al pin 6. Anche dopo 1 secondo no puoi far ripartire il suono? Il codice del tasto ripremuto viene stampato o neanche quello? Ciao Uwe

ho sbagliato a scrivere, il ricevitore è al 7 mentre la cassa al 6.. il tono lo da solouna volta poi và in palla... e nn suona + -.-''

Il codice del tasto ripremuto viene stampato o neanche quello?

certo sulla seriale se intendi stampato.. comunque ho sempre adottato stò sistema e mi funzionava sempre tutto.. solo tone.. Una volta mi misi a fare un ciclo di for di 2 giri che avevo fatto an cnazoncina... bene.. Qualsiasi cosa colforu funziona il tone si ripete all'infinito.. ma cel'ha con me forse O_O

Non mi sàaiutare nessuno?

hai provato a mettere una println all'interno dell'if dove fai il tone a vedere se ci entri? se si il prolema allora credo sia nel colleghamento hardware... o magari stai alimentando "la cassa" con ardiono che non ce la fa?

la cassa ce la fà il tone funziona e tutto però me lo fà eseguire sl una volta.. se vado a ripremere il tasto per farlo rieseguire non parte +...

questo l’avevo già capito, l’hai messa la println all’interno dell’if dove fai il tone? la seconda volta che premi il pulsante stampa sulla seriale?

@ lesto perché insisti? j84c3 aveva giá risposto. ;) ;) Solo neanch io ho capito il suo stile di comunicazione condensato.

j84c3: certo sulla seriale se intendi stampato.. comunque ho sempre adottato stò sistema e mi funzionava sempre tutto.. solo tone..

nono, il println è allinterno dell'if irrecv.decode(&results) io intendo l'if if(results.value==0x38C7807F)

in effetti il codice è identato male e porta in inganno, senza contare quel for che è come se non ci fosse :)

edit: sarò ubriaco ma il codice me lo mangio ahahah :grin:

Ma apparte il for.. Io quando premo il tasto sento la nota che gli avevo detto di fare.. e fin quì ok... Se lo ripremo non fà più niente... anche se ci emtto noTone dopo non và in nessuna maniera.. ma perchè..?

questo l’hai già detto mille volte.
Il problema non si risolverà magicamente da solo e se non hai voglia nemmeno di fare una prova con i suggerimenti che ti sto dando (e non mi pare che ci siano molte alternative) siamo ad un vicolo cieco.

allora il tuo codice del loop attuale identato bene:

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    if(results.value==0x38C7807F){ // codice tasto 1 del telecomando
      for(int x =0; x<1; x++){
         tone(6, 494, 500);
         delay(500);
         noTone(6);
      }
    }

    irrecv.resume(); // flush
  }
}

e come dovresti testarlo:

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    if(results.value==0x38C7807F){ // codice tasto 1 del telecomando
      Serial.println("Codice valido!");
      for(int x =0; x<1; x++){
         tone(6, 494, 500);
         Serial.println("Inizio a suonare");
         delay(500);
         Serial.println("Fine delay");
         noTone(6);
         Serial.println("Suono spento");
      }
    }else{
       Serial.println("CODICE ERRORRATO");
    }

    Serial.println("Preparo la prossima lettura");
    irrecv.resume(); // flush
    Serial.println("Preparato per la prossima lettura");
  }
}

posta esattamente quello che ricevi come output, che iniziamo a vedere se il problema è software ed in caso dove.

Magari potrebbe essere un bug di noTone()… prova anche a cambiare il contenuto del for semplicemente con
tone(pin, frequency, duration)

ed infine come ultima risorsa puoi provare a utilizzare l’analogWrite()

Niente da fare.. Ho fatto come nell'esempio e non ha funzionato, sempre stesso errore... Premo una volta e fà il suono, dopo di che non lo ripete iò... Continuando a premere il tasto 1 dopo aver già fatto il suono mi esce codice errato... Provo a mettere aanalogWrite(6, 0);?

p.s. ho provato anche a sostituire il no tone con l'analogWrite e mi ha dato lo stesso problema.. Ho provato anche non mettere proprio il noTone e niente neppure così, ho provato eprsino a togliere il for.. ed ancora niente.. ma perchè..?

trovata la soluzione!

Niente da fare… Ho fatto come nell’esempio e non ha funzionato, sempre stesso errore… Premo una volta e fà il suono, dopo di che non lo ripete iò… Continuando a premere il tasto 1 dopo aver già fatto il suono mi esce codice errato… Provo a mettere aanalogWrite(6, 0);?

bene! andiamo a vedere quando stampa il messaggio “codice errato”:

if(results.value==0x38C7807F){
///blablabla
else{
  Serial.println("CODICE ERRORRATO");
}

Quindi vuol dire che quando premi di nuovo il pulsante NON leggi il valore 0x38C7807F, ma un’altro valore (che tra l’altro stampi e stampavi a video anche prima, quindi avresti dovuto accorgertene).
Se postavi gli output completi beccavamo pure qual’è questo nuovo codice…

ho provato anche a sostituire il no tone con l’analogWrite

nono, non ci siamo capiti. tone() in realtà funziona come l’analogWrite. L’analogWrite funziona solo su alcuno pin (PWM). Quindi in pratica sostutuisci la funzione tone() e noTone() con l’analogWrite().
Ma dato che il problema deriva dalle letture del sensore, e non dalle funzioni tone() e noTone() -il che mi sarebbe sembrato alquanto strano, considerando il numero di persone che le usa- questa complicazione la possiamo evitare bellamente.

no, è questo il problema! non deriva dalla lettura!!! Perchè se tolgo tutto e leggo solo il valore del telecomando è correttissimo rimanda lo stesso codice non altri... il problema è nel tone! Perchè se ad esempio scrivo anke un programma lungo... se faccio intervenire tone mi blocca l'intero programma! Il telecomando manda sempre lo stesso codice :-( magari fosse quello il problema, a quest'ora loa vrei già sirolto...

Non solo ho verificato che il problema non è nel telecomando ma ho dato proprio la conferma mettendo dei led al opsto del suono... Non ho mai avuto problemi di alcuna sorta.. Solo con stò maledettissimo tone...

se il codice inviato dal telecomando fosse correttissimo NON ti coparirebbe "codice errato"

Perchè se tolgo tutto e leggo solo il valore del telecomando è correttissimo rimanda lo stesso codice non altri...

bene, allora potrebbe essere qualcosa che attacchi DOPO che "rovina" le letture del telecomando.

Fammi un bel favore, attacca TUTTO il tuo circuito, fai girare il programma e poi copia-incolla quello che esce dalla seriale, magari anche un paio di prove.

Allora, premo una volta funziona tutto ok come da programma, premo dinuovo e mi da codice errato all'infinito anche se premessi 10 mila volte sempre codice errato, Allora mi sono detto"magari oggi si è scassato il telecomando?" bene allora oltre alle cose da scrivere sulla seriale ho detto di scrivere anche il codice del telecomando e nonostante tutto, mi esce il codice giusto insieme alle scritte errore -.-''

38C7807F
Codice valido!
Inizio a suonare
Fine delay
Suono spento
Preparo la prossima lettura
Preparato per la prossima lettura
0
CODICE ERRORRATO
Preparo la prossima lettura
Preparato per la prossima lettura
0
CODICE ERRORRATO
Preparo la prossima lettura
Preparato per la prossima lettura

ecco ora ciò ke mi esce! Il telecomando manda sempre lo stesso codice, ma se faccio partire il tone, qualunque tasto io prema riceve 0…
Altra cosa che ho notato! dopo aver fatto il tone per ricevere un prossimo codice dal telecomando impiega mezzo secondo, il tempo necessario per eseguire il tone! è come se il tone venisse ripetuto in continuo però senza suono e nello stesso tempo annulla i valori letti. -.-’’