mettre une sortie a l'etat haut, periode et durée configurable.

Bonsoir,

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.

une idée ?

bonne soirée :smiley:

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
}

moi je ferai ça :

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
  }
   
}

Bonjour,

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
}

Ps: c'est de la PWM software, ni plus, ni moins :wink:

une question : pourquoi utiliser "static long previousMillis = 0; " au lieu de le déclarer au début du programme ?

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 :wink:
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.

Ok merci de cette réponse claire

merci a tous pour vos reponses