Exécuter un ordre qu'une fois avec un bouton

Bonjour j'ai créer une voie qui se lance quand j'appuis sur un bouton, mais quand il est actionner la voie ce lance en boucle et ne s'arrête pas.

#include <talkietz.h>

const byte Button_Marche     = 8;
char DIO_Buzzer              = 3;  //enceinte
long etatButton_Marche       = HIGH;

const unsigned char PS_16 = (1 << ADPS2);
const unsigned char PS_32 = (1 << ADPS2) | (1 << ADPS0);
const unsigned char PS_64 = (1 << ADPS2) | (1 << ADPS1);
const unsigned char PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

Talkie voice;
//ok
const uint8_t spW089587 [] PROGMEM = {0xA3, 0x74, 0xBA, 0xD7, 0x95, 0xF3, 0xAD, 0xD2, 0xE9, 0x2F, 0xE2, 0x5C, 0x77, 0x32, 0xCF, 0xAF, 0x99, 0x33, 0xDD, 0x48, 0x5D, 0x1A, 0x86, 0xEC, 0xD6, 0xAE, 0xF4, 0x9D, 0xC1, 0x27, 0x94, 0xB2, 0x4A, 0xEA, 0x30, 0x8E, 0xB2, 0x03, 0xC3, 0xDB, 0xCD, 0x2D, 0x4C, 0x1D, 0x9F, 0x62, 0x72, 0x56, 0xEB, 0xAA, 0x73, 0xA6, 0xA5, 0x99, 0x75, 0x6A, 0xD6, 0x99, 0x86, 0x61, 0xD1, 0xEE, 0x5B, 0x67, 0xE9, 0x0A, 0x2D, 0x7B, 0x6A, 0x9F, 0xB5, 0x09, 0x96, 0x9C, 0xA9, 0x5C, 0xA8, 0x4C, 0x39, 0x77, 0x2A, 0xB0, 0xA3, 0x12, 0x95, 0xBC, 0x0D, 0x41, 0x0F};
//attention
const uint8_t spW010458 [] PROGMEM = {0xA7, 0x2C, 0xAE, 0xBA, 0xD4, 0x27, 0x9F, 0x32, 0xD7, 0x4A, 0xB3, 0x8E, 0x7C, 0x8A, 0x66, 0xA2, 0x82, 0x2B, 0xD1, 0xC9, 0xBB, 0x95, 0x34, 0x8F, 0xD8, 0x27, 0x6B, 0x5A, 0x5C, 0xDD, 0x66, 0x9B, 0x2A, 0x63, 0xB1, 0x48, 0x4B, 0x0C, 0x0E, 0x18, 0xDC, 0xF4, 0x44, 0x93, 0x9B, 0xB9, 0x86, 0x95, 0x13, 0x27, 0xDE, 0x2D, 0xA2, 0x9D, 0x4F, 0x9C, 0xE8, 0x34, 0x0B, 0x77, 0x3E, 0x71, 0x26, 0x5E, 0x95, 0xD0, 0x66, 0x25, 0x91, 0x66, 0xA6, 0x69, 0xE2, 0x95, 0x0E, 0xA8, 0xC9, 0x22, 0x69, 0x4E, 0xFE, 0x9D, 0x96, 0x92, 0xC8, 0x59, 0xC1, 0x6F, 0x99, 0x13, 0x1A, 0x79, 0x35, 0xFF, 0x4C, 0x4C, 0x49, 0x92, 0xD5, 0xFC, 0xB7, 0x3D, 0xE5, 0x66, 0x56, 0xF4, 0xC7, 0x4D, 0x67, 0x9A, 0x5D, 0xD1, 0x5F, 0x77, 0x55, 0x61, 0x26, 0x01, 0x77, 0x8C, 0x25, 0x60, 0xCF, 0xD6, 0xD3, 0x8E, 0x24, 0x42, 0x1E, 0x4D, 0xCE, 0x58, 0x2C, 0x4B, 0x4C, 0xB6, 0x3A, 0x73, 0x32, 0x6A, 0x96, 0xB6, 0x78, 0xAD, 0xD1, 0x59, 0xB2, 0xC6, 0x9C, 0xB1, 0x07, 0x6E, 0x13, 0x22, 0x49, 0xDB, 0x11, 0x48, 0x4D, 0x18, 0xDB, 0x29, 0x57, 0x20, 0x35, 0xE6, 0x62, 0xBB, 0xDC, 0x81, 0x45, 0x7B, 0x68, 0xE4, 0x07};
//prêt
const uint8_t spW101286 [] PROGMEM = {0xAB, 0xA8, 0xAE, 0x3D, 0x43, 0x2C, 0x9D, 0xA2, 0xAA, 0x0B, 0x15, 0x0B, 0x7D, 0x8A, 0xA6, 0x3F, 0xD9, 0xCC, 0xCA, 0x29, 0x4B, 0x1C, 0x13, 0x09, 0x3B, 0xA7, 0x6B, 0x3A, 0xDD, 0x39, 0x6B, 0x9F, 0xA9, 0xB8, 0x74, 0xE9, 0x0C, 0x73, 0x96, 0x12, 0x42, 0x73, 0x22, 0xCE, 0xD9, 0x8A, 0x8E, 0x88, 0x1A, 0xB3, 0xE7, 0x68, 0x5A, 0x22, 0xAA, 0x23, 0x9D, 0xAB, 0x6B, 0xE7, 0xEC, 0x32, 0xA3, 0x00, 0xCC, 0x2C, 0xE1, 0x01};
//pilote
const uint8_t spW095753 [] PROGMEM = {0x06, 0xB0, 0xDA, 0x9D, 0xD0, 0xCE, 0xB8, 0x55, 0x4F, 0x93, 0x93, 0xAC, 0x5A, 0xA1, 0x42, 0x72, 0x4E, 0xB2, 0x5B, 0x32, 0xB0, 0x3A, 0x39, 0xD9, 0xC0, 0x22, 0x56, 0x33, 0xFB, 0xE4, 0x1D, 0x91, 0x67, 0x4F, 0xA5, 0x53, 0x0C, 0x2E, 0xAC, 0x55, 0x8D, 0x4F, 0xDF, 0x11, 0xC5, 0x74, 0xD6, 0x3C, 0x53, 0xC3, 0x1C, 0x9E, 0x59, 0xE7, 0xCC, 0x45, 0x6A, 0x78, 0xE6, 0xCC, 0xB3, 0x16, 0x6D, 0xA9, 0x96, 0xB3, 0xCE, 0x96, 0x55, 0x94, 0x6A, 0xCC, 0x3A, 0x7B, 0x65, 0xDA, 0xED, 0x5C, 0xEB, 0x94, 0x95, 0x7A, 0x99, 0x67, 0xA5, 0x51, 0x36, 0x16, 0x46, 0x12, 0x93, 0x58, 0xE9, 0x91, 0x8B, 0x78, 0xD6, 0x86, 0x07};
//regardez
const uint8_t spW108538 [] PROGMEM = {0x67, 0xC8, 0x22, 0x5A, 0xA5, 0xD2, 0x9C, 0x29, 0x8B, 0x2E, 0x65, 0x6F, 0x77, 0xC6, 0xA4, 0xA6, 0x98, 0xB3, 0xED, 0x69, 0x93, 0xE8, 0x32, 0xF6, 0x34, 0xA7, 0xCE, 0xB2, 0xCA, 0xD8, 0xD2, 0x9E, 0xB2, 0x0A, 0xAF, 0x50, 0xF5, 0x76, 0xF2, 0xCA, 0xAC, 0xDD, 0x3C, 0xEB, 0xC9, 0x32, 0xF5, 0xB0, 0xE8, 0x34, 0x27, 0xAF, 0x46, 0xC9, 0x3A, 0x5C, 0xB5, 0x3C, 0x4A, 0xB6, 0x3E, 0xB3, 0xBC, 0xAA, 0xA1, 0x45, 0x28, 0xB2, 0xCA, 0x69, 0xBB, 0x12, 0xE1, 0xEA, 0x4A, 0xA7, 0x6B, 0x41, 0x85, 0xA3, 0x6A, 0x9F, 0xAE, 0x05, 0x57, 0xB5, 0x88, 0x75, 0xBA, 0xE6, 0xC2, 0x55, 0x23, 0xF2, 0xE9, 0x87, 0x0A, 0x77, 0x95, 0xD8, 0x67, 0x6C, 0xA2, 0x5D, 0xC4, 0x6B, 0x9D, 0xB1, 0x88, 0x72, 0x55, 0xAF, 0x7D, 0x86, 0x2A, 0xC3, 0x43, 0xA4, 0xCE, 0x19, 0x8A, 0x2C, 0x57, 0xF2, 0xD9, 0x00, 0xE0, 0x00, 0x22, 0xCB, 0xCE, 0x5A, 0x89, 0xB8, 0x4F, 0x4D, 0x3A, 0x7B, 0x92, 0xEA, 0xB9, 0x53, 0xE9, 0x9C, 0x9D, 0x91, 0xFB, 0xD4, 0xAC, 0x73, 0x35, 0xCA, 0x9E, 0xDB, 0x13, 0xD7, 0xDA, 0xB8, 0x88, 0xDF, 0x4C, 0x1C, 0x7F, 0x65, 0x22, 0xB1, 0x5B, 0x11, 0x1E};
//les
const uint8_t spW076505 [] PROGMEM = {0x6D, 0xCC, 0x09, 0xB8, 0x32, 0x93, 0x8E, 0x31, 0x17, 0xB0, 0xD6, 0x5A, 0x7A, 0x86, 0x9C, 0x91, 0xCB, 0xB3, 0xDD, 0x98, 0x22, 0x71, 0xB3, 0x9E, 0x5A, 0x6B, 0xC9, 0xD4, 0xCD, 0x27, 0x2A, 0x9D, 0xAD, 0x2B, 0x11, 0xAD, 0x9C, 0x75, 0xB6, 0xA1, 0x55, 0xA4, 0x7B, 0xD6, 0xD9, 0x87, 0x57, 0xC6, 0x99, 0x5A, 0x67, 0x1F, 0x4E, 0x89, 0x73, 0x66, 0xAD, 0xA3, 0x73, 0x66, 0xEB, 0xAD, 0x08, 0xF0};
//feu
const uint8_t spW056108 [] PROGMEM = {0x83, 0x9B, 0x61, 0xDA, 0xC5, 0xEA, 0x02, 0x04, 0xA0, 0xDB, 0xF0, 0x00, 0xF4, 0xD0, 0x06, 0x70, 0x9A, 0x24, 0xCD, 0x3D, 0xA3, 0xD1, 0x5A, 0xAC, 0x0B, 0xF3, 0xAE, 0x58, 0x67, 0x75, 0xBA, 0xC2, 0x3B, 0x1B, 0x9E, 0x2D, 0xF0, 0xC8, 0x28, 0x6F, 0x05, 0xF0};

