Serial

Bonjour

Je viens vous demander un peu d'aide car je me suis perdu dans mon code, mon
problème vient après la ligne
Serial.println(noteDuration); // affiche durée des notes
Je veux utiliser ce qui s'affiche dans le moniteur série pour activer le servo moteur.
Pourriez-vous m'orienter ?

Merci.

 */
#include "pitches.h"
#include <Servo.h>

Servo boucheServo1;
int pinServo = 9;

int melody[] = {
NOTE_E4, NOTE_E4, NOTE_E4, NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_G4 ,NOTE_C4,NOTE_D4,NOTE_E4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_D4,NOTE_D4,NOTE_E4,NOTE_D4,NOTE_G4, NOTE_E4, NOTE_E4, NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4 ,NOTE_G4,NOTE_C4,NOTE_D4,NOTE_E4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_G4,NOTE_G4,NOTE_F4,NOTE_D4,NOTE_C4};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
2,2,4,2,2,4,2,2,2,1,8,2,2,2,1,2,2,2,1,1,2,2,2,2,4,4,2,2,4,2,2,4,2,2,2,1,8,2,2,2,2,2,2,2,1,1,2,2,2,2,8 };

void setup() {
Serial.begin(9600);
for (int thisNote = 0; thisNote < 51; thisNote++) {

int noteDuration = noteDurations[thisNote]*95;
tone(8, melody[thisNote],noteDuration);

int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);


}
 boucheServo1.attach(pinServo);
}

void loop() {
for (int thisNote = 0; thisNote < 51; thisNote++) {

int noteDuration = noteDurations[thisNote]*95;
tone(8, melody[thisNote],noteDuration);

int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);

Serial.println(noteDuration); // affiche durée des notes
}
// Là je veux que le programme lise ce que vient d'afficher noteDuration dans le terminal série
// Et en fonction du résultat mon servomoteur s'active.
 if (Serial.read() == 95) 
  {
    boucheServo1.write(115);

    delay(10);
  } 

else if (Serial.read() == 190)
{
  boucheServo1.write(125);

    delay(10);
}

 else if (Serial.read() == 380)
{
  boucheServo1.write(135);

    delay(10);
}
else if (Serial.read() == 760)
{
   boucheServo1.write(145);

    delay(10);
}

delay(1500);
}

Bonjour,

J'avoue que je ne comprend pas ce que tu essaies de lire sur la liaison série.
Si j'ai bien compris ce que tu veux faire: actionner le servo en fonction de noteDuration, il suffit de tester noteDuration.

void loop() {
  for (int thisNote = 0; thisNote < 51; thisNote++) {

    int noteDuration = noteDurations[thisNote] * 95;
    tone(8, melody[thisNote], noteDuration);

    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);

    Serial.println(noteDuration); // affiche durée des notes

    // Là je veux que le programme lise ce que vient d'afficher noteDuration dans le terminal série
    // Et en fonction du résultat mon servomoteur s'active.
    if (noteDuration == 95)
    {
      boucheServo1.write(115);

      delay(10);
    }

    else if (noteDuration == 190)
    {
      boucheServo1.write(125);

      delay(10);
    }

    else if (noteDuration == 380)
    {
      boucheServo1.write(135);

      delay(10);
    }
    else if (noteDuration == 760)
    {
      boucheServo1.write(145);

      delay(10);
    }
  }
  delay(1500);
}

Tu pourrais remplacer des if else par une instruction switch.

Merci Kamill
Je vais faire comme tu dis et ça va me simplifier la vie.

Je reposte mon code que j'ai coupé en deux pour plus de lisibilité et de compréhension.
Mon projet:
faire fonctionner un servomoteur dans la bouche d'une marionnette pour la faire chanter.

Problème :1
Je ne comprends pas pourquoi
Serial.println(noteDuration);
me renvoie pour valeur 95 pour durée 1, 190 pour 2,380 pour 4 et 760 pour 8.

Voilà la partie du code:

#include <Servo.h>
#include "pitches.h"

Servo boucheServo1;
int pinServo = 9;


