Exécution d'une fonction pendant un certain délai

Bonjour,

Pour mon projet de SI, je dois contrôler un moteur en fonction d’un profil bien particulier. Je m’explique : ce profil possède une accélération de 0 à 12cm/s en 3s, une vitesse max de 12cm/s pendant 7s et une décélération en 1s. J’ai déjà fais tous les calculs pour determiner l’alimentation du moteur pour atteindre les 12cm/s à savoir 6V si je ne me trompe pas.

Voici mon début de code :

int M1 = 4;         // Pin shield moteur --> état du moteur                 
int E1 = 5;         // Pin shield moteur --> vitesse du moteur
int etat = 0;       // Vitesse du moteur : 0 --> 0v ; 255 --> 12v 
int etape = 0;      // Etat de la course : 0 --> initialisation ; 1 --> debut ; 2 --> fin

void setup() {
  Serial.begin(9600);
  pinMode(M1,OUTPUT);
}

void loop() {
 if (etape == 0) {
 initialisation();
 } 
 else if (etape == 1) {
 course();
 } 
 else if (etape == 2) {
 fin();
 }
}

void initialisation() {
  Serial.println("Initialisation de la caméra");
  Serial.println("---------------------------");
  Serial.println(""); 
  
  digitalWrite(M1,LOW);
  analogWrite(E1,0); 
  etape = 1;
}

void course() {
  Serial.println("Début de la course de la caméra");
  Serial.println("-------------------------------");
  Serial.println(""); 
    
  for(etat; etat < 128; etat++) {                                        
    digitalWrite(M1,HIGH);  
    analogWrite(E1,etat);                         // Le moteur est alimenté à 6v, la camera se deplace à 0,12m/s 
  }
  etape = 2;
  delay(7000);
}

void fin() {
  Serial.println("Fin de la course de la caméra");
  Serial.println("-----------------------------");
  Serial.println(""); 
    
  for(etat; etat > 0; etat--) {                                               
    digitalWrite(M1,HIGH);  
    analogWrite(E1,etat);                                     // Le moteur est alimenté à 0v, la camera est à l'arret 
  }
  digitalWrite(M1,LOW);
  etape = 3;
}

Mais ce qu’il me faut c’est exécuter la boucle for de course() pendant 3s afin d’avoir mon accélération.
En espérant avoir été assez claire.

Merci d’avance.

Vos boucles for vont s’exécuter super vite et for([color=red]etat;[/color] etat > 0; etat--) {  vous ne croyez pas qu’il manque un truc dans la première partie?

Concrètement pour bien gérer cela il faudrait soit attendre un peu dans la boucle for, soit utiliser millis() pour contrôler ce qu’il se passe et quand chnager de vitesse

Il ne manque rien, si je mets un int la boucle for dans ma fonction fin() ne fonctionne pas comme je le veux.

Oui ça je l'avais compris mais je veux que ce soit progressif, qu'a l’instant t=0s, etat=0 et à l'instant t=3s, etat=127.

Az0rg:
Il ne manque rien, si je mets un int la boucle for dans ma fonction fin() ne fonctionne pas comme je le veux.

Oui il ne faut pas en faire une variable locale qui cacherait par sa portée la variable globale. Mon point c’était plutôt l’initialisation à 0 si vous voulez que votre fonction soit réutilisable une autre fois (même si ça fonctionne là grâce à la variable globale et appel une seul fois )

Tout à fait d’accord sur l’usage de millis()

Sinon etape mériterait bien un enum pour la lisibilité...