void setup() {
  // put your setup code here, to run once:
  pinMode(Button_Marche, INPUT); // met la broche le bouton en entrée
  ADCSRA &= ~PS_128;
  ADCSRA |= PS_16;
  //Réglage des paramêtres de restitution vocale
  voice.SetSpeed(810); //entre 0 et 1023 . augmenter la valeur pour augmenter la vitesse. Valeur normal=800
  voice.SetPitch(700); //entre 0 et 1023 : Pitch normal=700. Augmenter pour rendre la voix plus aigue
  voice.SetBending(50);//entre 0 et 1023 : 0=pas de distortion ;   512=ion maximale ;  1023=pas de distortion
  voice.BendingOn();
  //voice.BendingOff(); //Pas de distortion du son
}

void loop() {
  // put your main code here, to run repeatedly:
  int b = 0;
  int a = digitalRead(Button_Marche);
  while (a == b) {
    voice.say(spW089587);
    delay(500);
    voice.say(spW010458);
    delay(30);
    voice.say(spW101286);
    delay(30);
    voice.say(spW095753);
    delay(1800);
    voice.say(spW108538);
    voice.say(spW076505);
    voice.say(spW056108);
  }
  (digitalWrite(DIO_Buzzer, LOW));
}

J'aimerais que cette voie ce lance quand j'appuis sur le bouton et quand elle a fini de parler elle s'arrête, et qu'elle se relance a la prochaine pression du bouton. Merci beaucoup

