Ma question est simple, j'aimerai mettre une sortie de l'arduino a l'etat haut pendant par exemple 1 minutes toute les 5min d'interval, évidement delay(); ne fonctionne pas puisque 'elle bloque le programme, jai donc tester Blink without Delay, mais l’inconvénient est que le temps d'interval est le même que le temps d'activation de la sortie, 5min d'interval suivra de 5min d'activation ... j'ai également regarder du coter des libs timer, mstimer, flexitimer sans grand succés.
Ca se fait pourtant bien avec la méthode du "Blink without Delay".
Le principe :
time_zero = time(); // memoriser le t0
pin état LOW;
debut boucle
si (time() -time_zero )> 4 minutes alors mettre en marche, pin état HIGH
si (time() -time_zero )> 5 minutes alors reset (time_zero = time() et pin état LOW)
fin boucle
Avec des delay() ça fonctionne, mais si tu veux faire autres choses entre deux, c'est indispensable avec millis() .
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000*240); // 4 minutes
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000*60); // 1 minute
}
int t1 = 300*1000; //5mn
int t2 = 60*1000; //1mn
int led = 13; // n° de sortie
int timer1; // mémoire du time
void setup() {
pinMode(led, OUTPUT);
timer1=millis()+t1; // initialise le timer1
}
void loop() {
int time=millis();
if (time>timer1+t1){ // toutes les 5mn
digitalWrite(led, HIGH);
if (time>timer1+t1+t2){digitalWrite(led, LOW); timer1=time;} // au bout de 6mn on recommence
}
}
La solution de Christian est la bonne.
Même si personnellement je trouve plus propre de mettre la proche à LOW après 60s, au lieu de HIGH après 4 minutes.
Car dans cette configuration l'attente de 4 minutes au début n'est pas forcément des plus pratique pour debug.
fifi82 : pourquoi faire compliqué quand on peut faire simple ?
// La sainte broche, amen.
const int ledPin = 13;
void setup() {
// Place la broche en sortie et la met dans un état connue (haut)
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
}
void loop() {
unsigned long currentMillis = millis(); // Le temps courant
static long previousMillis = 0; // Le temps du dernier cycle
// Place la broche à l'état bas après 60s
if(currentMillis - previousMillis > 60000) {
digitalWrite(ledPin, LOW);
}
// Place la broche à l'état haut après 5min et recommence le cycle
if(currentMillis - previousMillis > 300000) {
previousMillis = currentMillis;
digitalWrite(ledPin, HIGH);
}
// Temps libre pour faire autre chose
}
fifi82:
une question : pourquoi utiliser "static long previousMillis = 0; " au lieu de le déclarer au début du programme ?
Parce que les variables globales inutilement globales qui forment un bon gros bloc illisible en début de programme c'est juste moche et source de problèmes
Faire une variable locale static quand on le peut revient à la même chose qu'une variable globale, l'aspect illisible et source de bug en moins.