Problème sur le niveau 7 "clavier musical" du starter kit.

Bonjour, je suis débutant en Arduino et j’ai un problème. J’ai finis le niveau 7 du starter kit mais j’avais envie de continuer pour essayer de transformer mon Arduino en piano automatisé et je voulais crée une mélodie juste en appuyant sur un bouton alors j’ai pris plein de résistances différentes et j’ai fais mon montage(voir photos).Normalement j’ai tout bien vérifié et ça devrait marché mais il n’y a que la led qui s’allume (que j’ai mis pour voir si ça marchais) mais il n’y a pas de sons, merci de votre aide…Voici le code :

int notes[] = {261, 294, 330, 349, 392, 440, 493};
int switchstate = 0;
void setup() {
  Serial.begin(9600);
  // declare the switch pin as an input
  pinMode(2, INPUT);
  // declare the notes pins as outputs
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
 }
void loop() {
  
  switchstate = digitalRead(2);
if (switchstate == LOW) {
    digitalWrite(3, LOW); // NOTE OFF
    digitalWrite(4, LOW); // NOTE OFF
    digitalWrite(5, LOW); // NOTE OFF
    digitalWrite(6, LOW); // NOTE OFF
    digitalWrite(7, LOW); // NOTE OFF
    digitalWrite(8, LOW); // NOTE OFF
    digitalWrite(9, LOW); // NOTE OFF
  }
else {
    digitalWrite(3, HIGH);  // NOTE ON
    digitalWrite(4, LOW);  // NOTE OFF
    digitalWrite(5, LOW); // NOTE OFF
    digitalWrite(6, LOW);  // NOTE OFF
    digitalWrite(7, LOW);  // NOTE OFF
    digitalWrite(8, LOW);  // NOTE OFF
    digitalWrite(9, LOW);  // NOTE OFF
    // wait for a 1 second before changing the NOTE
    delay(500);
    digitalWrite(3, LOW);  // NOTE OFF
    digitalWrite(4, HIGH);  // NOTE ON
    digitalWrite(5, LOW); // NOTE OFF
    digitalWrite(6, LOW);  // NOTE OFF
    digitalWrite(7, LOW);  // NOTE OFF
    digitalWrite(8, LOW);  // NOTE OFF
    digitalWrite(9, LOW);  // NOTE OFF
     // wait for a 2 second before changing the NOTE
    delay(500);
    digitalWrite(3, LOW);  // NOTE OFF
    digitalWrite(4, LOW);  // NOTE OFF
    digitalWrite(5, HIGH);  // NOTE ON
    digitalWrite(6, LOW);  // NOTE OFF
    digitalWrite(7, LOW);  // NOTE OFF
    digitalWrite(8, LOW);  // NOTE OFF
    digitalWrite(9, LOW);  // NOTE OFF

    delay(500);
    digitalWrite(3, HIGH);  // NOTE ON
    digitalWrite(4, LOW);  // NOTE OFF
    digitalWrite(5, LOW);  // NOTE OFF
    digitalWrite(6, LOW);  // NOTE OFF
    digitalWrite(7, LOW);  // NOTE OFF
    digitalWrite(8, LOW);  // NOTE OFF
    digitalWrite(9, LOW);  // NOTE OFF

    delay(500);
    digitalWrite(3, LOW);  // NOTE OFF
    digitalWrite(4, LOW);  // NOTE OFF
    digitalWrite(5, HIGH);  // NOTE ON
    digitalWrite(6, LOW);  // NOTE OFF
    digitalWrite(7, LOW);  // NOTE OFF
    digitalWrite(8, LOW);  // NOTE OFF
    digitalWrite(9, LOW);  // NOTE OFF

    delay(500);
    digitalWrite(3, HIGH);  // NOTE ON
    digitalWrite(4, LOW);  // NOTE OFF
    digitalWrite(5, LOW);  // NOTE OFF
    digitalWrite(6, LOW);  // NOTE OFF
    digitalWrite(7, LOW);  // NOTE OFF
    digitalWrite(8, LOW);  // NOTE OFF
    digitalWrite(9, LOW);  // NOTE OFF
    
    delay(500);
    digitalWrite(3, LOW);  // NOTE OFF
    digitalWrite(4, LOW);  // NOTE OFF
    digitalWrite(5, HIGH);  // NOTE ON
    digitalWrite(6, LOW);  // NOTE OFF
    digitalWrite(7, LOW);  // NOTE OFF
    digitalWrite(8, LOW);  // NOTE OFF
    digitalWrite(9, LOW);  // NOTE OFF

    delay(500);
    digitalWrite(3, LOW);  // NOTE OFF
    digitalWrite(4, HIGH);  // NOTE OFF
    digitalWrite(5, LOW);  // NOTE OFF
    digitalWrite(6, LOW);  // NOTE OFF
    digitalWrite(7, LOW);  // NOTE OFF
    digitalWrite(8, LOW);  // NOTE OFF
    digitalWrite(9, LOW);  // NOTE OFF
    
    
  }
  
  
int keyVal = analogRead(A0);
  Serial.println(keyVal);
  
  if (keyVal == 1023) {
    tone(13, notes[0]);
  } else if (keyVal >= 199 && keyVal <= 200) {
    tone(13, notes[1]);
  } else if (keyVal >= 990 && keyVal <= 992) {
    tone(13, notes[2]);
  } else if (keyVal >= 984 && keyVal <= 986) {
    tone(13, notes[3]);
  } else if (keyVal >= 977 && keyVal <= 979) {
    tone(13, notes[4]);
  } else if (keyVal >= 1007 && keyVal <= 1009) {
    tone(13, notes[5]);
  } else if (keyVal >= 1011 && keyVal <= 1013) {
    tone(13, notes[6]);
      } else {
    noTone(13);
  }
}