Bonjour,

Ton bouton n'est pas relu dans ton while.
Remplaces ton while par un if.

Remarque: ton b ne sert à rien car il est toujours à 0.

kamill:
Remplaces ton while par un if.

Ce n'est pas une formule magique :slight_smile:

avec un if, si bouton appuyé, tu passes une fois dans les { } où tu commandes des trucs.
ensuite, ça continue et tu sors de loop() ...
... pour y revenir tout de suite
là tu relis le bouton,
puis tu testes. Là ça marche.

biggil:
Ce n'est pas une formule magique :slight_smile:

Oui, c'est certain.
C'était pour faire simple. Avec le temps d'exécution dans les {} ça devrait raisonnablement fonctionner.

Je pense que tu fais référence à l'absence de test des rebonds, ainsi qu'à l'absence de test du relâchement du bouton.
Vu le temps passé dans les { }, au sortir l'utilisateur a déjà relâché le bouton. Sinon, ça recommence.

Ok merci beaucoup sa marche, et maintenant j'ai rajouter des feus et des bip a la suite et quand je veux réappuyer sur le bouton la voix ce lance plus je suis obliger de reset la carte pouvez vous m'aider ?
Code: [Select]

#include <talkietz.h>

  const byte Button_Marche     = 8;
  char DIO_Buzzer              = 3;  //enceinte
  const byte LED_vert          = 7;
  const byte LED_orange1       = 5;
  const byte LED_orange2       = 6;
  const byte LED_rouge         = 4;
  long etatButton_Marche       = HIGH;

  const unsigned char PS_16 = (1 << ADPS2);
  const unsigned char PS_32 = (1 << ADPS2) | (1 << ADPS0);
  const unsigned char PS_64 = (1 << ADPS2) | (1 << ADPS1);
  const unsigned char PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

  Talkie voice;
  //ok
  const uint8_t spW089587 [] PROGMEM = {0xA3, 0x74, 0xBA, 0xD7, 0x95, 0xF3, 0xAD, 0xD2, 0xE9, 0x2F, 0xE2, 0x5C, 0x77, 0x32, 0xCF, 0xAF, 0x99, 0x33, 0xDD, 0x48, 0x5D, 0x1A, 0x86, 0xEC, 0xD6, 0xAE, 0xF4, 0x9D, 0xC1, 0x27, 0x94, 0xB2, 0x4A, 0xEA, 0x30, 0x8E, 0xB2, 0x03, 0xC3, 0xDB, 0xCD, 0x2D, 0x4C, 0x1D, 0x9F, 0x62, 0x72, 0x56, 0xEB, 0xAA, 0x73, 0xA6, 0xA5, 0x99, 0x75, 0x6A, 0xD6, 0x99, 0x86, 0x61, 0xD1, 0xEE, 0x5B, 0x67, 0xE9, 0x0A, 0x2D, 0x7B, 0x6A, 0x9F, 0xB5, 0x09, 0x96, 0x9C, 0xA9, 0x5C, 0xA8, 0x4C, 0x39, 0x77, 0x2A, 0xB0, 0xA3, 0x12, 0x95, 0xBC, 0x0D, 0x41, 0x0F};
  //attention
  const uint8_t spW010458 [] PROGMEM = {0xA7, 0x2C, 0xAE, 0xBA, 0xD4, 0x27, 0x9F, 0x32, 0xD7, 0x4A, 0xB3, 0x8E, 0x7C, 0x8A, 0x66, 0xA2, 0x82, 0x2B, 0xD1, 0xC9, 0xBB, 0x95, 0x34, 0x8F, 0xD8, 0x27, 0x6B, 0x5A, 0x5C, 0xDD, 0x66, 0x9B, 0x2A, 0x63, 0xB1, 0x48, 0x4B, 0x0C, 0x0E, 0x18, 0xDC, 0xF4, 0x44, 0x93, 0x9B, 0xB9, 0x86, 0x95, 0x13, 0x27, 0xDE, 0x2D, 0xA2, 0x9D, 0x4F, 0x9C, 0xE8, 0x34, 0x0B, 0x77, 0x3E, 0x71, 0x26, 0x5E, 0x95, 0xD0, 0x66, 0x25, 0x91, 0x66, 0xA6, 0x69, 0xE2, 0x95, 0x0E, 0xA8, 0xC9, 0x22, 0x69, 0x4E, 0xFE, 0x9D, 0x96, 0x92, 0xC8, 0x59, 0xC1, 0x6F, 0x99, 0x13, 0x1A, 0x79, 0x35, 0xFF, 0x4C, 0x4C, 0x49, 0x92, 0xD5, 0xFC, 0xB7, 0x3D, 0xE5, 0x66, 0x56, 0xF4, 0xC7, 0x4D, 0x67, 0x9A, 0x5D, 0xD1, 0x5F, 0x77, 0x55, 0x61, 0x26, 0x01, 0x77, 0x8C, 0x25, 0x60, 0xCF, 0xD6, 0xD3, 0x8E, 0x24, 0x42, 0x1E, 0x4D, 0xCE, 0x58, 0x2C, 0x4B, 0x4C, 0xB6, 0x3A, 0x73, 0x32, 0x6A, 0x96, 0xB6, 0x78, 0xAD, 0xD1, 0x59, 0xB2, 0xC6, 0x9C, 0xB1, 0x07, 0x6E, 0x13, 0x22, 0x49, 0xDB, 0x11, 0x48, 0x4D, 0x18, 0xDB, 0x29, 0x57, 0x20, 0x35, 0xE6, 0x62, 0xBB, 0xDC, 0x81, 0x45, 0x7B, 0x68, 0xE4, 0x07};
  //prêt
  const uint8_t spW101286 [] PROGMEM = {0xAB, 0xA8, 0xAE, 0x3D, 0x43, 0x2C, 0x9D, 0xA2, 0xAA, 0x0B, 0x15, 0x0B, 0x7D, 0x8A, 0xA6, 0x3F, 0xD9, 0xCC, 0xCA, 0x29, 0x4B, 0x1C, 0x13, 0x09, 0x3B, 0xA7, 0x6B, 0x3A, 0xDD, 0x39, 0x6B, 0x9F, 0xA9, 0xB8, 0x74, 0xE9, 0x0C, 0x73, 0x96, 0x12, 0x42, 0x73, 0x22, 0xCE, 0xD9, 0x8A, 0x8E, 0x88, 0x1A, 0xB3, 0xE7, 0x68, 0x5A, 0x22, 0xAA, 0x23, 0x9D, 0xAB, 0x6B, 0xE7, 0xEC, 0x32, 0xA3, 0x00, 0xCC, 0x2C, 0xE1, 0x01};
  //pilote
  const uint8_t spW095753 [] PROGMEM = {0x06, 0xB0, 0xDA, 0x9D, 0xD0, 0xCE, 0xB8, 0x55, 0x4F, 0x93, 0x93, 0xAC, 0x5A, 0xA1, 0x42, 0x72, 0x4E, 0xB2, 0x5B, 0x32, 0xB0, 0x3A, 0x39, 0xD9, 0xC0, 0x22, 0x56, 0x33, 0xFB, 0xE4, 0x1D, 0x91, 0x67, 0x4F, 0xA5, 0x53, 0x0C, 0x2E, 0xAC, 0x55, 0x8D, 0x4F, 0xDF, 0x11, 0xC5, 0x74, 0xD6, 0x3C, 0x53, 0xC3, 0x1C, 0x9E, 0x59, 0xE7, 0xCC, 0x45, 0x6A, 0x78, 0xE6, 0xCC, 0xB3, 0x16, 0x6D, 0xA9, 0x96, 0xB3, 0xCE, 0x96, 0x55, 0x94, 0x6A, 0xCC, 0x3A, 0x7B, 0x65, 0xDA, 0xED, 0x5C, 0xEB, 0x94, 0x95, 0x7A, 0x99, 0x67, 0xA5, 0x51, 0x36, 0x16, 0x46, 0x12, 0x93, 0x58, 0xE9, 0x91, 0x8B, 0x78, 0xD6, 0x86, 0x07};
  //regardez
  const uint8_t spW108538 [] PROGMEM = {0x67, 0xC8, 0x22, 0x5A, 0xA5, 0xD2, 0x9C, 0x29, 0x8B, 0x2E, 0x65, 0x6F, 0x77, 0xC6, 0xA4, 0xA6, 0x98, 0xB3, 0xED, 0x69, 0x93, 0xE8, 0x32, 0xF6, 0x34, 0xA7, 0xCE, 0xB2, 0xCA, 0xD8, 0xD2, 0x9E, 0xB2, 0x0A, 0xAF, 0x50, 0xF5, 0x76, 0xF2, 0xCA, 0xAC, 0xDD, 0x3C, 0xEB, 0xC9, 0x32, 0xF5, 0xB0, 0xE8, 0x34, 0x27, 0xAF, 0x46, 0xC9, 0x3A, 0x5C, 0xB5, 0x3C, 0x4A, 0xB6, 0x3E, 0xB3, 0xBC, 0xAA, 0xA1, 0x45, 0x28, 0xB2, 0xCA, 0x69, 0xBB, 0x12, 0xE1, 0xEA, 0x4A, 0xA7, 0x6B, 0x41, 0x85, 0xA3, 0x6A, 0x9F, 0xAE, 0x05, 0x57, 0xB5, 0x88, 0x75, 0xBA, 0xE6, 0xC2, 0x55, 0x23, 0xF2, 0xE9, 0x87, 0x0A, 0x77, 0x95, 0xD8, 0x67, 0x6C, 0xA2, 0x5D, 0xC4, 0x6B, 0x9D, 0xB1, 0x88, 0x72, 0x55, 0xAF, 0x7D, 0x86, 0x2A, 0xC3, 0x43, 0xA4, 0xCE, 0x19, 0x8A, 0x2C, 0x57, 0xF2, 0xD9, 0x00, 0xE0, 0x00, 0x22, 0xCB, 0xCE, 0x5A, 0x89, 0xB8, 0x4F, 0x4D, 0x3A, 0x7B, 0x92, 0xEA, 0xB9, 0x53, 0xE9, 0x9C, 0x9D, 0x91, 0xFB, 0xD4, 0xAC, 0x73, 0x35, 0xCA, 0x9E, 0xDB, 0x13, 0xD7, 0xDA, 0xB8, 0x88, 0xDF, 0x4C, 0x1C, 0x7F, 0x65, 0x22, 0xB1, 0x5B, 0x11, 0x1E};
  //les
  const uint8_t spW076505 [] PROGMEM = {0x6D, 0xCC, 0x09, 0xB8, 0x32, 0x93, 0x8E, 0x31, 0x17, 0xB0, 0xD6, 0x5A, 0x7A, 0x86, 0x9C, 0x91, 0xCB, 0xB3, 0xDD, 0x98, 0x22, 0x71, 0xB3, 0x9E, 0x5A, 0x6B, 0xC9, 0xD4, 0xCD, 0x27, 0x2A, 0x9D, 0xAD, 0x2B, 0x11, 0xAD, 0x9C, 0x75, 0xB6, 0xA1, 0x55, 0xA4, 0x7B, 0xD6, 0xD9, 0x87, 0x57, 0xC6, 0x99, 0x5A, 0x67, 0x1F, 0x4E, 0x89, 0x73, 0x66, 0xAD, 0xA3, 0x73, 0x66, 0xEB, 0xAD, 0x08, 0xF0};
  //feu
  const uint8_t spW056108 [] PROGMEM = {0x83, 0x9B, 0x61, 0xDA, 0xC5, 0xEA, 0x02, 0x04, 0xA0, 0xDB, 0xF0, 0x00, 0xF4, 0xD0, 0x06, 0x70, 0x9A, 0x24, 0xCD, 0x3D, 0xA3, 0xD1, 0x5A, 0xAC, 0x0B, 0xF3, 0xAE, 0x58, 0x67, 0x75, 0xBA, 0xC2, 0x3B, 0x1B, 0x9E, 0x2D, 0xF0, 0xC8, 0x28, 0x6F, 0x05, 0xF0};

  void setup() {
    // put your setup code here, to run once:
    pinMode(Button_Marche, INPUT); // met la broche le bouton en entrée
    pinMode(LED_vert, OUTPUT); // met la broche la led en sortie
    pinMode(LED_orange1, OUTPUT); // met la broche la led en sortie
    pinMode(LED_orange2, OUTPUT); // met la broche la led en sortie
    pinMode(LED_rouge, OUTPUT); // met la broche la led en sortie
    ADCSRA &= ~PS_128;
    ADCSRA |= PS_16;
    //Réglage des paramêtres de restitution vocale
    voice.SetSpeed(810); //entre 0 et 1023 . augmenter la valeur pour augmenter la vitesse. Valeur normal=800
    voice.SetPitch(700); //entre 0 et 1023 : Pitch normal=700. Augmenter pour rendre la voix plus aigue
    voice.SetBending(50);//entre 0 et 1023 : 0=pas de distortion ;   512=ion maximale ;  1023=pas de distortion
    voice.BendingOn();
    //voice.BendingOff(); //Pas de distortion du son
  }

  void loop() {
    // put your main code here, to run repeatedly:
    int b = 0;
    int a = digitalRead(Button_Marche);
    if (a == b) {
      voice.say(spW089587);
      delay(500);
      voice.say(spW010458);
      delay(30);
      voice.say(spW101286);
      delay(30);
      voice.say(spW095753);
      delay(1800);
      voice.say(spW108538);
      voice.say(spW076505);
      voice.say(spW056108);

      delay(1000);

      (digitalWrite(LED_rouge, HIGH));
      tone(DIO_Buzzer, 632, 120);
      delay(120);
      (digitalWrite(LED_orange1, HIGH));
      tone(DIO_Buzzer, 632, 120);
      delay(120);
      (digitalWrite(LED_orange2, HIGH));
      tone(DIO_Buzzer, 632, 120);
      delay(60);
      delay(60);
      (digitalWrite(LED_vert, HIGH));
      tone(DIO_Buzzer, 632, 2250);
      delay(2250);
      (digitalWrite(LED_rouge, LOW));
      (digitalWrite(LED_orange1, LOW));
      (digitalWrite(LED_orange2, LOW));
      (digitalWrite(LED_vert, LOW));
      (digitalWrite(DIO_Buzzer, LOW));
     
   
    }

  }

