jingle bells con Arduino e Led

salve a tutti, ho trovato in rete questo codice (che funziona alla perfezione) per far cantare ad arduino jingle bells

int speakerPin = 9;
int length = 29; // the number of notes
char notes[] = "eeeeeeegcdefffffeeeeddedg"; // a space represents a rest
int beats[] = { 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 4,  
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1 };
int tempo = 250;
void playTone(int tone, int duration) {
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
  }
}
void playNote(char note, int duration) {
  char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
  
  // play the tone corresponding to the note name
  for (int i = 0; i < 8; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);
    }
  }
}
void setup() {
  pinMode(speakerPin, OUTPUT);
}
void loop() {
  for (int i = 0; i < length; i++) {
    if (notes[i] == ' ') {
      delay(beats[i] * tempo); // rest
    } else {
      playNote(notes[i], beats[i] * tempo);
    }
    
    // pause between notes
   
  }
}

Ora io vorrei che si accendesse a ritmo di musica un led sulla porta digitale 11, come posso fare?

Credo che nella playTone così come "accendi" HIGH "spegni" LOW lo speaker, puoi anche accendere/spegnere un led su altro pin.

nid69ita:
Credo che nella playTone così come "accendi" HIGH "spegni" LOW lo speaker, puoi anche accendere/spegnere un led su altro pin.

si ottimo grazie

Io ho provato ma non mi funziona. Penso che dove eccendi/spegni lo speaker sia per avere la tonalità
Se per il led vuoi accenderlo quando suona e spegnerlo quando c'e' lo stacco tra una nota e l'altra non saprei come metterlo.

Invece ho provato a variare l'intensità del led a secondo della tonalità, modificando cosi:

void playTone(int tone, int duration) 
{ analogWrite(ledPin, map(tone,0,2000,0,255));
  for (long i = 0; i < duration * 1000L; i += tone * 2) 
  { digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
  }
  analogWrite(ledPin, 0); 
}

Il led pin è il 10, un pin che ha il PWM.

Ma l'analogwrite come mai lo hai mappato fino a 1023?

paulus1969:
Ma l'analogwrite come mai lo hai mappato fino a 1023?

Errore/orrore !!! :blush:
Ho corretto sopra. :smiley:

Tempo fa ho fatto qualche test anch'io.
Avevo fatto un circuito banale con un led RGB ed un pulsantino che, se premuto, mi suonava una musichetta nel mentre lo sketch continuava a fare i giochi di luce. Permetteva diversi schemi di giochi di luce con diverse velocità. Trovai uno sketch che non usava la Tone, e poi modificai la funzione di riproduzione della nota per far sì di poter gestire la cosa insieme agli schemi di luce.

In allegato lo sketch che feci a suo tempo (lasciate stare se fa schifo, l'ho scritto 2 annetti fa :sweat_smile:).

testRGB_con_suono.pde (18.8 KB)