Eviter une répétitions avec un if dans le loop

Bonjour, j'ai mit en place dans mon code un système avec une variable qui change a chaque fois pour éviter la répétitions du sous programme (qui joue un message vocal) donc dans le cas gauche et droite pas de soucis mais dans le cas devant, légèrement gauche et légèrement droite c'est un peu plus problématique car dans certain cas des obstacle ne sont pas signalé pouvez m'aidez a régler ce problème svp ?

			   if (d1 >=301 && a==1)
						{
						a=0;
						}
				   if (d1 <=300 &&  d1 >=251 && a==0)				//Gauche
								    {
								    obstacle3mgauche();
								    a=1;
								    }
					  if (d1 <=250 && d1 >=201 && a==1)
								    {
								    obstacle25mgauche();
								    a=0;
								    }
					  if (d1 <=200 && d1 >=151 && a==0)
								    {
								    obstacle2mgauche();
								    a=1;
								    }
					  if (d1 <=150 && d1 >=101 && a==1)
								    {
								    obstacle15mgauche();
								    a=0;
								    }
					  if (d1 <=100 && d1 >=51 && a==0)
								    {
								   obstacle1mgauche();
								   a=1;
								    }
					  if (d1 <=50 && a==1)
								    {
								    obstacle50cmgauche();
								    a=0;
								    }
								    
			   if (d4 >=301 && b==1)
						{
						b=0;
						}
				  if (d4 <=300 && d4 >=251 && b==0)				//Droite
								    {
								    obstacle3mdroite();
								    b=1;
								    }
					  if (d4 <=250 && d4 >=201 && b==1)
								    {
								    obstacle25mdroite();
								    b=0;
								    }
					  if (d4 <=200 && d4 >=151 && b==0)
								    {
								    obstacle2mdroite();
								    b=1;
								    }
					  if (d4 <=150 && d4 >=101 && b==1)
								    {
								   obstacle15mdroite();
								   b=0;
								    }
					  if (d4 <=100 && d4 >=51 && b==0)
								    {
								    obstacle1mdroite();
								    b=1;
								    }
					  if (d4 <=50 && b==1)
								    {
								    obstacle50cmdroite();
								    b=0;
								    }	
								    
			   if (d2 != d3) f=0;
			   if (d2 >=301 && d3 >=301)
						{
						c=0;
						f=0;
						}
			   if (d3 >=301) d=0;
			   if (d2 >=301) e=0;
						
				  if (d2 <=300 && d3<=300 && d2>=251 && d3>=251 && c==0)							//Devant
								    {
								    obstacle3mdevant();
								    c=1;
								    f=1;
								    }
									 else if (d3 <=300 && d3>=251 && d==0 && f==0)								//Légérement Droite
								    {
								   obstacle3mlegdroite();
								   d=1;
								   c=1;
								    }
									 else if (d2 <=300 && d2>=251 && e==0 && f==0)								//Légérement Gauche
								    {
								    obstacle3mleggauche();
								    e=1;
								    c=1;
								    }
					  if (d2 <=250 && d3<=250 && d2>=201 && d3>=201 && c==1)
								    {
								    obstacle25mdevant();
								    c=0;
								    f=1;
								    }
								    	  else if (d3 <=250 && d3>=201 && d==1 && f==0)
								    {
								    obstacle25mlegdroite();
								    d=0;
								    c=0;
								    }
								    	  else if (d2 <=250 && d2>=201 && e==1 && f==0)
								    {
								    obstacle25mleggauche();
								    e=0;
								    c=0;
								    }
					  if (d2 <=200 && d3<=200 && d2>=151 && d3>=151 && c==0)
								    {
								    obstacle2mdevant();
								    c=1;
								    f=1;
								    }
								    	  else if (d3 <=200 && d3>=151 && d==0 && f==0)
								    {
								    obstacle2mlegdroite();
								    d=1;
								    c=1;
								    }
								    	  else if (d2 <=200 && d2>=151 && e==0 && f==0)
								    {
								    obstacle2mleggauche();
								    e=1;
								    c=1;
								    }
					  if (d2 <=150 && d3<=150 && d2>=101 && d3>=101 && c==1)
								    {
								  obstacle15mdevant();
								  c=0;
								  f=1;
								    }
								    	  else if (d3 <=150 && d3>=101 && d==1 && f==0)
								    {
								   obstacle15mlegdroite();
								   d=0;
								   c=0;
								    }
								    	  else if (d2 <=150 && d2>=101 && e==1 && f==0)
								    {
								    obstacle15mleggauche();
								    e=0;
								    c=0;
								    }
					  if (d2 <=100 && d3<=100 && d2>=51 && d3>=51 && c==0)
								    {
								   obstacle1mdevant();
								   c=1;
								   f=1;
								    }
								    	  else if (d3 <=100 && d3>=51 && d==0 && f==0)
								    {
								    obstacle1mlegdroite();
								    d=1;
								    c=1;
								    }
								    	  else if (d2 <=100 && d2>=51 && e==0 && f==0)
								    {
								   obstacle1mleggauche();
							  	   e=1;
								   c=1;
								    }
					  if (d2 <=50 && d3<=50 && c==1)
								    {
								    obstacle50cmdevant();
								    c=0;
								    f=1;
								    }
								    	  else if (d3 <=50 && d==1 && f==0)
								    {
								   obstacle50cmlegdroite();
								   d=0;
								   c=0;
								    }
								    	  else if (d2 <=50 && e==1 && f==0)
								    {
								  obstacle50cmleggauche();
								  e=0;
								  c=0;
								    }