Merci beaucoup

[color=#222222]​[/color]

Bonjour,

A mon avis il y a incompatibilité entre la bibliothèque talkietz et le fait d'utiliser la même pin avec tone ou digitalWrite.

Le code justifié à droite, je n'avais encore jamais vu ! ça pique les yeux ! :fearful:
kamill, as tu vraiment lu le code ? Es-tu un robot ?

Quand quent_r37 ajoute les bips (avec tone) ça ne fonctionne plus, donc on peut supposer que ça vient de là.
Quand on regarde le code de digitalWrite on voit qu'il supprime la configuration pwm de la pin, ça confirme l'incompatibilité.

Excusez moi pour le code a droite c'est quand j'ai fait copier coller sa a bugger.
Et sinon oui peut être un bug de compatibilités vu que j'utilise le même pin je vais essayer en utilisant un autre pin et en le branchant en parallèle de l'enceinte pour voir ce que sa donne.

Donc après changement du pin pour le bip donc j'ai ma vocal brancher sur le 3 et le bip sur le 9 sa marche mais toujours le problème quand je veux relancer le programme.

Ensuite j'ai tester en changeant d'enceinte et toujours le même problème et j'ai aussi essayer en faisant une enceinte pour la vocal et une enceinte pour le bip toujours pareille donc sa viendrait du programme.

Tone utilise le timer 2. Donc quelle que soit la pin utilisée, il va y avoir un problème.
Il faut reconfigurer le timer après utilisation de tone.

void loop() {
  int a = digitalRead(Button_Marche);
  if (a == 0) {
    voice.say(spW089587);
    delay(500);
    voice.say(spW010458);
    delay(30);
    voice.say(spW101286);
    delay(30);
    voice.say(spW095753);
    delay(1800);
    voice.say(spW108538);
    voice.say(spW076505);
    voice.say(spW056108);

    delay(1000);

    (digitalWrite(LED_rouge, HIGH));
    tone(DIO_Buzzer, 632, 120);
    delay(120);
    (digitalWrite(LED_orange1, HIGH));
    tone(DIO_Buzzer, 632, 120);
    delay(120);
    (digitalWrite(LED_orange2, HIGH));
    tone(DIO_Buzzer, 632, 120);
    delay(60);
    delay(60);
    (digitalWrite(LED_vert, HIGH));
    tone(DIO_Buzzer, 632, 2250);
    delay(2250);
    (digitalWrite(LED_rouge, LOW));
    (digitalWrite(LED_orange1, LOW));
    (digitalWrite(LED_orange2, LOW));
    (digitalWrite(LED_vert, LOW));
    (digitalWrite(DIO_Buzzer, LOW));

    reInitTalkie();
  }
}

void reInitTalkie()
{
  // Timer 2 set up as a 62500Hz PWM.
  //
  // The PWM 'buzz' is well above human hearing range and is
  // very easy to filter out.
  //
  TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(CS20);
  TIMSK2 = 0;
}

Ok merci beaucoup je ne savais pas qu'on pouvez réinitialiser une bibliothèques comme sa.
J'avais une dernière question car après je veux faire en sorte que quand j'appuis sur mon bouton pour lancer le programme je puisse le stopper n'importe quand (avant que le feu vert s'allume) en réappuyant sur ce même bouton. Je n'est rien trouver sur internet qui puisse m'aider la dessus j'ai juste trouver mais il me faudrait un deuxième bouton. Pouvez vous m'éclairer la dessus svp merci.

