Aide pour minuterie [RESOLU]

Bonjour à tous,

je cherche a créer une minuterie sur l’arduino avec possibilité de regler le temp d’allumage et le temp d’exctinction et en utilisant la fonction millis. J’ai ecrit un bout de code mais je n’arrive pas a mes fins.

Dans ce code j’essai en faite d’activé la pompe dans une tempo avec la fonction millis qui a pour delai le temp d’allumage + le temp d’exctinction et à l’interrieur de cette tempo j’ai mis une autre temporisation avec pour delai le temp d’exctinction.
Je ne sais pas si je procede de la bonne maniere et je ne comprend pas le probleme.
Quelqu’un pourrait me mettre sur la vois ou m’expliquer ce qui ne va pas dans mon code?

Merci Beaucoup

#include <LiquidCrystal.h>



int intervalAllumage = 5000;
int intervalExctinction = 2000;
//boolean etatAllumage;
//boolean etatExctinction;
boolean etat;
long previousMillis;
long previousMillis2;
LiquidCrystal lcd(47, 48, 49, 50, 51, 52);

void setup()
{
  pinMode(13, OUTPUT);
  lcd.begin(20,4);
}

void loop()
{
  unsigned long currentMillis = millis();
 //Allumage
  if(currentMillis - previousMillis > (intervalAllumage + intervalExctinction)) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   
      // digitalWrite(13, HIGH); 
      // etatAllumage = true;
       etat = true;

//Exctinction  
  
  if (currentMillis - previousMillis2 > intervalExctinction)
  {
    previousMillis2 = currentMillis; 
    // digitalWrite(13, LOW);  
etat = false;
//etatExctinction = true;
  }
  }

/*
  else
 {
   digitalWrite(13, HIGH);
  etat = true;
}
*/
  
  if (etat == true)
  {
//  lcd.setCursor(0,0);
 // lcd.print("a");
 digitalWrite(13, HIGH);
      
  }
  else if (etat == false)
  {
//  lcd.setCursor(0,0);
//  lcd.print("D");
digitalWrite(13, LOW);
  }
  
  }

J’ai trouvé un debut de solution mais je rencontre un autre probléme.

Le code allume bien la led avec les temps de consigne mais si je remplace la fonction d’allumage de la led par une variable boolean, et que j’allume la led en fonction de cette variable, elle ne s’allume pas.

Voici le code qui fonctionne :

#include <LiquidCrystal.h>



int intervalAllumage = 10000;
int intervalExctinction = 5000;
boolean etat;
long previousMillis;
long previousMillis2;
LiquidCrystal lcd(47, 48, 49, 50, 51, 52);

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(27, OUTPUT);
  lcd.begin(20,4);
}

void loop()
{
  
  unsigned long currentMillis = millis();
 //Allumage
  if(currentMillis - previousMillis > (intervalAllumage + intervalExctinction)) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   
      // digitalWrite(13, HIGH); 
      // etatAllumage = true;
   digitalWrite(27, LOW);
 etat = false;
  }
//Exctinction  
  
else  if (currentMillis - previousMillis < intervalAllumage)
  {
    // digitalWrite(13, LOW);  
digitalWrite(27, HIGH);
//etat = true;
  }
  digitalWrite(27, LOW);
//  etat = false;


  
  }

et celui qui ne foonctionne pas :

#include <LiquidCrystal.h>



int intervalAllumage = 10000;
int intervalExctinction = 5000;
boolean etat;
long previousMillis;
long previousMillis2;
LiquidCrystal lcd(47, 48, 49, 50, 51, 52);

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(27, OUTPUT);
  lcd.begin(20,4);
}

void loop()
{
  
  unsigned long currentMillis = millis();
 //Allumage
  if(currentMillis - previousMillis > (intervalAllumage + intervalExctinction)) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   
      // digitalWrite(13, HIGH); 
      // etatAllumage = true;
  // digitalWrite(27, LOW);
 etat = false;
  }