Ton code est illisible. Dans l'IDE tape CTRL T pour l'indenter correctement et reposte le.

Ensuite, explique un peu plus a quoi correspondent toutes ces variables. J'imagine que tu as quatre capteurs qui mesurent des distances pour détecter des obstacles et que tu veux prendre des décisions en fonction des valeurs qu'ils renvoient. Donc d1 à d4 seraient ces distances, mais les autres variables c'est quoi ?

D'une manière générale, utilise des noms de variables significatifs, ça nous aide à comprendre et toi ça t'aidera à reprendre le code plus tard si nécessaire...

Pour ton besoin, je te conseillerais bien de te lancer dans la logique floue, ça permettrait de formaliser des concepts comme "tourner légèrement à droite si l'obstacle n'est pas très loin", mais ça demande un petit investissement préliminaire (lire de la doc et des tutoriels)...

Je n'ai pas trop compris le ctrl t (j'utilise proteus et ça ne fait rien quand je fait ctrl t) et c'est vrai que je me suis pas trop expliquer en gros mon projet consiste a guider un aveugle donc il y a 4 capteur a ultrasons et mon but est de détecter des obstacles entre 0.5m et 3m sur 120° pour détecter devant je combine le capteur d2 et d3 (d1 est le capteur de gauche d2 le capteur légèrement a gauche d3 le capteur légèrement a droite et d4 le capteur de droite) après les variables a/b/c/d/e/f me servent juste a éviter la répétitions des message vocaux.

#include <SoftwareSerial.h>
#include <MP3Player_KT403A.h>

SoftwareSerial mp3(2, 3);
SoftwareSerial GSM(16, 17);

unsigned long duree1; //capteur ultrason
float d1;
unsigned long duree2;
float d2;
unsigned long duree3;
float d3;
unsigned long duree4;
float d4;
boolean a;
boolean b;
boolean c;
boolean d;
boolean e;
boolean f;
int val; //batterie
double tension;
boolean recharge;
float latitude; //coordonnées
float longitude;
boolean verif; //gsm
 
void setup()
 { 
  mp3.begin(9600);
  delay(1000);
  SelectPlayerDevice(0x02);
  SetVolume(0x1E);
  delay(2000);
  SpecifyfolderPlay(01, 001);
  delay(2000);
  
  a=0; //capteur ultrason
  b=0;
  c=0;
  d=0;
  e=0;
  f=0;
  tension=0; //batterie
  val=0;
  recharge=0;
  verif=0; //gsm
  
  pinMode(24,INPUT); //capteur ultrason
  pinMode(25,OUTPUT);
  pinMode(26,INPUT);
  pinMode(27,OUTPUT);
  pinMode(28,INPUT);
  pinMode(29,OUTPUT);
  pinMode(30,INPUT);
  pinMode(31,OUTPUT);
  pinMode(55,INPUT); //batterie
  pinMode(13,INPUT);
  pinMode(12,INPUT); //bouton envoi message
 }
 
 void BATTERIE()
{
recharge=digitalRead(13);
val=analogRead(1);
tension=val/204.761;

 if (tension >= 4.2 && recharge==1) chargefull();
 if (tension <= 4 && tension >= 3.95 && recharge==0) batterie80();
 if (tension <= 3.9 && tension >= 3.85 && recharge==0) batterie60();
 if (tension <= 3.8 && tension >= 3.75 && recharge==0) batterie40();
 if (tension <= 3.72 && tension >= 3.68 && recharge==0) batterie20();
 if (tension <= 3.61 && recharge==0) batterie10();
 if (recharge==1 && tension < 4.2) chargeplug();
 if (recharge==0)
       {
       //bruit unplug demander a anthony
       }
}

 void sms()
{
latitude=1.117; //mettre variable anthony
longitude=1.117; //mettre variable anthony
Serial.begin(9600);
GSM.begin(9600);
delay(1000);
GSM.print("AT+CMGF=1\r");
delay(1000);
GSM.print("AT+CMGS=\"+33781702022\"\r");
delay(1000);
      if (GSM.available())
      {
      char data = GSM.read();
      GSM.print(data);
      }
GSM.print("Bonjour je suis perdu, peux-tu venir me chercher ? Je suis ici : ");GSM.print(latitude);GSM.print(";");GSM.print(longitude);
delay(1000);
GSM.println((char)26);
}

