Non lo sto facendo fisicamente per ora lo sto virtualizzando tramite https://www.tinkercad.com quindi no penso centri il buzzer. Ho provato a isolare il bottone ma facendo solo il buzzer non emette nemmeno un suono, mentre se lo faccio con il bottone quando vado a premere e tengo premuto continua a fare "bip bip" finché non rilascio il bottone.
Sono riuscito a farlo partire togliendo NUM_NOTE come costante cioè così
#define NOTE_C5 523
#define NOTE_D5 587
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_G5 784
// i simboli per convenzione si scrivono tutti in maiuscolo per
// distinguerli dalle variabili
#define PULS 6
// Anche il numero del pin meglio definirlo come simbolo e
// non come variabile (visto che non varia...)
#define BUZZER 13
// Il numero di note è costante, definiscila come costante o, meglio, simbolo
int melodia[] = {NOTE_G5, NOTE_E5, NOTE_C5, NOTE_C5, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_G5, NOTE_G5, NOTE_E5};
int durataNote[] = {8, 8, 4, 4, 8, 8, 8, 8, 4, 4, 4, 4};
// Se un valore ti serve solo per un test non serve memorizzarlo
//int val = 0;
// Questo flag indica se sta suonando o meno
bool playing = false;
// Questa variabile rappresenta la nota da suonare nel successivo loop()
// (togliendo di mezzo il ciclo for faciamo fare tutto al loop)
byte i = 0;
void setup() {
pinMode(BUZZER, OUTPUT);
pinMode(PULS, INPUT);
playing = false; // Aspetto che prema il pulsante
}
void loop() {
// Verifico se ho premuto il pulsante
playing = ( digitalRead(PULS) == HIGH );
// Se devo suonare, suono la prossima nota
if ( playing ) {
int durata = 1300 / durataNote[i];
tone(BUZZER, melodia[i], durata);
delay(durata * 1.3);
// Incremento il puntatore alla prossima nota da suonare
++i;
}
// Spengo il suono
noTone(13);
}
Però appena premo funziona ma appena finisce la melodia fs un bip continuo penso sia perchè ho tolto questo:
// Se non devo suonare o se ho finito il brano
if ( !playing || i >= NUM_NOTE )
Oppure lasciando tutto come hai fatto tu ma togliendo l'ultima riga ovvero quella che riporta il puntatore alla prima nota :
// e riporto il puntatore alla prima nota
i = 0;
Funziona ma finisce con un bip continuo, non ci sono altri metodi per far finire il suono e farlo ricominciare?