//Exctinction  
  
else  if (currentMillis - previousMillis < intervalAllumage)
  {
    // digitalWrite(13, LOW);  
//digitalWrite(27, HIGH);
etat = true;
  }
//  digitalWrite(27, LOW);
  etat = false;


if (etat == false)
digitalWrite(13, LOW);
else if (etat == true)
digitalWrite(13, HIGH);


  
  }

Quelqu’un à une idée?

Merci

(...)
else  if (currentMillis - previousMillis < intervalAllumage)
  {
    // digitalWrite(13, LOW);  
//digitalWrite(27, HIGH);
etat = true;
  }
//  digitalWrite(27, LOW);
  etat = false;                        // faudrait peut-être enlever ça?


if (etat == false)
digitalWrite(13, LOW);

(...)

Forcément, vu que tu as un etat = false, juste au-dessus de ton if, ben elle ne s’allumera jamais!

ti peux aussi remplacer ton dernier if (etat == false){} par digitalWrite(13, etat); qui sera plus simple à lire par la suite…

Bonjour,

A vouloir mélanger deux versions différentes dans un même code il ne peut y avoir que des erreurs :wink:
comme le etat=false; non commenté en fin de code qui bloque ton if par exemple.

#include <LiquidCrystal.h>

int intervalAllumage = 10000;
int intervalExctinction = 5000;
int etat; // mettre HIGH/LOW au lieu de true/false c'est plus simple de (re)lire sont code par la suite
long previousMillis;
//long previousMillis2; // non utilisé
LiquidCrystal lcd(47, 48, 49, 50, 51, 52);

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(27, OUTPUT);
  lcd.begin(20,4); // il ne manquerai pas un morceau ? aucun lcd.print nulle part !?
}

void loop()
{
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > (intervalAllumage + intervalExctinction)) {
    previousMillis = currentMillis;   
    etat = HIGH;
  }
  else
    if (currentMillis - previousMillis < intervalAllumage)
      etat = LOW;

  digitalWrite(13, etat);
}

Merci pour votre aide mais j’ai toujours un soucis.

Lorsque j’ecrit ce code, cela fonctionne mais l’intensité d’eclairage des led diminue si je rajoute plusieurs fois ce code pour faire plusieurs minuterie.

int intervalAllumage = 1000;
int intervalExctinction = 2000;
long previousMillis;

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(27, OUTPUT);
}

void loop()
{
  
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > (intervalAllumage + intervalExctinction)) {
    previousMillis = currentMillis;   
   digitalWrite(27, LOW);
  }
  
  else  
    if (currentMillis - previousMillis < intervalAllumage)  {
digitalWrite(27, HIGH);
  }
 digitalWrite(27, LOW);// Si je retire sa, sa ne fonctionne plus
 
 
  
  }

Par contre avec ce que tu m’a conseillé de faire, c’est a dire remplacer l’ecriture de la sortie par la variable etat est ecrire l’etat de la sortie en fonction de celle-ci. Le code ne fonctionne plus.

Encore merci pour votre aide.

C’est bon j’ai trouvé, voila le code qui fonctionne pour ceux qui rencontrerai le même probleme.

int intervalAllumage = 1000;
int intervalExctinction = 5000;
long previousMillis;
int etat;

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(27, OUTPUT);
}

void loop()
{
  
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > (intervalAllumage + intervalExctinction)) {
    previousMillis = currentMillis;   
   etat = LOW;
  }
  
  
    if (currentMillis - previousMillis > intervalExctinction)  {
etat = HIGH;
  }
  digitalWrite(13, etat);
 
 
  
  }

J’avais mis

 if (currentMillis - previousMillis < intervalExctinction)  {
etat = HIGH;
  }

Au lieu de

 if (currentMillis - previousMillis > intervalExctinction)  {
etat = HIGH;
  }

:0

Merci de m’avoir aidé