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.
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
}
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
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) ; }
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.