Petit Prolème avec mon code

Bonjours ou bonsoir a vous

j'ai un petit problème avec mon code voici les détaille

2 moteur :
1 moteur pour le mode brassage
1 moteur pour la fonction avance et recule (Fonction recule nom programmer pour l'instant).

3 Bouton :
1 Bouton S3_Cycle.
1 Bouton S1_Depart.
1 Bouton S2_Fin.

le programme devrais faire

si bouton S1_départ est activer et que bouton S3_Cycle est activé
Apelle Fonction ModeCycle (effectue 2 fois la Boucle)
appelle Fonction Brassage (effectue 2 fois la Boucle)
Départ du moteur Avant
Arrêt du moteur quand S2_Fin est Activé, Fait une pause, départ du Moteur_Avant.
Arrêt du moteur quand S1_Départ est Activé.
ont fait la boucle ModeCycle.

quand la boucle est terminer le moteur devrais s'arrêter sur le bouton S1_Départ.
mon problème je n'arriver pas a faire arrêter le moteur sur S1_Depart. il tourne toujours.

Voici mon Code :

//.:: Moteur::
const int Moteur_Avant = 9;
const int Moteur_Bras = 3;
const int Moteur_Direction = 2;

//.:: Bouton::
const int S1_Depart = 4;
const int S2_Fin = 5;
const int S3_Cycle = 6;

boolean BrassageOK = false;

void setup()
{
//.:: Moteur::
pinMode(Moteur_Avant, OUTPUT);
pinMode(Moteur_Bras, OUTPUT);
pinMode(Moteur_Direction, OUTPUT);

//.::Bouton:::::
pinMode(S1_Depart, INPUT_PULLUP);
pinMode(S2_Fin, INPUT_PULLUP);
pinMode(S3_Cycle, INPUT_PULLUP);

digitalWrite(Moteur_Avant, HIGH);
digitalWrite(Moteur_Direction, HIGH);
digitalWrite(Moteur_Bras, HIGH);

Serial.begin(9600);
}

void loop()
{
//.:: Départ Cycle::
if ((digitalRead(S3_Cycle) == LOW) && (digitalRead(S1_Depart) == LOW))
{
//.::Appelle Fonction ModeCycle::
ModeCycle();
}
}

//.:: Fonction ModeCycle::
void ModeCycle()
{
int Var1 = 0;
while(Var1 < 2)
{
//.:: Si S1_Depart est Active et Brassage false::
if ((digitalRead(S1_Depart) == LOW) && (BrassageOK == false))
{
//.:: Arret du moteur avant::
digitalWrite(Moteur_Avant, HIGH);
//.:: Appelle Focntion Brassage::
Brassage();
}
//.:: Si S2_Fin est Active::
if ((digitalRead(S2_Fin) == LOW) && (BrassageOK == true))
{
//.:: Arret du moteur avant::
digitalWrite(Moteur_Avant, HIGH);
delay(1000);
//.:: Demarrage du moteur avant::
digitalWrite(Moteur_Avant, LOW);
BrassageOK = false;
Var1++;
}
}
}

//.:: Fonction Brassage::
void Brassage()
{
int Var2 = 0;
//.:: Effectue deux cycle de brassage::
while(Var2 < 2)
{
digitalWrite(Moteur_Bras, LOW);
delay(300);
digitalWrite(Moteur_Bras, HIGH);
delay(700);
Var2++;
}
BrassageOK = true;
//.:: Démarage du Moteur_Avant::
digitalWrite(Moteur_Avant, LOW);
}

Salut,

Si c'est du moteur avant dont tu parles, c'est normal, il faut relire ton code. Je trouve que tu fais beaucoup de if inutiles...

Je trouve que tu fais beaucoup de if inutiles...

j'ai seulement 3 condition

la premier me permet de vérifier que le moteur avant est a bien sur le bouton S1_Depart et que mon bouton S3_Cycle est activer

  if ((digitalRead(S3_Cycle) == LOW) && (digitalRead(S1_Depart) == LOW))

ma deuxième Condition Vérifie que le moteur_Avant est bien sur mon bouton S1_Depart est bien activer et que le brassage ne pas été fait

 if ((digitalRead(S1_Depart) == LOW) && (BrassageOK == false))

la troisième Vérifie que le moteur_Avant est bien sur le bouton S2_Fin et que le brassage a été effectuer.

if ((digitalRead(S2_Fin) == LOW) && (BrassageOK == true))

je ne vois pas comment je pourrais faire arrêter mon moteur avant sur les boutons sans mettre de if

j'ai fait une petite vidéo vous remarquer le code fonction bien sauf que je n'arrive pas arrêté le moteur a sont point de d'origine

si vous avez des questions sa me feras plaisir de répondre.
je fait du essais erreur du puis cette après midi et rien ne fonctionne =(

Bon j'ai fait une petite modification dans mon code
le cycle se fait bien sauf que la je reste pris dans ma boucle While

//.:: Fonction ModeCycle::
void ModeCycle()
{
int Var1 = 0;
while(Var1 < 3)
{
//.:: Si S1_Depart est Active et Brassage false::
if ((digitalRead(S1_Depart) == LOW) && (BrassageOK == false))
{
//.:: Arret du moteur avant::
digitalWrite(Moteur_Avant, HIGH);
if (Var1 < 2)
{
//.:: Appelle Focntion Brassage::
Brassage();
Var1++;
}
}
//.:: Si S2_Fin est Active::
if ((digitalRead(S2_Fin) == LOW) && (BrassageOK == true))
{
//.:: Arret du moteur avant::
digitalWrite(Moteur_Avant, HIGH);
delay(1000);
//.:: Demarrage du moteur avant::
digitalWrite(Moteur_Avant, LOW);
BrassageOK = false;
//Var1++;
}
}
}

si vous avez une idée je suis preneur :slight_smile:

bonjour,
et si tu utilisais un break pour sortir de ton while?

Vu la structure de ton programme:

  • soit tu n'entres pas dans le premier if (BrassageOK est-il à false?)
  • soit tu ne sors pas de Brassage()

Merci pour vos réponses

Pour Break je regarder pour cette option
Il falloir que je trouve une nouvelle condition pour sortire de ma boucle

  • soit tu n'entres pas dans le premier if (BrassageOK est-il à false?)
  • soit tu ne sors pas de Brassage()

quand je disait le cycle fait bien je parle du programme il fait exactement ce que je veux

  • vérification moteur_Avant est-il a position de départ.
  • appelle le mode Brassage.
  • démarrage du "moteur avant" en position Fin. délais 1 Secondes.
  • démarrage du "moteur Avant" pour position Départ.
  • Cycle = 1.
  • vérification moteur_Avant est-il a position de départ.
  • appelle le mode Brassage.
  • démarrage du "moteur avant" en position Fin. délais 1 Secondes.
  • démarrage du "moteur Avant" pour position Départ.
  • Cycle = 2.

et la je reste dans ma boucle Var1.

bon j'ai encore fait une modification et la je ne comprend plus.

//.:: Fonction ModeCycle::
void ModeCycle()
{
Serial.println("ModeCycle");
int Var1 = 0;
int VarBouton = 0;

while(Var1 < 3)
{
Serial.print("Var1 = "); Serial.println(Var1);
//.:: Si S1_Depart est Active et Brassage false::
if ((digitalRead(S1_Depart) == LOW) && (BrassageOK == false))
{
//.:: Arret du moteur avant::
digitalWrite(Moteur_Avant, HIGH);

if (Var1 < 2)
{ Serial.println("Condition pour Brassage");
//.:: Appelle Focntion Brassage::
Brassage();
Var1++;
}
}
//.:: Si S2_Fin est Active::
if ((digitalRead(S2_Fin) == LOW) && (BrassageOK == true))
{
Serial.println("Condition bouton Fin");
//.:: Arret du moteur avant::
digitalWrite(Moteur_Avant, HIGH);
delay(1000);
//.:: Demarrage du moteur avant::
digitalWrite(Moteur_Avant, LOW);
BrassageOK = false;
VarBouton++;
}

if ((digitalRead(S1_Depart) == LOW) && (VarBouton == 2))
{
break;
}

}
}

le code écrie comme ça... tout fonctionne, je sort de ma boucle parfait
ou je ne comprend pas ces quand je commente cette ligne.

//Serial.print("Var1 = "); Serial.println(Var1);

mon ancien problème revient :sweat_smile: le moteur n'arrête plus comme sur la vidéo posté plus haut
comme si Var1 n'est plus en mémoire ou qu'elle que chose comme ça.

la je suis perdu je fait 1 pas en avant et deux en arrière
vous avez une idée.

Le Serial.print() surtout à 96000 bauds prend un certain temps.
Peut être cela te fait-il rater un événement fugitif sur un discret.

fdufnews:
Le Serial.print() surtout à 96000 bauds prend un certain temps.
Peut être cela te fait-il rater un événement fugitif sur un discret.

un "0" de trop ? :grin:

Jean-François:

fdufnews:
Le Serial.print() surtout à 96000 bauds prend un certain temps.
Peut être cela te fait-il rater un événement fugitif sur un discret.

un "0" de trop ? :grin:

C'est vrai. Pour le coup ça n'aurait pas pris trop de temps.

j'ai peut-être trouver le fugitif discret XD

j'ai Remplacer ma ligne de code:

Serial.print("Var1 = "); Serial.println(Var1);

par :

delay(100);

sa semble fonctionner maintenant.
je vous remercie pour votre aide

je vais probablement revenir pour d'autre question donc
je ne mettrais pas le poste comme résolue.