void capteurgauche() //Capteur Gauche
{
digitalWrite (25,1);
delayMicroseconds(10);
digitalWrite (25,0);
duree1=pulseInLong (24,1);
d1=(duree1/2) / 29.03;
delay(10);
}

void capteurlegegauche() //Capteur Légérement Gauche
{
digitalWrite (27,1);
delayMicroseconds(10);
digitalWrite (27,0);
duree2=pulseInLong (26,1);
d2=(duree2/2) / 29.03;
delay(10);
}

void capteurlegedroite() //Capteur Légérement Droite
{
digitalWrite (29,1);
delayMicroseconds(10);
digitalWrite (29,0);
duree3=pulseInLong (28,1);
d3=(duree3/2) / 29.03;
delay(10);
}

void capteurdroit() //Capteur Droite
{
digitalWrite (31,1);
delayMicroseconds(10);
digitalWrite (31,0);
duree4=pulseInLong (30,1);
d4=(duree4/2) / 29.03;
delay(10);
}

void messagealerteobstacle()
{
   if (d1 >=301 && a==1)
 {
 a=0;
 }
   if (d1 <=300 &&  d1 >=251 && a==0) //Gauche
    {
    obstacle3mgauche();
    a=1;
    }
  if (d1 <=250 && d1 >=201 && a==1)
    {
    obstacle25mgauche();
    a=0;
    }
  if (d1 <=200 && d1 >=151 && a==0)
    {
    obstacle2mgauche();
    a=1;
    }
  if (d1 <=150 && d1 >=101 && a==1)
    {
    obstacle15mgauche();
    a=0;
    }
  if (d1 <=100 && d1 >=51 && a==0)
    {
   obstacle1mgauche();
   a=1;
    }
  if (d1 <=50 && a==1)
    {
    obstacle50cmgauche();
    a=0;
    }
    
   if (d4 >=301 && b==1)
 {
 b=0;
 }
  if (d4 <=300 && d4 >=251 && b==0) //Droite
    {
    obstacle3mdroite();
    b=1;
    }
  if (d4 <=250 && d4 >=201 && b==1)
    {
    obstacle25mdroite();
    b=0;
    }
  if (d4 <=200 && d4 >=151 && b==0)
    {
    obstacle2mdroite();
    b=1;
    }
  if (d4 <=150 && d4 >=101 && b==1)
    {
   obstacle15mdroite();
   b=0;
    }
  if (d4 <=100 && d4 >=51 && b==0)
    {
    obstacle1mdroite();
    b=1;
    }
  if (d4 <=50 && b==1)
    {
    obstacle50cmdroite();
    b=0;
    } 
    
   if (d2 != d3) f=0;
   if (d2 >=301 && d3 >=301)
 {
 c=0;
 f=0;
 }
   if (d3 >=301) d=0;
   if (d2 >=301) e=0;
 
  if (d2 <=300 && d3<=300 && d2>=251 && d3>=251 && c==0) //Devant
    {
    obstacle3mdevant();
    c=1;
    f=1;
    }
 else if (d3 <=300 && d3>=251 && d==0 && f==0) //Légérement Droite
    {
   obstacle3mlegdroite();
   d=1;
   c=1;
    }
 else if (d2 <=300 && d2>=251 && e==0 && f==0) //Légérement Gauche
    {
    obstacle3mleggauche();
    e=1;
    c=1;
    }
  if (d2 <=250 && d3<=250 && d2>=201 && d3>=201 && c==1)
    {
    obstacle25mdevant();
    c=0;
    f=1;
    }
      else if (d3 <=250 && d3>=201 && d==1 && f==0)
    {
    obstacle25mlegdroite();
    d=0;
    c=0;
    }
      else if (d2 <=250 && d2>=201 && e==1 && f==0)
    {
    obstacle25mleggauche();
    e=0;
    c=0;
    }
  if (d2 <=200 && d3<=200 && d2>=151 && d3>=151 && c==0)
    {
    obstacle2mdevant();
    c=1;
    f=1;
    }
      else if (d3 <=200 && d3>=151 && d==0 && f==0)
    {
    obstacle2mlegdroite();
    d=1;
    c=1;
    }
      else if (d2 <=200 && d2>=151 && e==0 && f==0)
    {
    obstacle2mleggauche();
    e=1;
    c=1;
    }
  if (d2 <=150 && d3<=150 && d2>=101 && d3>=101 && c==1)
    {
  obstacle15mdevant();
  c=0;
  f=1;
    }
      else if (d3 <=150 && d3>=101 && d==1 && f==0)
    {
   obstacle15mlegdroite();
   d=0;
   c=0;
    }
      else if (d2 <=150 && d2>=101 && e==1 && f==0)
    {
    obstacle15mleggauche();
    e=0;
    c=0;
    }
  if (d2 <=100 && d3<=100 && d2>=51 && d3>=51 && c==0)
    {
   obstacle1mdevant();
   c=1;
   f=1;
    }
      else if (d3 <=100 && d3>=51 && d==0 && f==0)
    {
    obstacle1mlegdroite();
    d=1;
    c=1;
    }
      else if (d2 <=100 && d2>=51 && e==0 && f==0)
    {
   obstacle1mleggauche();
     e=1;
   c=1;
    }
  if (d2 <=50 && d3<=50 && c==1)
    {
    obstacle50cmdevant();
    c=0;
    f=1;
    }
      else if (d3 <=50 && d==1 && f==0)
    {
   obstacle50cmlegdroite();
   d=0;
   c=0;
    }
      else if (d2 <=50 && e==1 && f==0)
    {
  obstacle50cmleggauche();
  e=0;
  c=0;
    }

}
void loop()
 { 
 BATTERIE();
 
    if (digitalRead (12)==0) verif=0; //Envoi SMS
    if (digitalRead (12)==1 && verif==0) 
    {
    sms();
    verif=1;
    }
 
capteurgauche();
capteurlegegauche();
capteurlegedroite();
capteurdroit();

messagealerteobstacle();
 }

