Fonction millis()

Bonjour, j'ai ce code ma foie, assez simple. Par contre, il ne fait pas exactement ce que je veux. Actuellement, le moteur fait ses 147 steps. Par la suite, il calcule 10 minutes et recommence la loop. Ce qui donne par exemple 10 minutes et 1 seconde en tout.
Ce que j'aimerais, moi, c'est qu'au moment ou le moteur se met à tourner, un timer de 10 min s'exécute. Donc, la loop durerais 10 minutes bien justes incluant les 147 steps du moteur, au lieu de 10 minutes et 1 seconde (avec les 147 step du moteur)

J'ai entendu parler de la fonction millis(). Par contre, étant un gros débutant, je n'ai aucune idée comment adapter cette fonction à ce que je veux.

Alors, merci beaucoup de m'aider!

#include <Adafruit_MotorShield.h>
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 
Adafruit_StepperMotor *myMotor1 = AFMS.getStepper(300, 1);

void setup() {
  //start serial connection
  Serial.begin(9600);
  AFMS.begin();  // create with the default frequency 1.6KHz
  
  myMotor1->setSpeed(100);  // 10 rpm   
  
}
void loop(){
  
      myMotor1->step(147, BACKWARD, DOUBLE);
      //analogWrite(PWMpin, i);
      delay(600000);
    
}

Vous lisez millis() dans un unsigned long chrono; avant de lancer les 147 steps, puis vous faites les steps et ensuite vous attendez que millis() - chrono soit plus grand que 600000ul soit en attente active si vous n’avez rien d’autre à faire, soit en bouclant la loop() (cf l’exemple blink without delay)

Cool merci! Pouvez-vous me faire un exemple à l'aide du code que j'ai soumis?

Oui je sais faire... mais pouvez vous étudiez l'exemple propposé et nous poster VOTRE travail...?

C’est comme cela que ça marche ici - il faut bosser un peu :slight_smile:

J'ai fait quelque chose comme ça.

 #include <Adafruit_MotorShield.h>
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 
Adafruit_StepperMotor *myMotor1 = AFMS.getStepper(300, 1);
unsigned long Depart;
int MonDelai= 4000;

void setup() {
    //start serial connection
  Serial.begin(9600);
  AFMS.begin();  // create with the default frequency 1.6KHz
  
  myMotor1->setSpeed(300);  // 10 rpm   
  
}
void loop(){

      Depart=millis();
      myMotor1->step(147, BACKWARD, DOUBLE);
      //analogWrite(PWMpin, i);
      if(millis() > MonDelai) {
         delay(596000);
      }
    
}

Par contre, lorsque le programme s'exécute pour la première fois, le stepper tourne plus que 147 steps. Par contre, lorsque qu'il commence à ''looper'', il se fait correctement. Hummmm :-\

Merci!

Salut,

Il faut que tu analyse l'exemple 'blink without delay' comme le dit J-M-L. Le mélange millis() et delay ne me dit rien qui vaille. Tu peux aussi consulter l’excellent blog d'Eskimon ici

Oui mais j’ai beau analyser, j’ai besoin que quelqu’un me l’explique de façon détaillée. J’y comprends rien....

C'est

Benjoo:
Par contre, lorsque le programme s'exécute pour la première fois, le stepper tourne plus que 147 steps. Par contre, lorsque qu'il commence à ''looper'', il se fait correctement. Hummmm :-\

Bonjour,

C'est normal, lors de la première bloucle mills() est inférieur à Mondelai donc il n'y a pas de delay.

Je suppose que tu voulais faire

void loop() {
  Depart = millis();
  myMotor1->step(147, BACKWARD, DOUBLE);
  //analogWrite(PWMpin, i);
  While (millis() - Depart < 600000UL); // attend 600s
}

Par contre ça bloque le programme tant que le delai n'est pas terminé comme delay()

Si tu as besoin de faire autre chose pendant ce temps, il faut effectivement faire t'inspirer de l'exemple blink without delay

Et donc pour compléter le post de Kamill plus détaillé, simple et complet que cette explication je n'en connais pas

Un gros merci kamill! Je vais essayer ça! C'est gentil de m'avoir écris un exemple. Merci aussi à J-M-L et landid!