int melody[] = {
NOTE_E4, NOTE_E4, NOTE_E4, NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_G4 ,NOTE_C4,NOTE_D4,NOTE_E4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_D4,NOTE_D4,NOTE_E4,NOTE_D4,NOTE_G4, NOTE_E4, NOTE_E4, NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4 ,NOTE_G4,NOTE_C4,NOTE_D4,NOTE_E4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_G4,NOTE_G4,NOTE_F4,NOTE_D4,NOTE_C4};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
2,2,4,2,2,4,2,2,2,1,8,2,2,2,1,2,2,2,1,1,2,2,2,2,4,4,2,2,4,2,2,4,2,2,2,1,8,2,2,2,2,2,2,2,1,1,2,2,2,2,8 };


void setup() {
  Serial.begin(9600);

for (int thisNote = 0; thisNote < 51; thisNote++) {

int noteDuration = noteDurations[thisNote]*95;
tone(A0, melody[thisNote],noteDuration); // A0 es la sortie de l arduino

int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);

}
  boucheServo1.attach(pinServo);
}

void loop() {
 
for (int thisNote = 0; thisNote < 51; thisNote++) {

int noteDuration = noteDurations[thisNote]*95;
tone(8, melody[thisNote],noteDuration);

int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);

Serial.println(noteDuration);// renvois 95 pour durée 1, 190 pour 2,380 pour 4 et 760 pour 8.
}

Maintenant la partie 2 :
switch

Lorsque je vérifie le code j'ai ce message d’erreur.
'noteDuration' was not declared in this scope

voilà le code:

#include <Servo.h>
#include "pitches.h"

Servo boucheServo1;
int pinServo = 9;


int melody[] = {
NOTE_E4, NOTE_E4, NOTE_E4, NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_G4 ,NOTE_C4,NOTE_D4,NOTE_E4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_D4,NOTE_D4,NOTE_E4,NOTE_D4,NOTE_G4, NOTE_E4, NOTE_E4, NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4 ,NOTE_G4,NOTE_C4,NOTE_D4,NOTE_E4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_G4,NOTE_G4,NOTE_F4,NOTE_D4,NOTE_C4};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
2,2,4,2,2,4,2,2,2,1,8,2,2,2,1,2,2,2,1,1,2,2,2,2,4,4,2,2,4,2,2,4,2,2,2,1,8,2,2,2,2,2,2,2,1,1,2,2,2,2,8 };


void setup() {
  Serial.begin(9600);

for (int thisNote = 0; thisNote < 51; thisNote++) {

int noteDuration = noteDurations[thisNote]*95;
tone(A0, melody[thisNote],noteDuration); // A0 es la sortie de l arduino

int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);

}
  boucheServo1.attach(pinServo);
}

void loop() {
 
for (int thisNote = 0; thisNote < 51; thisNote++) {

int noteDuration = noteDurations[thisNote]*95;
tone(8, melody[thisNote],noteDuration);

int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);

Serial.println(noteDuration);// renvois 95 pour durée 1, 190 pour 2,380 pour 4 et 760 pour 8.
}
/*-------------------------------------------------------------
----------------partie 2---------------------------------------
---------------------------------------------------------------*/

 switch (noteDuration)  { // debut de la structure
    case 95: 
      boucheServo1.write(115);
      break;
      
    case 190: 
       boucheServo1.write(125);
      break;
      
       case 380: 
        boucheServo1.write(135);
      break;
      
       case 760: 
        boucheServo1.write(145);
      break;
      

} //fin du switch

delay(1500);
}

Merci.

rd35520:
Lorsque je vérifie le code j'ai ce message d’erreur.
'noteDuration' was not declared in this scope

Le } de fin du for ne doit pas être avant le partie 2, mais après (regarde le code que je t'ai suggéré)

rd35520:
Problème :1
Je ne comprends pas pourquoi
Serial.println(noteDuration);
me renvoie pour valeur 95 pour durée 1, 190 pour 2,380 pour 4 et 760 pour 8.

Ben c'est parce que tu multiplies par 95. :wink:

int noteDuration = noteDurations[thisNote]*95;

Merci Kamill tout fonctionne.

Content pour toi
Je te conseille de mettre ton délaidelay(pauseBetweenNotes);a la fin de la partie 2 (avant le }), car si tu le mets avant comme actuellement tu vas avoir du retard entre la note et l'actionnement du servo.