La funzione "Tone" va in conflitto con la libreria di ken Sheriff

Ragazzi ho riscontato un problema, quando compilo questo sketch:

#include <IRremote.h>
IRrecv ric(5);
decode_results risultato;
const int buzzer= 10;
#define t1 551520375 // codice tasto 1
#define t2 551504055
#define t3 551536695
#define t4 551495895
#define t5 551528535
#define t6 551512215
#define t7 551544855
#define t8 551491815
#define t9 551524455
void setup ()
{
  pinMode (buzzer, OUTPUT);
  ric.enableIRIn();
}
void loop ()
{
  switch (ric.decode(&risultato))
  {
    case t1: tone(buzzer, 500);delay (200); noTone (buzzer);break;
    case t2: tone(buzzer, 600);delay (200); noTone (buzzer);break;
    case t3: tone(buzzer, 700);delay (200); noTone (buzzer);break;
    case t4: tone(buzzer, 800);delay (200); noTone (buzzer);break;
    case t5: tone(buzzer, 900);delay (200); noTone (buzzer);break;
    case t6: tone(buzzer, 1000);delay (200); noTone (buzzer);break;
    case t7: tone(buzzer, 1100);delay (200); noTone (buzzer);break;
    case t8: tone(buzzer, 1200);delay (200); noTone (buzzer);break;
    case t9: tone(buzzer, 1300);delay (200); noTone (buzzer);break;
    default:;
  }
}

Mi da errore dicendo che c’è una multipla definizione di Tone da quanto ho capito :
core.a(Tone.cpp.o): In function __vector_7': C:\Users\Salvatore\Desktop\arduino-1.0.1\hardware\arduino\cores\arduino/Tone.cpp:523: multiple definition of __vector_7’
IRremote\IRremote.cpp.o:C:\Users\Salvatore\Desktop\arduino-1.0.1\libraries\IRremote/IRremote.cpp:311: first defined here
Anche perchè quando tolgo la parte dello switch non mi da errore nella compilazione.
C’è un modo quindi per usare sia tone che la libreria IRremote?
Per il mio progetto devo usare sia il ricevitore IR sia il buzzer :\

Significa che entrambe le librerie stanno utilizzando lo stesso timer. Quindi così come sono, sono incompatibili fra loro.

Esiste una libreria alternativa a quella di Sheriff?

Possibile che nessuno lo sa?

Invece della Tone puoi pilotare tu stesso i registri di un timer e fargli generare la frequenza che vuoi. Così non disturbi l'IRremote.

di un timer O.o? quella funzione mi serve a far suonare il buzzer

E con cosa tu pensi la Tone lo faccia suonare il tuo buzzer? :stuck_out_tongue:

Comunque ho guardato il codice della IRremote ed ho visto che puoi cambiare timer.
Modifica il file IRremoteInt.h ed inverti commenti che trovi alle righe 66 e 67 (quelle relative all'Arduino Duemilanove, Diecimila ecc..) così da spostare la IRremote sul timer 1.

Grazie mille con questo ho risolto ^^

ciao io ho lo stesso problema ma non riesco a scpostare la libreria del ir....cm devo fare????? grazie mille :slight_smile:

???

Anch’io ho questo problema, voglio fare una pianola comandata con il telecomando della tv. Ma ricevo quest errore.
Qualcuno è riuscito a risolvere?
Come posso generare suoni senza la funzione tone()?

Se dovete cambiare timer, la soluzione l'avevo già data:

leo72:
Comunque ho guardato il codice della IRremote ed ho visto che puoi cambiare timer.
Modifica il file IRremoteInt.h ed inverti commenti che trovi alle righe 66 e 67 (quelle relative all'Arduino Duemilanove, Diecimila ecc..) così da spostare la IRremote sul timer 1.

ok, quindi basta che invertire i commenti e poi per trasmettere uso il pin 9?

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  //#define IR_USE_TIMER1   // tx = pin 9
  #define IR_USE_TIMER2     // tx = pin 3
#endif

I commenti sono chiari :wink:

Grazie a tutti, funziona! :slight_smile:

Ho scritto anche un articolo su come fare una pianola con 7 note comandata via telecomando IR

alex27riva:
Ho scritto anche un articolo su come fare una pianola con 7 note comandata via telecomando IR
Alessandro Riva elettronica: Pianola con buzzer, telecomando infrarossi e arduino

con la switch secondo me è più leggibile:

switch(results.value)
{ case 0x01: tone(8,261,200); break;
  case 0x02: tone(8,293,200); break;
  case 0x03: tone(8,330,200); break;
  case 0x04: tone(8,349,200); break;
  case 0x05: tone(8,392,200); break;
  case 0x06: tone(8,435,200); break;
  case 0x07: tone(8,494,200); break;
}
 }

con la switch secondo me è più leggibile:

switch(results.value)
{ case 0x01: tone(8,261,200); break;
  case 0x02: tone(8,293,200); break;
  case 0x03: tone(8,330,200); break;
  case 0x04: tone(8,349,200); break;
  case 0x05: tone(8,392,200); break;
  case 0x06: tone(8,435,200); break;
  case 0x07: tone(8,494,200); break;
}
 }

[/quote]
Si hai ragione, ma dal punto di vista del funzionamento è stessa cosa.