Voici mon code complet (je n'ai juste pas mit tout les sous programme des message vocaux sinon mon post était trop long) pour l'instant mais ne fait pas attention à certain détail je n'ai pas encore tout finit, je me concentre pour l'instant sur la tache principal et éviter que les message vocaux tourne en boucle. Et je ne connais pas la logique floue.

Pour la logique floue, Wikipedia est ton ami. Un lien chez openclassrooms aussi.

Connaissant ton besoin, je ne sais pas si ça s'applique car il faudrait que tu puisses générer des messages "flous" (obstacle légèrement à droite à une distance moyenne proche par exemple) ce qui n'est pas facile et pas forcément assez informatif pour l'utilisateur.

Ah oui je vois ce que tu veux dire on y avait déjà penser et en avait déjà parler à notre professeur (mais je ne savais pas que ça s’appelait comme ça) mais il faut que l'on donne une informations + ou - précise sur la position de l'obstacle.

Bonsoir,

Pour simplifier la structure de votre programme, vous devriez commencer par transformer toutes les fonctions déclenchant un message vocal en une fonction unique qui prend deux paramètres.

Le premier sera par exemple la distance de l'obstacle (celui du message) , et le second la position de l'obstacle.
Utilisez ces paramètres pour déterminer le type de message vocal à envoyer.

Utilisez des variables statiques pour mémoriser les paramètres envoyées lors de l'appel précédent.

Si les paramètres sont différents, alors nouveau message, sinon message identique, donc on sort.
Cela vous supprime toutes vos variables liées à la non répétition des messages vocaux.

Alors merci ça a l'air de résoudre mon problème mais je suis débutant et j'ai pas trop compris comment faire ceci :roll_eyes: .

Voici mes sous programme des message vocaux :

 void batterie80()							// IL RESTE 80% DE BATTERIE
{
SpecifyfolderPlay(01, 17);
delay(800);
SpecifyfolderPlay(01, 18);
delay(1000);
SpecifyfolderPlay(01, 24);
delay(800);
}

void batterie60()							// IL RESTE 60% DE BATTERIE
{
SpecifyfolderPlay(01, 17);
delay(800);
SpecifyfolderPlay(01, 19);
delay(1000);
SpecifyfolderPlay(01, 24);
delay(800);
}

void batterie40()							// IL RESTE 40% DE BATTERIE
{
SpecifyfolderPlay(01, 17);
delay(800);
SpecifyfolderPlay(01, 20);
delay(1000);
SpecifyfolderPlay(01, 24);
delay(800);
}

void batterie20()							// IL RESTE 20% DE BATTERIE
{
SpecifyfolderPlay(01, 17);
delay(800);
SpecifyfolderPlay(01, 21);
delay(1000);
SpecifyfolderPlay(01, 24);
delay(800);
}

void batterie10()							// IL RESTE 10% DE BATTERIE
{
SpecifyfolderPlay(01, 17);
delay(800);
SpecifyfolderPlay(01, 22);
delay(1000);
SpecifyfolderPlay(01, 24);
delay(800);
}

void on()									// ON
{
SpecifyfolderPlay(01, 001); 
delay(2000);
 }
 
void off()									// OFF
 {
SpecifyfolderPlay(01, 002); 
delay(2000);
  }
  
void chargeplug()							 // RECHARGE PLUG
 {
SpecifyfolderPlay(01, 003); 
delay(2000);
}

void chargefull()							// RECHARGE FULL
{
SpecifyfolderPlay(01, 004);
delay(4000);
}

void obstacle3mdevant()					// OBSTACLE A 3M DEVANT
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 11);
delay(500);
SpecifyfolderPlay(01, 14);
delay(500); 
}