La pin 13 est utilisée dans le code dans les appels à tone() mais je ne vois rien de branché sur cette broche.

Si il y a le file noir qui est relier au GND

Je répète : dans ton code je vois :

tone(13, notes[0]);

Mais sur la photo 1 la pin digitale 13 est libre. je vois bien un fil noir sur GND mais rien d'autre.
Si tu sors un son sur la pin 13 il faudrait brancher ton buzzer dessus tu ne crois pas ?

Un schéma serait préférable. On ne voit pas grand chose sur des photos.

Je viens de vérifier et le buzzer est bien relié au 13. Bref sinon j’ai bien avancé et maintenant j’ai un problème dans le code, j’arrive a sortir le premier son mais les autres sons ne s’enchaine pas et la il me dit " expected constructor, destructor, or type conversion before ‘(’ token" et me souligne en rouge le dernier “digitalWrite(9, LOW) ;” parce que je ne sais pas ou mettre les parenthèses , je veux bien de l’aide , merci :slight_smile: , le code :

int notes[] = {261, 294, 330, 349, 392, 440, 493};
int switchstate = 0;
void setup() {
  Serial.begin(9600);
  // declare the switch pin as an input
  pinMode(2, INPUT);
  // declare the notes pins as outputs
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
 }
void loop() {
  
  switchstate = digitalRead(2);
if (switchstate == HIGH) 
    digitalWrite(3, LOW); 
    digitalWrite(4, LOW); 
    digitalWrite(5, LOW); 
    digitalWrite(6, LOW); 
    digitalWrite(7, LOW); 
    digitalWrite(8, LOW); 
    digitalWrite(9, LOW);

   
  switchstate = digitalRead(2);
if (switchstate == LOW)
    digitalWrite(3, HIGH); 
    digitalWrite(4, HIGH); 
    digitalWrite(5, HIGH); 
    digitalWrite(6, HIGH); 
    digitalWrite(7, HIGH); 
    digitalWrite(8, HIGH); 
    digitalWrite(9, HIGH);
}
 

    digitalWrite(3, HIGH); 
    digitalWrite(4, LOW); 
    digitalWrite(5, LOW); 
    digitalWrite(6, LOW); 
    digitalWrite(7, LOW); 
    digitalWrite(8, LOW); 
    digitalWrite(9, LOW);

    delay(250);
    digitalWrite(3, LOW); 
    digitalWrite(4, HIGH); 
    digitalWrite(5, LOW); 
    digitalWrite(6, LOW); 
    digitalWrite(7, LOW); 
    digitalWrite(8, LOW); 
    digitalWrite(9, LOW);

    delay(250);
    digitalWrite(3, LOW); 
    digitalWrite(4, LOW); 
    digitalWrite(5, HIGH); 
    digitalWrite(6, LOW); 
    digitalWrite(7, LOW); 
    digitalWrite(8, LOW); 
    digitalWrite(9, LOW);


    
    
  
  
  
