Buzzer Melodie

Bonjour à tous !
J’ai un petit problème dans mon projet qui est de faire sonner un buzzer (Grove v1.2) à l’aide de bouton on/off sur application Android que j’ai fait à l’aide de MIT App Inventor, pas de problème concernant la connexion application/arduino Uno avec le module Bluetooth.
J’ai pris une melodie de Pirates des Caraibes que j’ai trouvé sur Youtube.
J’arrive à la lancer depuis l’application, le bouton ON envoyant un 1 à l’Arduino.
Mais le problème est que je n’arrive pas à stopper la mélodie en cours, je suis obliger d’attendre qu’elle s’arrête toute seule.
J’ai remarque que sur le moniteur série, je reçois bien les données (1 et 0), une fois que j’envoie un 1, le moniteur ne lit plus les données reçus.
J’aimerais donc savoir si il était bien possible d’arrêter la mélodie alors même que les notes se jouent.
J’ai pas mal chercher pour mon problème, mais pas trouver de solutions.

#include <SoftwareSerial.h>
//module bluetooth
#define RxD 0 
#define TxD 1 
SoftwareSerial blueToothSerial(RxD,TxD);

const int buzzer = 2;
const int songspeed = 1; //
//notes musique pirates des C
#define NOTE_C4  262   //Defining note frequency
#define NOTE_D4  294
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_G4  392
#define NOTE_A4  440
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_D5  587
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_G5  784
#define NOTE_A5  880
#define NOTE_B5  988
int notes[] = {       //Note of the song, 0 is a rest/pulse
   NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0, 
   NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0, 
   NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0,
   NOTE_A4, NOTE_G4, NOTE_A4, 0,
   
   NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0, 
   NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0, 
   NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0,
   NOTE_A4, NOTE_G4, NOTE_A4, 0,
   
   NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0, 
   NOTE_A4, NOTE_C5, NOTE_D5, NOTE_D5, 0, 
   NOTE_D5, NOTE_E5, NOTE_F5, NOTE_F5, 0,
   NOTE_E5, NOTE_D5, NOTE_E5, NOTE_A4, 0,
   
   NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0, 
   NOTE_D5, NOTE_E5, NOTE_A4, 0, 
   NOTE_A4, NOTE_C5, NOTE_B4, NOTE_B4, 0,
   NOTE_C5, NOTE_A4, NOTE_B4, 0,

   NOTE_A4, NOTE_A4, 
   //Repeat of first part
   NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0, 
   NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0,
   NOTE_A4, NOTE_G4, NOTE_A4, 0,

   NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0, 
   NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0, 
   NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0,
   NOTE_A4, NOTE_G4, NOTE_A4, 0,
   
   NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0, 
   NOTE_A4, NOTE_C5, NOTE_D5, NOTE_D5, 0, 
   NOTE_D5, NOTE_E5, NOTE_F5, NOTE_F5, 0,
   NOTE_E5, NOTE_D5, NOTE_E5, NOTE_A4, 0,
   
   NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0, 
   NOTE_D5, NOTE_E5, NOTE_A4, 0, 
   NOTE_A4, NOTE_C5, NOTE_B4, NOTE_B4, 0,
   NOTE_C5, NOTE_A4, NOTE_B4, 0,
   //End of Repeat

   NOTE_E5, 0, 0, NOTE_F5, 0, 0,
   NOTE_E5, NOTE_E5, 0, NOTE_G5, 0, NOTE_E5, NOTE_D5, 0, 0,
   NOTE_D5, 0, 0, NOTE_C5, 0, 0,
   NOTE_B4, NOTE_C5, 0, NOTE_B4, 0, NOTE_A4,

   NOTE_E5, 0, 0, NOTE_F5, 0, 0,
   NOTE_E5, NOTE_E5, 0, NOTE_G5, 0, NOTE_E5, NOTE_D5, 0, 0,
   NOTE_D5, 0, 0, NOTE_C5, 0, 0,
   NOTE_B4, NOTE_C5, 0, NOTE_B4, 0, NOTE_A4
};

int duration[] = {         //duration of each note (in ms) Quarter Note is set to 250 ms
  125, 125, 250, 125, 125, 
  125, 125, 250, 125, 125,
  125, 125, 250, 125, 125,
  125, 125, 375, 125, 
  
  125, 125, 250, 125, 125, 
  125, 125, 250, 125, 125,
  125, 125, 250, 125, 125,
  125, 125, 375, 125, 
  
  125, 125, 250, 125, 125, 
  125, 125, 250, 125, 125,
  125, 125, 250, 125, 125,
  125, 125, 125, 250, 125,

  125, 125, 250, 125, 125, 
  250, 125, 250, 125, 
  125, 125, 250, 125, 125,
  125, 125, 375, 375,

  250, 125,
  //Rpeat of First Part
  125, 125, 250, 125, 125,
  125, 125, 250, 125, 125,
  125, 125, 375, 125, 
  
  125, 125, 250, 125, 125, 
  125, 125, 250, 125, 125,
  125, 125, 250, 125, 125,
  125, 125, 375, 125, 
  
  125, 125, 250, 125, 125, 
  125, 125, 250, 125, 125,
  125, 125, 250, 125, 125,
  125, 125, 125, 250, 125,

  125, 125, 250, 125, 125, 
  250, 125, 250, 125, 
  125, 125, 250, 125, 125,
  125, 125, 375, 375,
  //End of Repeat
  
  250, 125, 375, 250, 125, 375,
  125, 125, 125, 125, 125, 125, 125, 125, 375,
  250, 125, 375, 250, 125, 375,
  125, 125, 125, 125, 125, 500,

  250, 125, 375, 250, 125, 375,
  125, 125, 125, 125, 125, 125, 125, 125, 375,
  250, 125, 375, 250, 125, 375,
  125, 125, 125, 125, 125, 500
};

void setup() {
  Serial.begin(9600); 
  pinMode(buzzer, OUTPUT);
  digitalWrite(buzzer, LOW);
}
 
void loop()
{
  int i ;
  String t; //donnée recu d'android
  while(Serial.available()) { //lire t
    t += (char)Serial.read();} 
    if (t.length() >0)
    {
      Serial.println(t);
      if (t == "1") {    //1 quand on appuie sur on dans l'appli = faire sonner
        for (int i=0;i<203;i++){              //203=nbre de notes
        int wait = duration[i] * songspeed;
        tone(buzzer,notes[i],wait);          //tone(pin,frequency,duration)
        delay(wait);}      
        }
      else { //si on appuie pas sur 1 = pas sonner
        {digitalWrite(buzzer, LOW);}
        }
     }

 }

Merci à vous d’avance :slight_smile:

quand vous recevez un ‘1’ vous rentrez dans ce code:

      if (t == "1") {    //1 quand on appuie sur on dans l'appli = faire sonner
        for (int i=0;i<203;i++){              //203=nbre de notes
        int wait = duration[i] * songspeed;
        tone(buzzer,notes[i],wait);          //tone(pin,frequency,duration)
        delay(wait);}      
        }

y testez vous la réception d’autre chose? donc comment comptez vous arrêter la mélodie en cours?

→ va falloir prendre une autre approche pour la structuration du code - regardez l’exemple blink without delay par exemple pour avoir une idée de comment gérer “plusieurs choses à la fois”