void obstacle3mgauche()					// OBSTACLE A 3M GAUCHE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 11);
delay(500);
SpecifyfolderPlay(01, 13);
delay(500); 
}

void obstacle3mdroite()						// OBSTACLE A 3M DROITE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 11);
delay(500);
SpecifyfolderPlay(01, 12);
delay(500); 
}

void obstacle3mleggauche()					// OBSTACLE A 3M LEG GAUCHE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 11);
delay(500);
SpecifyfolderPlay(01, 16);
delay(750);
}

void obstacle3mlegdroite()					// OBSTACLE A 3M LEG DROITE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 11);
delay(500);
SpecifyfolderPlay(01, 15);
delay(750); 
}

void obstacle25mdevant()					// OBSTACLE A 2.5M DEVANT
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 26);
delay(750);
SpecifyfolderPlay(01, 14);
delay(500); 

}

void obstacle25mgauche()					// OBSTACLE A 2.5M GAUCHE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 26);
delay(750);
SpecifyfolderPlay(01, 13);
delay(500); 
}

void obstacle25mdroite()					// OBSTACLE A 2.5M DROITE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 26);
delay(750);
SpecifyfolderPlay(01, 12);
delay(500); 
}

void obstacle25mleggauche()				// OBSTACLE A 2.5M LEG GAUCHE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 26);
delay(750);
SpecifyfolderPlay(01, 16);
delay(750);
}

void obstacle25mlegdroite()					// OBSTACLE A 2.5M LEG DROITE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 26);
delay(750);
SpecifyfolderPlay(01, 15);
delay(750);
}

void obstacle2mdevant()					// OBSTACLE A 2M DEVANT
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 10);
delay(500);
SpecifyfolderPlay(01, 14);
delay(500); 
}

void obstacle2mgauche()					// OBSTACLE A 2M GAUCHE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 10);
delay(500);
SpecifyfolderPlay(01, 13);
delay(500); 
}

void obstacle2mdroite()						// OBSTACLE A 2M DROITE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 10);
delay(500);
SpecifyfolderPlay(01, 12);
delay(500); 
}

void obstacle2mleggauche()					// OBSTACLE A 2M LEG GAUCHE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 10);
delay(500);
SpecifyfolderPlay(01, 16);
delay(750);
}

void obstacle2mlegdroite()					// OBSTACLE A 2M LEG DROITE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 10);
delay(500);
SpecifyfolderPlay(01, 15);
delay(750);
}

void obstacle15mdevant()					// OBSTACLE A 1.5M DEVANT
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 9);
delay(750);
SpecifyfolderPlay(01, 14);
delay(500); 

}

void obstacle15mgauche()					// OBSTACLE A 1.5M GAUCHE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 9);
delay(750);
SpecifyfolderPlay(01, 13);
delay(500); 
}

