Fonction millis() sur plusieurs palier

Bonjour,

J’ai besoin d’utilise la fonction millis() sur plusieurs palier ou séquence, je ne sais pas trop comment l’expliquer. Impossible pour moi d’utiliser la fonction delay() parce que ça bloque le reste du programme.

Dons pour expliquer mon programme que j’ai simplifié, c’est pour du chauffage, dans le code les radiateurs représenté par Led 1-2-3 et les 3 modes par Bouton 1-2-3. L’Arduino doit démarrer ou éteindre les radiateurs selon le mode choisi mais avec un délai entre les démarrages.

ModeOFF : aucun démarre ou arrête les 3

ModeA : Démarre le radiateur #1, 5 secondes plus tard démarre le radiateur #2 et le 3ime reste à arrêt.

ModeB : Démarre le radiateur #1, 5 secondes plus tard démarre le radiateur #2, 5 secondes plus tard démarre le radiateur #3.

Voilà, assez simple mais j’éprouve de la difficulté a géré la fonction millis().

//INPUT_PULLUP = Bouton connecter entre le GND et la PIN#

int Start_Dragon_Interval = 5000; //Temps interval entre chaque avant de demarre l'autre. (5 Sec)
unsigned long lastmillis = 0;

const byte Bouton1 = 2;     //PIN_BOUTON 1 : Met le tout a OFF (Mode OFF)
const byte Bouton2 = 3;     //PIN_BOUTON 2 : Active LED 1-2 (Mode A)
const byte Bouton3 = 4;     //PIN_BOUTON 3 : Active LED 1-2-3 (Mode B)

const byte Led1 = 10;     //PIN_LED 1
const byte Led2 = 11;     //PIN_LED 2
const byte Led3 = 12;     //PIN_LED 3

boolean BoutonState1 = 1;
boolean BoutonState2 = 1;
boolean BoutonState3 = 1;

boolean ModeOFF = 0;
boolean ModeA = 0;
boolean ModeB = 0;

void setup() {
  pinMode(Bouton1, INPUT_PULLUP);
  pinMode(Bouton2, INPUT_PULLUP);
  pinMode(Bouton3, INPUT_PULLUP);
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
  pinMode(Led3, OUTPUT);
}

void loop() {
  BoutonState1 = digitalRead(Bouton1);
  BoutonState2 = digitalRead(Bouton2);
  BoutonState3 = digitalRead(Bouton3);

  if (BoutonState1 == 0) {
    ModeOFF = 1;
    ModeA = 0;
    ModeB = 0;
  }
  if (BoutonState2 == 0) {
    ModeOFF = 0;
    ModeA = 1;
    ModeB = 0;
  }
  if (BoutonState3 == 0) {
    ModeOFF = 0;
    ModeA = 0;
    ModeB = 1;
  }
  if (ModeOFF == 1) {
    digitalWrite (Led1, LOW);
    digitalWrite (Led2, LOW);
    digitalWrite (Led3, LOW);
  }
  if (ModeA == 1) {
    lastmillis=millis();
    digitalWrite (Led1, HIGH);
    if (lastmillis + Start_Dragon_Interval < millis()){
      digitalWrite (Led2, HIGH);
      digitalWrite (Led3, LOW);
    }
  }
  if (ModeB == 1) {
    digitalWrite (Led1, HIGH);
    digitalWrite (Led2, HIGH);
    digitalWrite (Led3, HIGH);
  }
}

Bonjour Labol,

Ton problème est que tu actualise constamment ta valeur lastMillis (donc celle ci est tout le temps égale à millis).

Pour éviter ce problème tu peux mettre un verrou qui ne fait s'éxécuter l'affectation de millis() à last millis qu'une seule fois, ex:

//INPUT_PULLUP = Bouton connecter entre le GND et la PIN#

int Start_Dragon_Interval = 5000; //Temps interval entre chaque avant de demarre l'autre. (5 Sec)
unsigned long lastmillis = 0;

const byte Bouton1 = 2;     //PIN_BOUTON 1 : Met le tout a OFF (Mode OFF)
const byte Bouton2 = 3;     //PIN_BOUTON 2 : Active LED 1-2 (Mode A)
const byte Bouton3 = 4;     //PIN_BOUTON 3 : Active LED 1-2-3 (Mode B)

const byte Led1 = 10;     //PIN_LED 1
const byte Led2 = 11;     //PIN_LED 2
const byte Led3 = 12;     //PIN_LED 3

boolean BoutonState1 = 1;
boolean BoutonState2 = 1;
boolean BoutonState3 = 1;

boolean ModeOFF = 0;
boolean ModeA = 0;
boolean ModeB = 0;

boolean VerouModeA = 0;  // Verrou pour n'actualiser lastmillis qu'une seule fois