Pour faire les choses bien, il faudrait complètement réorganiser ton programme en utilisant une machine d'état.

Comme tu as des délais tout le long de ton programme, tu peux aussi faire plus simple (mais moins élégant), sans modifier la structure de ton programme, en testant le bouton pendant les delay (que tu remplaces pas une autre fonction) et en cas d'appui, tu arrêtes.

kamill:
Quand quent_r37 ajoute les bips (avec tone) ça ne fonctionne plus, donc on peut supposer que ça vient de là.
Quand on regarde le code de digitalWrite on voit qu'il supprime la configuration pwm de la pin, ça confirme l'incompatibilité.

pour compléter, extrait de la doc de la librairie en question

Note that Talkie uses Timers 1 and 2 for this purpose, which may conflict with PWM outputs or other libraries.

j'ai essayer de faire lire la valeur de mon bouton juste sur la partie vocal pour essayer mais sa ne marche pas, pouvez vous m'éclairer ?
j'ai changer un peut la disposition de mon code histoire d'être plus claire (fin je pense) je c'est pas si j'ai bien fait

void loop() {
  // put your main code here, to run repeatedly:
  
  int b = 0;
  int a = digitalRead(Button_Marche);
  if (a == b) {

    stopprogramme();
    vocal();
    stopprogramme();
    delay(2000);
    stopprogramme();
    BIP();
    reInitTalkie();

  }
}