void obstacle15mdroite()					// OBSTACLE A 1.5M DROITE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 9);
delay(750);
SpecifyfolderPlay(01, 12);
delay(500); 
}

void obstacle15mleggauche()				// OBSTACLE A 1.5M LEG GAUCHE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 9);
delay(750);
SpecifyfolderPlay(01, 16);
delay(750);
}

void obstacle15mlegdroite()					// OBSTACLE A 1.5M LEG DROITE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 9);
delay(750);
SpecifyfolderPlay(01, 15);
delay(750);
}

void obstacle1mdevant()					// OBSTACLE A 1M DEVANT
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 8);
delay(500);
SpecifyfolderPlay(01, 14);
delay(500); 
}

void obstacle1mgauche()					// OBSTACLE A 1M GAUCHE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 8);
delay(500);
SpecifyfolderPlay(01, 13);
delay(500); 
}


void obstacle1mdroite()						// OBSTACLE A 1M DROITE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 8);
delay(500);
SpecifyfolderPlay(01, 12);
delay(500); 
}


void obstacle1mleggauche()					// OBSTACLE A 1M LEG GAUCHE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 8);
delay(500);
SpecifyfolderPlay(01, 16);
delay(750);
}


void obstacle1mlegdroite()					// OBSTACLE A 1M LEG DROITE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 8);
delay(500);
SpecifyfolderPlay(01, 15);
delay(750);
}

void obstacle50cmdevant()					// OBSTACLE A 50CM DEVANT
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 25);
delay(750);
SpecifyfolderPlay(01, 14);
delay(500); 
}

void obstacle50cmgauche()					// OBSTACLE A 50CM GAUCHE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 25);
delay(750);
SpecifyfolderPlay(01, 13);
delay(500); 
}

void obstacle50cmdroite()					// OBSTACLE A 50CM DROITE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01,25);
delay(750);
SpecifyfolderPlay(01, 12);
delay(500); 
}

void obstacle50cmleggauche()				// OBSTACLE A 50CM LEG GAUCHE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 25);
delay(750);
SpecifyfolderPlay(01, 16);
delay(750);
}

void obstacle50cmlegdroite()					// OBSTACLE A 50CM LEG DROITE
{
SpecifyfolderPlay(01, 005);
delay(950);
SpecifyfolderPlay(01, 25);
delay(750);
SpecifyfolderPlay(01, 15);
delay(750);
}

void escaliersm1()							// ESCALIERS MONTANT A 1M
{
SpecifyfolderPlay(01, 007);
delay(950);
SpecifyfolderPlay(01, 8);
delay(750);
}

void escaliersm50()						// ESCALIERS MONTANT A 50CM
{
SpecifyfolderPlay(01, 007);
delay(950);
SpecifyfolderPlay(01, 25);
delay(750);
}

void escaliersd1()							// ESCALIERS DESCENDANT A 1M
{
SpecifyfolderPlay(01, 006);
delay(1000);
SpecifyfolderPlay(01, 8);
delay(750);
}

void escaliersd50()							// ESCALIERS DESCENDANT A 50CM
{
SpecifyfolderPlay(01, 006);
delay(1000);
SpecifyfolderPlay(01, 25);
delay(750);
}

Ha quand même :o.

Première remarque: tu utilises l'instruction delais() pour cadencer ton message sur une durée moyenne de 2s.
Cela veux dire que pendant ce temps, tu ne fais rien d'autre (plus de détections) . Est ce bien ce que tu veux ?

Il serait bon, à la vue du nombre de messages, de rajouter un troisième paramètre dans la fonction pour spécifier la catégorie du message (statut, énergie, obstacle).

