sortir d une boucle for

bonjour ,
quel est la solution pour sortir d une boucle for ?
un exemple du code :
une rampe pwm pour moteur dc de 0% a 50% par pas de 5% , une fois arriver sur 50% , le moteur doit continuer 5 seconde puis stopper pour tourner dans l autre sens

void loop() {

//gestion du moteur avec 1 bouton poussoir
if (!digitalRead(pinBouton)){// test d'appui du bouton (mode inversé car INPUT_PULLUP)

for (vitesseM1=0; vitesseM1 <=50; vitesseM1+=5){
analogWrite(pinPMoteur1, vitesseM1);
}

Bonjour,

Pour sortir d'une boucle for c'est break;

Mais, dans ton exemple, je ne vois pas du tout pourquoi tu veux en sortir ni même ce que tu veux faire.

enfait , le moteur démarre a 0% , incrémenter de 5% et une fois arriver a 50% , il doit continuer 5 seconde a 50% puis stopper
ça fonctionne , mais le moteur reste a 50% , je n 'arrive pas a le stopper après 5 seconde

non pour sortir d'une boucle for, c'est pas break..

for (int i=0; i<10; i++);

donc il dans mon cas il va faire 10 boucle est s'arrété..

Dans ton cas, il n'y a pas de temps dans ta boucle...

faudrait faire
for (vitesseM1=0; vitesseM1 <=50; vitesseM1+=5){
analogWrite(pinPMoteur1, vitesseM1);

if( vitesseM1 ==50)
{
delay(5000); // attente de 5 secondes
analogWrite(pinPMoteur1, 0);// arreter le moteur
}
}
un truc du genre

hazerty565:
non pour sortir d'une boucle for, c'est pas break..

Si! Ça provoque une sortie inconditionnelle de la boucle.

stoustich:
ça fonctionne , mais le moteur reste a 50% , je n 'arrive pas a le stopper après 5 seconde

C'est sur, dans le bout de programme que tu nous montres, tu ne fais rien pour arrêter le moteur.
Mais comme on ne voit qu'une partie du programme on ne peut pas trop juger de ce qui pose problème.

Autre solution, le second argument du for c'est la conditoin de maintien dans la boucle donc tu peux très bien construire une condition de maintien plus complexe que le simple test d'une valeur. Le break n'a de sens que si on veut sortir au milieu d'un bloc d'instruction dans le for.

int pin1Moteur1=4; //pin de commande moteur 1
int pin2Moteur1=8; // pin de commande moteur 1
int pinPMoteur1=3;// pin PWM moteur 1
int pinBouton=7; //pin du bouton poussoir en mode INPUT_PULLUP
int vitesseM1=0; //variable de pourcentage de vitesse pour moteur 1
int sensM1=1; //variable de sens pour moteur 1

void setup() {

pinMode(pin1Moteur1,OUTPUT);
pinMode(pin2Moteur1,OUTPUT);
pinMode(pinPMoteur1,OUTPUT);
pinMode(pinBouton,INPUT_PULLUP); //pinBouton en mode INPUT_PULLUP
}

void loop() {
//appel des commandes de moteur
actionMoteur(1,sensM1,vitesseM1); //commande pour moteur 1

//gestion du moteur 1 avec le bouton

Serial.println();
for (vitesseM1=0; vitesseM1 <=46; vitesseM1+=5){
analogWrite(pinPMoteur1, vitesseM1);
delay(2000);

}
}

//fonction de gestion d'un moteur
void actionMoteur(int moteur,int sens,int pourcentage){
int pin1,etat1,pin2,etat2,pinP,puissance; //variable de la fonction
//test numéro du moteur
if (moteur==1){
pin1=pin1Moteur1;
pin2=pin2Moteur1;
pinP=pinPMoteur1;
}

//test sens du moteur 1,-1 (sens contrainre) ou tout autre valeur (stoppe le moteur)
if (sens==1){
etat1=1;
etat2=0;
}
else if (sens==-1){
etat1=0;
etat2=1;
}
else {
etat1=0;
etat2=0;
}
puissance=map(pourcentage,0,100,0,255);
analogWrite(pinP,puissance);
digitalWrite(pin1,etat1);
digitalWrite(pin2,etat2);
}

voila le code , bon c est un peu n importe quoi mais c est un premier jet ( mdr..)
que je mette un delay n importe ou , la vitesse de mon moteur reste et tourne a 50%
je voudrais bien le stopper après 5 seconde pour le faire tourner dans l autre sens ( avec la boucle for également ) puis restopper 5 sec

bonjour,
j ai un peu modifié mon code ,
je peux maintenant arrêter le moteur 5 secondes après son démarrage ,
mais je ne peux toujours pas le faire tourner dans l autre sens ..
le sens change bien et est affiche quand je mets 1 ou -1 dans action moteur , mais il ne change pas au niveau de mon moteur
qu est ce qui cloche ?

int pin1Moteur=4; //pin de commande moteur 1
int pin2Moteur=8; // pin de commande moteur 1
int pinPMoteur=3;// pin PWM moteur 1
int pinBouton=7; //pin du bouton poussoir en mode INPUT_PULLUP
int vitesseM=0; //variable de pourcentage de vitesse pour moteur 1
int sens=1; //variable de sens pour moteur 1

void setup() {
Serial.begin(9600); //initialise la communication série
pinMode(pin1Moteur,OUTPUT); //pin moteur en sortie
pinMode(pin2Moteur,OUTPUT); //pin moteur en sortie
pinMode(pinPMoteur,OUTPUT); //pin pwm en sortie
pinMode(pinBouton,INPUT_PULLUP); //pinBouton en mode INPUT_PULLUP

}

void loop() {

//gestion du moteur 1 avec le bouton
if (!digitalRead(pinBouton))// test d'appui du bouton (mode inversé car INPUT_PULLUP)
{
for (vitesseM=0; vitesseM <=50; vitesseM+=5)
{
actionMoteur(1, vitesseM); //commande pour moteur 1
analogWrite(pinPMoteur, vitesseM);
Serial.println();
delay(20);
}
if (analogRead(vitesseM==50))
{
delay(5000);
analogWrite(pinPMoteur, vitesseM=0);
}
}
}

//fonction de gestion d'un moteur
void actionMoteur (int sens,int pourcentage){
int pin1Moteur,etat1,pin2Moteur,etat2,pinPMoteur,puissance; //variable de la fonction

//test sens du moteur 1,-1 (sens contraire) ou tout autre valeur (stoppe le moteur)
if (sens==1){
etat1=1;
etat2=0;
}
else if (sens==-1){
etat1=0;
etat2=1;
}
else {
etat1=0;
etat2=0;
}
puissance=map(pourcentage,0,100,0,255);
analogWrite(pinPMoteur,puissance);
digitalWrite(pin1Moteur,etat1);
digitalWrite(pin2Moteur,etat2);

//affichage sur le moniteur série

if (sens==-1 || sens==1){
Serial.print(" sens : ");
Serial.print(sens);
}
else {
Serial.print(" ! stop ! ");
}
Serial.print(" puissance : ");
Serial.print(pourcentage);
Serial.print("%\t");
}

Merci d'utiliser les balises code, c'est pas lisible sinon

sorry , voila ..

int pin1Moteur=4; //pin de commande moteur 1
int pin2Moteur=8; // pin de commande moteur 1
int pinPMoteur=3;// pin PWM moteur 1
int pinBouton=7; //pin du bouton poussoir en mode INPUT_PULLUP
int vitesseM=0; //variable de pourcentage de vitesse pour moteur 1
int sens=1; //variable de sens pour moteur 1


void setup() {
  Serial.begin(9600); //initialise la communication série
  pinMode(pin1Moteur,OUTPUT); //pin moteur en sortie
  pinMode(pin2Moteur,OUTPUT); //pin moteur en sortie
  pinMode(pinPMoteur,OUTPUT); //pin pwm en sortie
  pinMode(pinBouton,INPUT_PULLUP); //pinBouton en mode INPUT_PULLUP
  
}

void loop() {



   
   
  //gestion du moteur 1 avec le bouton
  if (!digitalRead(pinBouton))// test d'appui du bouton (mode inversé car INPUT_PULLUP)
  {
    for (vitesseM=0; vitesseM <=50; vitesseM+=5)
      {
        actionMoteur(1, vitesseM); //commande pour moteur 1
       analogWrite(pinPMoteur, vitesseM);
       Serial.println();
       delay(20);
       }
   if (analogRead(vitesseM==50))
      {
       delay(5000);
       analogWrite(pinPMoteur, vitesseM=0);
       }
   }
}

    

//fonction de gestion d'un moteur
void actionMoteur (int sens,int pourcentage){
  int pin1Moteur,etat1,pin2Moteur,etat2,pinPMoteur,puissance; //variable de la fonction
 
  
  //test sens du moteur 1,-1 (sens contraire) ou tout autre valeur (stoppe le moteur)
  if (sens==1){
    etat1=1;
    etat2=0;
  }
  else if (sens==-1){
    etat1=0;
    etat2=1;
  }
  else {
    etat1=0;
    etat2=0;
  }
  puissance=map(pourcentage,0,100,0,255);
  analogWrite(pinPMoteur,puissance);
  digitalWrite(pin1Moteur,etat1);
  digitalWrite(pin2Moteur,etat2);
  
  //affichage sur le moniteur série 

  if (sens==-1 || sens==1){
    Serial.print(" sens : ");
    Serial.print(sens);
  }
  else {
    Serial.print(" ! stop ! ");
  }
  Serial.print(" puissance : ");
  Serial.print(pourcentage);
  Serial.print("%\t");
}/code]

merci du coup de main les amis ...

Vire le AnalogRead dans ton if(AnalogRead(VitesseM == 50))

dans ce cas , le moteur ne s arrête plus avec le delay(5000); ...

j ai changer la boucle FOR , par une boucle WHILE
le moteur fonctionne avec une rampe pwm pour limiter le courant de démarrage 5 seconde , puis redescend avec la rampe ( contraire ) et s arrête
je sais pas si c est la bonne manière de faire le code , mais ça fonctionne ...
reste a changer le DELAY(5000); par quoi ? MILLIS() ? pour ne pas bloquer le programme pendant ce temps , et pouvoir ajouter une autre action par ex.

int pin1Moteur=4; //pin de commande moteur 1
int pin2Moteur=8; // pin de commande moteur 1
int pinPMoteur=3;// pin PWM moteur 1
int pinBouton=7; //pin du bouton poussoir en mode INPUT_PULLUP
int vitesseM=0; //variable de pourcentage de vitesse pour moteur 1
int sens=1; //variable de sens pour moteur 1


void setup() {
  Serial.begin(9600); //initialise la communication série
  pinMode(pin1Moteur,OUTPUT); //pin moteur en sortie
  pinMode(pin2Moteur,OUTPUT); //pin moteur en sortie
  pinMode(pinPMoteur,OUTPUT); //pin pwm en sortie
  pinMode(pinBouton,INPUT_PULLUP); //pinBouton en mode INPUT_PULLUP
  
}

void loop() {
 //gestion du moteur 1 avec le bouton
     if (!digitalRead(pinBouton))// test d'appui du bouton (mode inversé car INPUT_PULLUP)
       { 
         while(vitesseM<=45)
        {
          vitesseM=vitesseM+5; 
          actionMoteur(1, vitesseM); //commande pour moteur 1
          Serial.println();
          analogWrite(pinPMoteur, vitesseM);
          delay(20);
        }
          delay(5000);
          while(vitesseM>=5)
        {
          vitesseM=vitesseM-5; 
          actionMoteur(1, vitesseM); //commande pour moteur 1
          Serial.println();
          analogWrite(pinPMoteur, vitesseM);
          delay(20);
        } 
       }
 }

    

//fonction de gestion d'un moteur
void actionMoteur (int sens,int pourcentage){
  int pin1Moteur,etat1,pin2Moteur,etat2,pinPMoteur,puissance; //variable de la fonction
 
  
  //test sens du moteur 1,-1 (sens contraire) ou tout autre valeur (stoppe le moteur)
  if (sens==1){
    etat1=1;
    etat2=0;
  }
  else if (sens==-1){
    etat1=0;
    etat2=1;
  }
  else {
    etat1=0;
    etat2=0;
  }
  puissance=map(pourcentage,0,100,0,255);
  analogWrite(pinPMoteur,puissance);
  digitalWrite(pin1Moteur,etat1);
  digitalWrite(pin2Moteur,etat2);
  
  //affichage sur le moniteur série 

  if (sens==-1 || sens==1){
    Serial.print(" sens : ");
    Serial.print(sens);
  }
  else {
    Serial.print(" ! stop ! ");
  }
  Serial.print(" puissance : ");
  Serial.print(pourcentage);
  Serial.print("%\t");
}

Mais en fait, il y a un algorithme à la base de ce code? ou alors tu as codé des trucs en disant on verra bien si ça tombe en marche?
Parce que le fait de vouloir remplacer le delay() par millis() implique une refonte du code dans son ensemble. On peut supposer que c'est pour ne pas bloquer le programme mais dans quel but??? Jusqu'ici tu n'en avais pas fait mention.

j essaie de faire un code , mais en le modifiant petit a petit , je sais que c est pas la bonne marche a suivre
mais je débute avec arduino , et je suis obligé de faire des tests petit a petit , et quand j arrive a une chose , j en rajoute une autre ...
j' ai trouver pourquoi je ne sais pas changer le sens du moteur avec actionMoteur ,
dans les variable , j 'ai
int pin1Moteur=4; //pin de commande moteur 1
int pin2Moteur=8; // pin de commande moteur 1
pour que ça fonctionne , je dois mettre les deux pinMoteur =4
et la , le sens change quand je mets actionMoteur 1 ou -1
est ce normal de mettre les deux pins sur la même sortie ?

ben oui, puisque c'est le meme fils qui commande le moteur

comprend rien ... :slight_smile:
si c est le même fil , comment il fait la différence pour les " etat1 " et " etat2 " pour le sens ? et le frein moteur ?

 if (sens==1){
   etat1=1;
   etat2=0;
 }
 else if (sens==-1){
   etat1=0;
   etat2=1;
 }
 else {
   etat1=0;
   etat2=0;
 }

pepe ,

effectivement , c 'est un pont en H , mais celui d'arduino ne délivre pas assez d'ampère pour mon moteur
donc voici celui que j'ai acheter

https://docs.google.com/document/d/1y_7Y7sBA5iZ3k-yg4KWTuMB1gtgO9VHCjWCRMcEacOY/view

il est compatible avec l'arduino uno broche pour broche

pepe ,

merci pour les infos sur la carte , je suis passer a coté ..
pour le code , tu l as trouvé quelque part ( si oui je serais intéresser d'avoir le lien ) ? ou tu viens de le faire en 5min ? :-))
ça fait , 3 ou semaines que je suis la dessus , je ne compte plus les heures de soirée passée devant le pc ..
merci pour le code ( je le chargerai pour essai) et ton aide
bonne journée