void vocal() {

  stopprogramme();
  voice.say(spW089587);
  stopprogramme();
  delay(500);
  stopprogramme();
  voice.say(spW010458);
  stopprogramme();
  delay(30);
  stopprogramme();
  voice.say(spW101286);
  stopprogramme();
  delay(30);
  stopprogramme();
  voice.say(spW095753);
  stopprogramme();
  delay(1800);
  stopprogramme();
  voice.say(spW108538);
  stopprogramme();
  voice.say(spW076505);
  stopprogramme();
  voice.say(spW056108);
  stopprogramme();

}

void BIP() {


  (digitalWrite(LED_rouge, HIGH));
  tone(DIO_BuzzerBIP, 632, 120);
  delay(120);
  (digitalWrite(LED_orange1, HIGH));
  tone(DIO_BuzzerBIP, 632, 120);
  delay(120);
  (digitalWrite(LED_orange2, HIGH));
  tone(DIO_BuzzerBIP, 632, 120);
  delay(60);
  delay(60);
  (digitalWrite(LED_vert, HIGH));
  tone(DIO_BuzzerBIP, 632, 2250);
  delay(2250);
  (digitalWrite(LED_rouge, LOW));
  (digitalWrite(LED_orange1, LOW));
  (digitalWrite(LED_orange2, LOW));
  (digitalWrite(LED_vert, LOW));
  (digitalWrite(DIO_BuzzerBIP, LOW));
}