Oui j'utilise la fonction delay car enfaîte si je n'en met pas les fichiers audio vont se lire en même temps et donc ça ne feras pas une phrase compréhensible ça va juste lire 3 fichier audio quasiment en même temps si tu as une solution pour faire mieux je suis preneur (et oui du coup jetait au courant que ça ne détectait plus pendant ce temps mais je ne pensait pas qu'on pouvait faire autrement).

Et justement tout ce qui est fonction et paramètre c'est très flou pour moi j'ai regarder sur internet pour essayer de comprendre ton précédent message mais vraiment j'ai du mal mais si ça peut simplifier et optimiser mon programme je suis preneur.

L'idée serait de créer une fonction unique commandeVocale() pour gérer tous les messages vocaux.
Cette fonction, lors de l'appel, devra comporter des paramètres qui vont définir le type de message que tu veux envoyer.

commandeVocale(x, y, z)

Ou x représente la catégorie du message (statut, énergie, obstacle)
y un premier paramètre (comme la distance (dans le message) de l'obstacle)
z un deuxième paramètre (comme la position de l'obstacle)

Regarde ceci pour comprendre les fonctions.

Une fois dans la fonction, tu utilises les paramètres pour choisir les bons fichiers audios.

Si vous avez un exemple (même a partir de mon code si vous voulez) je serai preneur.

Zlika:
Bonsoir,

Pour simplifier la structure de votre programme, vous devriez commencer par transformer toutes les fonctions déclenchant un message vocal en une fonction unique qui prend deux paramètres.

Le premier sera par exemple la distance de l'obstacle (celui du message) , et le second la position de l'obstacle.
Utilisez ces paramètres pour déterminer le type de message vocal à envoyer.

Utilisez des variables statiques pour mémoriser les paramètres envoyées lors de l'appel précédent.

Si les paramètres sont différents, alors nouveau message, sinon message identique, donc on sort.
Cela vous supprime toutes vos variables liées à la non répétition des messages vocaux.

Ah oui ok je vois ce que vous voulez dire mais après comment je choisit si x est statu, energie ou obstacles, maintenant c'est sur la mise en place niveau du code que je bloque.

Zlika:
L'idée serait de créer une fonction unique commandeVocale() pour gérer tous les messages vocaux.
Cette fonction, lors de l'appel, devra comporter des paramètres qui vont définir le type de message que tu veux envoyer.

commandeVocale(x, y, z)

Ou x représente la catégorie du message (statut, énergie, obstacle)
y un premier paramètre (comme la distance (dans le message) de l'obstacle)
z un deuxième paramètre (comme la position de l'obstacle)

Regarde ceci pour comprendre les fonctions.

Une fois dans la fonction, tu utilises les paramètres pour choisir les bons fichiers audios.

Pour garder un maximum de lisibilité dans ton programme , tu peux utiliser une variable de type enum pour le premier paramètre.

Je ne comprend pas l'utilité du choix d'une variable enum pour les distances et autres car je ne vois pas l’intérêt d’incrémenter quelque choses.

Enfaîte actuellement j'ai du mal a comprendre comment mettre un message vocal en temps que paramètre car quand je recherche des informations sur les paramètre ça me montre comment faire des calcul ou d'autre choses a partir de variables.

Tu peux faire ce que tu veux dans une fonction, faire des calculs avec les paramètres données, appeler d'autres fonctions...

Tu dois imaginer ta fonction comme un juke-box.

Pour choisir la musique que tu veux écouter, tu dois lui indiquer les lettres et chiffres qui lui est associée.
Ce sont les paramètres en entrée.

Le juke-box a une table de correspondance qui lui donne, pour chaque combinaison, le morceau, et donc la suite d'actions à réaliser.

Tu dois donc, en fonction des paramètres, trouver le bon message. Des 'if', des 'switch', tout ce qui peux te permettre de t'orienter vers le bon.
(pour la table, on verra plus tard)

Ah oui ok je vois et je ne connaissait pas du tout les switch du coup j'ai été voir sur internet et j'ai réussi a faire ça et en effet niveau des sous programme c'est beaucoup plus simplifié, merci ! Cependant les message vocaux tourne quand même en boucle :confused: .

void commandevocale(int parm1, int parm2, int parm3)
{
switch (categorie)
	       {
	       case 0:
	       SpecifyfolderPlay(01, 005); 		 //obstacle a
	       delay(950);
	       break;
	       case 1:
	       SpecifyfolderPlay(01, 17); 		 //il reste
	       delay(800);
	       break;
	       case 2:
	       SpecifyfolderPlay(01, 007); 		//escalier montant a
	       delay(1000);
	       break;
	       case 3:
	       SpecifyfolderPlay(01, 006);		//escalier descendant a
	       delay(1000);
	       break;
	       }
switch (valeur)
	       {
	       case 0:
	       SpecifyfolderPlay(01, 25);		//50cm
	       delay(750);
	       break;
	       case 1:
	       SpecifyfolderPlay(01, 8);			//1m
	       delay(500);
	       break;
	       case 2:
	       SpecifyfolderPlay(01, 9);			//1.5m
	       delay(750);
	       break;
	       case 3:
	       SpecifyfolderPlay(01, 10);		//2m
	       delay(500);
	       break;
	       case 4:
	       SpecifyfolderPlay(01, 26);		//2.5m
	       delay(750);
	       break;
	       case 5:
	       SpecifyfolderPlay(01, 11);		//3m
	       delay(500);
	       break;
	       case 6:
	       SpecifyfolderPlay(01, 22);		//10%
	       delay(1000);
	       break;
	       case 7:
	       SpecifyfolderPlay(01, 21);		//20%
	       delay(1000);
	       break;
	       case 8:
	       SpecifyfolderPlay(01, 20);		//40%
	       delay(1000);
	       break;
	       case 9:
	       SpecifyfolderPlay(01, 19);		//60%
	       delay(1000);
	       break;
	       case 10:
	       SpecifyfolderPlay(01, 18);		//80%
	       delay(1000);
	       break;
	       }
switch (additionel)
	       {
	       case 0:
	       SpecifyfolderPlay(01, 14);		//devant
	       delay(500);
	       break;
	       case 1:
	       SpecifyfolderPlay(01, 13);		//gauche
	       delay(500); 
	       break;
	       case 2:
	       SpecifyfolderPlay(01, 12);		//droite
	       delay(500); 
	       break;
	       case 3:
	       SpecifyfolderPlay(01, 16);		//legegauche
	       delay(750);
	       break;
	       case 4:
	       SpecifyfolderPlay(01, 15);		//legedroite
	       delay(750);
	       break;
	       case 5:
	       SpecifyfolderPlay(01, 24);		//de batterie
	       delay(800);
	       break;
	       }
}

Et dans le loop j'ai mit ça mais les valeurs c’était juste pour tester.

commandevocale(categorie=0, valeur=5, additionel=0);

L'idée est là, mais j'avais imaginé quelque chose de plus organisé :slight_smile:

Une première sélection en fonction de la catégorie (statut, énergie, obstacle), puis des sous catégorie (on, off), (10%, 20%,..,en charge, batterie chargée), (distance, position/nature).

Pour éviter la répétition, il faut juste mémoriser les derniers messages de chaque catégorie principale dans un tableau déclaré static.

Il suffit ensuite de comparer le message demandé avec la mémoire du dernier message envoyé dans la catégorie correspondante. Si le message est identique, pas besoin de le répéter.

Édit: pour les paramètres de la fonction, tu peux te limiter à un type byte (8 bits soit 256 combinaisons) plutôt que des int (16 bits soit 65336 combinaisons). Il faut adapter le type des variables au mieux pour économiser de la mémoire (bonne habitude à prendre).

J'ai déclarer mon tableau avec 3 cases pour mes 3 paramètres :

static int comparatif [ ] = {0,0,0};

Mais après je ne vois pas comment faire pour comparer un tableau dans les conditions de mes "if".

Et comment on fait pour préciser si l'on veut un int 8 bits ou 16 bits ?

C'est leurs noms qui les différencie.

Byte => 8 bits (unsigned)
Int => 16 bits
Long => 32 bits

Plus d'informations sur les types et autres choses à découvrir ici

Pour le tableau, si tu veux utiliser le type byte, rien de plus simple

static byte comparatif [0,0,0,0,0,0];

Pour la fonction idem, tu remplaces int par byte.

Pour le tableau, il faut pouvoir stocker les dernières demandes par catégories sinon, chaque indication de niveau de batterie sera suivi par la répétition d'un obstacle. Et si on utilise le même principe que la détection d'obstacles pour le niveau de batterie, chaque annonce d'obstacle sera suivi par un niveau batterie.

On pourrait gérer la non répétition du message de batterie dans la détection, mais vu qu' on le fait pour les obstacles dans la fonction commandeVocale, autant l'utiliser.

Donc, si on part sur trois paramètres, on va se servir du premier (la catégorie qui prendra la valeur 0, 1 ou 2) pour gérer l'emplacement ciblé dans le tableau.
Il ne reste donc plus que 2 paramètres à mémoriser.

[paramétre2de0, paramètre3de0, paramètre2de1, paramètre3de1, paramètre2de2, paramètre3de2]

Pour obtenir les bons paramètres de la catégorie correspondante , on a alors

paramètre2=catégorie *2

et paramètre3=catégorie *2+1

Il ne reste plus qu'à faire la comparaison avec les valeurs des 2ieme et 3ieme paramètres données pour appeler la fonction.
Il faudra évidemment penser à mémoriser les nouvelles valeurs pour chaque commande vocale validée.