Délai entre plusieurs mesures

Bonjour à tous

Je bloque depuis deux jours sur un problème de millis (un de plus) pour avoir un délais de 5 secondes entre la mesure de plusieurs capteurs. Malgré de nombreuses recherches et modifs, je n'ai pas résolu mon problème.

     unsigned long tpsmillis = 0;
     unsigned long debtps = 0;
     const long attente = 5000;
------------
  tpsmillis = millis();                                 
  if (tpsmillis - debtps >= attente ) {  lecture1();   }
  if (tpsmillis - debtps >= attente ) { lecture2();  }
  if (tpsmillis - debtps >= attente ) { lecture3();  }
  if (tpsmillis - debtps >= attente ) { lecture4(); debtps = tpsmillis; }

Mes résultats sont, soit les mesures se font en cascade, soit seulement la 1ere mesure est faite.

Merci de bien vouloir me détartrer ma cafetière

Pour détartrer, rien ne vaut le vinaigre...

Que veux-tu faire ? Est-ce que ceci te convient ?

  • t=0 : lecture1
  • t = 5s : lecture2
  • t = 10s : lecture 3
  • t = 15s : lecture4
    Ensuite, on reboucle ou pas ?

Si on ne reboucle pas le plus simple est de mettre tout dans le setup :

void setup() {
// définitions diverses
lecture1(); 
delay(5000); lecture2(); 
delay(5000); lecture3(); 
delay(5000); lecture4(); 
}

Si on reboucle, il faut mettre ça dans la loop.

L'instruction delay n'est pas à bannir forcément, elle est utile si tu ne veux rien faire d'autre dans ton code. Par contre, si tu veux faire autre chose que ces lectures, alors oui, ta solution utilisant millis() est à privilégier.

     unsigned long debtps = 0;
     const unsigned long attente = 5000ul;
     byte numLecture = 0;

---

void setup() {
...
debtps = millis();
}

void loop () {
if (millis() - debtps > attente) {
  debtps = millis();
  switch (numLecture) {
    case 0: lecture1(); break;
    case 1: lecture2(); break;
    case 2: lecture3(); break;
    case 3: lecture4(); break;
  }
  numLecture = (numLecture+1)%4;
}
// ici autres choses à faire
}

A tester, j'ai juste écrit ça comme c'est venu...

Bonjour
Pour prendre en compte l'écoulement du temps il faut raffraichir la variable tpsmillis, avec le code présenté dans la demande initiale la fonction millis () n'est appelée qu'une seule fois avant l'ensemble des tests ...... qui portent donc tous sur la même valeur de tpsmillis

If you are not doing anything else between reads you can use the delay() function. If you want to use mills try this link: Arduino Tutorial: Using millis() Instead of delay() – Norwegian Creations . This answer is to help you get started in your problem solving, not solve it for you.
Good Luck & Have Fun!
Gil

Hello, Bonjour,

Ici nous sommes sur le forum francophone et nous parlons en français.
Here we are on the French-speaking forum and we speak French

Merci,
Thanks.

J'ai enfin trouvé une solution simple que voici.
Il y a des tas d'exemples sur le net, mais trop compliqués à dépouiller pour avoir simplement ce que je recherche.
J'ai donc fait un petit programme avec trois led.

[code]
 // Utilisation de millis() pour plusieurs commandes à la suite
  
int Prouge = 3;
int Pverte = 4;
int Pjaune = 5;

unsigned long tpsmillis = 0;
unsigned long debutps = 0;
int attente = 5000;
byte pointeur = 0;

void setup() {

  pinMode (Prouge, OUTPUT);
  pinMode (Pverte, OUTPUT);
  pinMode (Pjaune, OUTPUT);

  void rouge();
  void verte();
  void jaune();
  }

void loop() {
  
   tpsmillis = millis(); 
if ( tpsmillis - debutps > attente ) { pointeur ++ ; if (pointeur > 3) { pointeur = 1; } debutps = tpsmillis ; 

switch (pointeur) {
  case 1: rouge(); break;
  case 2: verte(); break;
  case 3: jaune(); break;
} }
}

void rouge() { 
  digitalWrite (Prouge,HIGH) ; delay(1000); digitalWrite (Prouge,LOW) ; }

void verte() { 
  digitalWrite (Pverte,HIGH) ; delay(1000); digitalWrite (Pverte,LOW) ; }

void jaune() { 
  digitalWrite (Pjaune,HIGH) ; delay(1000); digitalWrite (Pjaune,LOW) ; }

[/code]

Ça ressemble un peu à ce que je t'ai proposé, mais fais attention car il y a encore des delay !

Effectivement Lesept, je m'en suit inspiré. Les delay() ne sont là que pour faire éclairer les led pour l'exemple, et démontrer que les millis() sont indépendants du reste du temps du programme.
Les capteurs que j'utilise ne travaillent que quelques milli secondes.

Les trois dernières lignes du setup sont à enlever ou déplacer avant le setup