void reInitTalkie() {
  // Timer 2 configuré comme un PWM 62500Hz.
  //
  // Le `` buzz '' PWM est bien au-dessus de la plage d'audition humaine et est
  //très facile à filtrer.
  //
  TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(CS20);
  TIMSK2 = 0;
}

void stopprogramme() {
  int b = 1;
  int a = digitalRead(Button_Marche);
  if (a == b) {
    (digitalWrite(LED_rouge, LOW));
    (digitalWrite(LED_orange1, LOW));
    (digitalWrite(LED_orange2, LOW));
    (digitalWrite(LED_vert, LOW));
    (digitalWrite(DIO_BuzzerBIP, LOW));
  }
}

Le problème est que stopprogramme est exécuté une fois de temps en temps. Il a toutes les chances de rater l'appui sur la touche.
Moi j'aurais fait quelquechose de ce genre (en partant de ton programme précédent):

bool etatButtonPrec = false; // état précédent du bouton
jmp_buf buf;

void loop() {
  int cr = setjmp(buf);
  if (cr == 1)
  {
    Serial.println("setjmp");
    // éteint les leds au cas ou on aurait arrêter la boucle avec les leds allumées
    digitalWrite(LED_rouge, LOW);
    digitalWrite(LED_orange1, LOW);
    digitalWrite(LED_orange2, LOW);
    digitalWrite(LED_vert, LOW);
    digitalWrite(DIO_Buzzer, LOW);
  }

  bool etatButton = !digitalRead(Button_Marche);
  if (etatButton != etatButtonPrec) {
    Serial.println(etatButton);
    etatButtonPrec = etatButton;
    if (etatButton)
    {
      reInitTalkie();

      voice.say(spW089587);
      delaiTestStop(500);
      voice.say(spW010458);
      delaiTestStop(30);
      voice.say(spW101286);
      delaiTestStop(30);
      voice.say(spW095753);
      delaiTestStop(1800);
      voice.say(spW108538);
      voice.say(spW076505);
      voice.say(spW056108);

      delaiTestStop(1000);

      digitalWrite(LED_rouge, HIGH);
      tone(DIO_Buzzer, 632, 120);
      delaiTestStop(120);
      digitalWrite(LED_orange1, HIGH);
      tone(DIO_Buzzer, 632, 120);
      delaiTestStop(120);
      digitalWrite(LED_orange2, HIGH);
      tone(DIO_Buzzer, 632, 120);
      delaiTestStop(60);
      delaiTestStop(60);
      digitalWrite(LED_vert, HIGH);
      tone(DIO_Buzzer, 632, 2250);
      delaiTestStop(2250);
      digitalWrite(LED_rouge, LOW);
      digitalWrite(LED_orange1, LOW);
      digitalWrite(LED_orange2, LOW);
      digitalWrite(LED_vert, LOW);
      digitalWrite(DIO_Buzzer, LOW);
    }
  }
}

// effectue un délai et test si on doit sortir
//
// si le bouton vient d'être appuyé sort par un longjump
// sinon on continue jusqu'à la fin du délai
//
void delaiTestStop(unsigned long delai)
{
  unsigned long debut = millis();
  while (millis() - debut < delai)
  {
    bool etatButton = !digitalRead(Button_Marche);
    if (etatButton != etatButtonPrec)
    {
      Serial.println("Bouton");
      etatButtonPrec = etatButton;
      delay(20);      // anti rebond
      if (etatButton)
        longjmp(buf, 1);  // on arrête la boucle
    }
  }
}

void reInitTalkie()
{
  // Timer 2 set up as a 62500Hz PWM.
  //
  // The PWM 'buzz' is well above human hearing range and is
  // very easy to filter out.
  //
  TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(CS20);
  TIMSK2 = 0;
}

Il faut aussi ajouter

#include <setjmp.h>

Ce n'est pas la panacée, mais ça devrait fonctionner convenablement.

Merci beaucoup.
On la trouve ou la librairie setjmp? car j'ai essayer sa marche pas après je me suis rappeler qu'il fallait une librairie mais je n'est pas trouver.

Elle fait partie des librairies standard du C/C++
Il suffit d'inclure le .h

#include <setjmp.h>