void setup() {
  pinMode(Bouton1, INPUT_PULLUP);
  pinMode(Bouton2, INPUT_PULLUP);
  pinMode(Bouton3, INPUT_PULLUP);
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
  pinMode(Led3, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  BoutonState1 = digitalRead(Bouton1);
  BoutonState2 = digitalRead(Bouton2);
  BoutonState3 = digitalRead(Bouton3);

  if (BoutonState1 == 0) {
    ModeOFF = 1;
    ModeA = 0;
    ModeB = 0;
  }
  if (BoutonState2 == 0) {
    ModeOFF = 0;
    ModeA = 1;
    ModeB = 0;
  }
  if (BoutonState3 == 0) {
    ModeOFF = 0;
    ModeA = 0;
    ModeB = 1;
  }
  if (ModeOFF == 1) {
    digitalWrite (Led1, LOW);
    digitalWrite (Led2, LOW);
    digitalWrite (Led3, LOW);
  }
  if (ModeA == 1) {
    if (VerouModeA == 0){ 
      lastmillis=millis();
      VerouModeA = 1;      //Mise a 1 du verrou
    }
    digitalWrite (Led1, HIGH);
    if (lastmillis + Start_Dragon_Interval < millis()){
      digitalWrite (Led2, HIGH);
      digitalWrite (Led3, LOW);
      VerouModeA = 0;      //Mise a 0 du verrou
    }
  }
  if (ModeB == 1) {
    digitalWrite (Led1, HIGH);
    digitalWrite (Led2, HIGH);
    digitalWrite (Led3, HIGH);
    Serial.println("LED1 = HIGH");
    Serial.println("LED2 = HIGH");
    Serial.println("LED3 = HIGH");
    Serial.println();
  }
}

Regarde le principe du verrou au debut du mode A, il permet de mémoriser la valeur de millis sans la raffraichir jusqu'à l'exécution de ton 2e IF.

Bonjour maxpeigne,

Merci pour la piste du verrou, sa ma aider beaucoup et fini par fonctionner. Voici le final

++ :wink:

//INPUT_PULLUP = Bouton connecter entre le GND et la PIN#

int Start_Dragon_Interval = 3000; //Temps interval entre chaque avant de demarre l'autre. (5 Sec)
unsigned long lastmillis = 0;

const byte Bouton1 = 2;     //PIN_BOUTON 1 : Met le tout a OFF (Mode OFF)
const byte Bouton2 = 3;     //PIN_BOUTON 2 : Active LED 1-2 (Mode A)
const byte Bouton3 = 4;     //PIN_BOUTON 3 : Active LED 1-2-3 (Mode B)

const byte Led1 = 10;     //PIN_LED 1
const byte Led2 = 11;     //PIN_LED 2
const byte Led3 = 12;     //PIN_LED 3

boolean BoutonState1 = 1;
boolean BoutonState2 = 1;
boolean BoutonState3 = 1;

boolean ModeOFF = 0;
boolean ModeA = 0;
boolean ModeB = 0;

boolean MillisStep1 = 0;  // Verrou pour n'actualiser lastmillis qu'une seule fois
boolean MillisStep2 = 0;  // Verrou pour n'actualiser lastmillis qu'une seule fois

void setup() {
  pinMode(Bouton1, INPUT_PULLUP);
  pinMode(Bouton2, INPUT_PULLUP);
  pinMode(Bouton3, INPUT_PULLUP);
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
  pinMode(Led3, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  BoutonState1 = digitalRead(Bouton1);
  BoutonState2 = digitalRead(Bouton2);
  BoutonState3 = digitalRead(Bouton3);

  if (BoutonState1 == 0) {
    ModeOFF = 1;
    ModeA = 0;
    ModeB = 0;
  }
  if (BoutonState2 == 0) {
    ModeOFF = 0;
    ModeA = 1;
    ModeB = 0;
  }
  if (BoutonState3 == 0) {
    ModeOFF = 0;
    ModeA = 0;
    ModeB = 1;
  }
  if (ModeOFF == 1) {
    digitalWrite (Led1, LOW);
    digitalWrite (Led2, LOW);
    digitalWrite (Led3, LOW);
    MillisStep1 = 0;      //Mise a 0 du verrou
    MillisStep2 = 0;      //Mise a 0 du verrou
  }
  if (ModeA == 1) {
    if (MillisStep1 == 0){ 
      lastmillis=millis();
      MillisStep1 = 1;      //Mise a 1 du verrou
    }
    digitalWrite (Led1, HIGH);
    if (lastmillis + Start_Dragon_Interval < millis()){
      digitalWrite (Led2, HIGH);
      digitalWrite (Led3, LOW);
    }
  }
  if (ModeB == 1) {
    if (MillisStep1 == 0){ 
      lastmillis=millis();
      MillisStep1 = 1;      //Mise a 1 du verrou
    }
    digitalWrite (Led1, HIGH);
    if (lastmillis + Start_Dragon_Interval < millis()){
      digitalWrite (Led2, HIGH);
      if (MillisStep2 == 0){ 
        lastmillis=millis();
        MillisStep2 = 1;      //Mise a 1 du verrou
      }
      if (lastmillis + Start_Dragon_Interval < millis()){
        digitalWrite (Led3, HIGH);
      }
    }
  }
}