int keyVal = analogRead(A0);
  Serial.println(keyVal);
  
  if (keyVal >= 2 && keyVal <= 5) {
    tone(13, notes[0]);
  } else if (keyVal >= 143 && keyVal <= 146) {
    tone(13, notes[1]);
  } else if (keyVal >= 118 && keyVal <= 121) {
    tone(13, notes[2]);
  } else if (keyVal >= 101 && keyVal <= 110) {
    tone(13, notes[3]);
  } else if (keyVal >= 245 && keyVal <= 250) {
    tone(13, notes[4]);
  } else if (keyVal >= 295 && keyVal <= 300) {
    tone(13, notes[5]);
  } else if (keyVal >= 84 && keyVal <= 87) {
    tone(13, notes[6]);
      } else {
    noTone(13);
  }
}

Bonjour,

Formates correctement ton code (avec CTRL T ou CMD T) et tu verras qu'il manque des { et des } dans les instructions if ...

Merci de ta réponse , j'ai mis des parenthèses mais les notes de musiques ne s'enchainent toujours pas...

void loop() {

  { switchstate = digitalRead(2);
    if (switchstate == HIGH)
      digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
  }


  { switchstate = digitalRead(2);
    if (switchstate == LOW)
      digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);

  }



  {
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);

    delay(250);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);

    delay(250);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
  }
void loop() {

 { switchstate = digitalRead(2);
   if (switchstate == HIGH)
     digitalWrite(3, LOW);

Pourquoi il y a deux { qui se suivent ?
Tu vois qu'il n'y a qu'une instruction dans le if. Est-ce ce que tu veux?

 {
   digitalWrite(3, HIGH);
   digitalWrite(4, LOW);
   digitalWrite(5, LOW);
   digitalWrite(6, LOW);
   digitalWrite(7, LOW);
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);

   delay(250);
   digitalWrite(3, LOW);
   digitalWrite(4, HIGH);
   digitalWrite(5, LOW);
   digitalWrite(6, LOW);
   digitalWrite(7, LOW);
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);

   delay(250);
   digitalWrite(3, LOW);
   digitalWrite(4, LOW);
   digitalWrite(5, HIGH);
   digitalWrite(6, LOW);
   digitalWrite(7, LOW);
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
 }

Pourquoi ces blocs ?

...

En fait ce que je veux faire , c'est avoir un code qui fait que des notes de musiques s'enchaînent pour donner une mélodie et la j'ai fait toutes les notes mais je n'arrive pas a enchainer les notes , quand je demarre le code , une note s'entend et c'est tout. Les blocs c'est pour dire que toute les notes sont en off sauf celle qui va marché, et ça, a chaque note. Il faut surement une autre instruction avec le "if" mais je suis perdu. Et pour les 2 parenthèses qui se suivent je sais pas , mais ça change rien si je l’enlève. Merci de m'aider :cry:

Mise a jour : Les sons ne s’enchainent toujours pas mais je crois que j’ai compris le probleme : quand je branche le 5V sur une resistance, j’ai une note , et cela sur les 7 resistances, donc je peux jouer la mélodie mais en debranchant rebranchant a chaque fois ce qui est pas tres pratique parce que moi je veux que ça soit automatisé ^^. Donc a mon avis c’est le 5V qui ne delivre pas assez de puissance pour les 7 resistances…Voila , si quelqun a une solution ou peut me confirmer ce que je dis ça serait cool :slight_smile: Merci. Mise a jour de mon code :

int notes[] = {261, 294, 330, 349, 392, 440, 493};
int switchstate = 0;
void setup() {
  Serial.begin(9600);
  // declare the notes pins as outputs
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
}
void loop() {

    digitalWrite(3, HIGH);
 
    digitalWrite(4, HIGH);
    
    digitalWrite(5, HIGH);
    
    digitalWrite(3, HIGH);
   
    digitalWrite(5, HIGH);
    

    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    delay(200);

  








  int keyVal = analogRead(A0);
  Serial.println(keyVal);

  if (keyVal >= 2 && keyVal <= 5) {
    tone(13, notes[0]);
  } else if (keyVal >= 90 && keyVal <= 91) {
    tone(13, notes[1]);
  } else if (keyVal >= 344 && keyVal <= 346) {
    tone(13, notes[2]);
  } else if (keyVal >= 283 && keyVal <= 286) {
    tone(13, notes[3]);
  } else if (keyVal >= 114 && keyVal <= 117) {
    tone(13, notes[4]);
  } else if (keyVal >= 130 && keyVal <= 135) {
    tone(13, notes[5]);
  } else if (keyVal >= 155 && keyVal <= 160) {
    tone(13, notes[6]);
  } else {
    noTone(13);
  }
}

Regardes bien ce que donne ton code correctement formaté

int notes[] = {261, 294, 330, 349, 392, 440, 493};
int switchstate = 0;
void setup() {
  Serial.begin(9600);
  // declare the switch pin as an input
  pinMode(2, INPUT);
  // declare the notes pins as outputs
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
}
void loop() {

  switchstate = digitalRead(2);
  if (switchstate == HIGH)
    digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);


  switchstate = digitalRead(2);
  if (switchstate == LOW)
    digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
}


digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);

delay(250);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);

delay(250);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);







int keyVal = analogRead(A0);
Serial.println(keyVal);

if (keyVal >= 2 && keyVal <= 5) {
  tone(13, notes[0]);
} else if (keyVal >= 143 && keyVal <= 146) {
  tone(13, notes[1]);
} else if (keyVal >= 118 && keyVal <= 121) {
  tone(13, notes[2]);
} else if (keyVal >= 101 && keyVal <= 110) {
  tone(13, notes[3]);
} else if (keyVal >= 245 && keyVal <= 250) {
  tone(13, notes[4]);
} else if (keyVal >= 295 && keyVal <= 300) {
  tone(13, notes[5]);
} else if (keyVal >= 84 && keyVal <= 87) {
  tone(13, notes[6]);
} else {
  noTone(13);
}
}

On voit bien qu’il y a un problème au deuxième if. Il y a un crochet fermant sans crochet ouvrant.

Si j'ai bien compris ce que tu veux faire:
Tu génères un motif sur les sorties de l'arduino et tu fais une conversion digitale analogique avec tes résistances
Tu lies la valeur de la tension et tu génère une note suivant cette valeur.
Tu veux enchainer ces notes.

Tel que conçu ton programme n'a aucune chance de fonctionner car tu ne génère la note que pour la dernière valeur.
Si tu veux garder la structure de ton programme tel quel, il faut mettre la partie lecture de la tension et génération des notes dans un sous programme et l'appeler après chaque écriture dans les 7 sorties
Encore mieux tu pourrais mettre les valeurs des sorties dans une table et faire une boucle

Ensuite on ne vois pas tellement l’intérêt de générer une tension, la lire et suivant cette valeur jouer la note. Il suffirait de jouer directement la note

Re ! Merci pour tes conseils j'ai réussis a enchainer les notes en changeant tout le code comme tu m'a dit mais la je n'arrive pas a faire les notes, ça me fait des sons bizarres alors que j'ai mis les bonnes fréquences normalement :confused: Quel qu'un sait comment régler mon problème ? le code :

int notes[] = {262, 294, 330, 349, 392, 440, 493};

void setup() {
  //start serial communication
  Serial.begin(9600);

}

void loop() {
 
    tone(13, notes[1]);
    delay(400);
    tone(13, notes[2]);
    delay(400);
    tone(13, notes[3]);
    delay(400);
    tone(13, notes[1]);
    delay(400);
    tone(13, notes[3]);
    delay(400);
    tone(13, notes[1]);
    delay(400);
    tone(13, notes[3]);
    delay(700);
    tone(13, notes[2]);
    delay(400);
    tone(13, notes[3]);
    delay(400);
    tone(13, notes[4]);
    delay(400);
    tone(13, notes[4]);
    delay(400);
    tone(13, notes[3]);
    delay(400);
    tone(13, notes[2]);
    delay(400);
    tone(13, notes[4]);
    delay(400);

Merci :slight_smile:

Ca devrait fonctionner. Qu'est ce que tu as comme piezo ou haut parleur?

j'ai celui livré avec le starter kit , un petit. Et avec le code d'avant j'avais les bonnes notes donc ça veut dire que c'est pas un problème de haut parleur

C'est bon j'ai réussis ! C'etais parce que au lieu de mettre [note 1] fallait mettre note 0 et du coup fallait tout remplacer ! merci !

Ca devrait fonctionner, mais il est sur qu'un petit piezo ne doit pas donner un son extraordinaire.
Peut être que tu n'y prêtais pas attention en jouant les notes une par une et que ça s'entend plus en enchaînant les notes.

CorentiNoW:
C'est bon j'ai réussis ! C'etais parce que au lieu de mettre [note 1] fallait mettre note 0 et du coup fallait tout remplacer ! merci !

Tu n'est pas obligé d'utiliser un tableau.
Tu peux définir les notes pas leur nom

const int do_=262, re=294, mi=330, fa=349, sol=392, la=440, si=493;