Mettre en ordre des commandes Blink

Bonjour,
Je travaille sur un projet avec plusieurs interrupteurs et plusieurs led…

Voici ma fonction pour faire clignoter la LED1, tout fonctionne mais lorsque je click sur l’interrupteur, la led commence “aléatoirement” soit par le niveau bas soit par le niveau haut !

Je ne comprends pas ou agir pour que le clignotement commence toujours par l’état haut lors du click…

Merci
Bib

////////  FONCTIONS  /////////

  int LEDON1(void)
  {  unsigned long currentMillis1 = millis();
   if(currentMillis1 - previousMillis1 > interval) {
    previousMillis1 = currentMillis1;   
    if (ledState1 < 255)
      ledState1 = 255;          // 100%
    else
      ledState1 = 51;           // 20%
    analogWrite(LED1, ledState1);
  }
  }   //// Fin de LEDON1 !

Bonjour,

Il faut que tu mettes ledState1 et previousMillis1 dans l'état qui va bien avant d'appeler LEDON1 pour le premier cycle.

Merci pour ta réponse.
En fait je le fais avant le SETUP évidement.
Si je comprends bien tu me conseilles de le faire juste avant l’appel de la fonction.

const int BUTTON1 = 2;     // Interrupteur 1
const int BUTTON2 = 3;     // Interrupteur 2
const int BUTTON4 = 4;     // Interrupteur 4
const int LED1 = 9;
const int LED2 = 10;
const int LED4 = 11;

// FONCTION COMPTEUR 1/2/4
unsigned char COMPTEUR1 = 0;        unsigned char COMPTEUR2 = 0;        unsigned char COMPTEUR4 = 0;
unsigned char switchState1 = 0;     unsigned char switchState2 = 0;     unsigned char switchState4 = 0;
unsigned char prevSwitchState1 = 0; unsigned char prevSwitchState2 = 0; unsigned char prevSwitchState4 = 0;

// FONCTION DEBOUNCE SWITCH 1/2/4
const unsigned int debounceTime = 50;   // en milliseconds
unsigned long switchPressTime;          // when the switch last changed state


// FONCTION BLINK 1/2/4
unsigned char ledState1 = LOW; unsigned char ledState2 = LOW; unsigned char ledState4 = LOW;   
long previousMillis1 = 0; long previousMillis2 = 0; long previousMillis4 = 0;
const unsigned int interval = 500;       // INTERVAL BLINK

void setup() {
  Serial.begin(9600);
  pinMode(BUTTON1,INPUT_PULLUP);   //CF01 !
  pinMode(BUTTON2,INPUT_PULLUP);   //CF02 !
  pinMode(BUTTON4,INPUT_PULLUP);   //CF04 !
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED4, OUTPUT);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED4, LOW);
}

void loop() {
  switchState1 = digitalRead(BUTTON1);      // Vérifie l'état du BUTTON1
  switchState2 = digitalRead(BUTTON2);      // Vérifie l'état du BUTTON2
  switchState4 = digitalRead(BUTTON4);      // Vérifie l'état du BUTTON3
  
  if (switchState1 != prevSwitchState1) {   // comparaison avec l'état précedent
    if (millis () - switchPressTime >= debounceTime) {     // Debounce
       switchPressTime = millis (); 
        prevSwitchState1 = switchState1;  // mis à jour de prevswitchState1 avec switchState1
         if (switchState1 == LOW) {
          if (COMPTEUR1 == 0) { COMPTEUR1 = 1; }
           else { COMPTEUR1 = 0; LEDOFF1(); }     // Pour éteindre la LEDOFF1 une seule fois
         Serial.print(" COMPTEUR 1 : "); Serial.println(COMPTEUR1);
   }     // Fin de compteur 0-1
   }     // Fin de Debounce avec millis
   }     // Fin de Changement du switch
      if (COMPTEUR1 == 1) { LEDON1() ;}     // Pour une boucle Blink
           
  } //// Fin de LOOP !




////////  FONCTIONS  /////////

  int LEDON1(void)
  {  unsigned long currentMillis1 = millis();
   if(currentMillis1 - previousMillis1 > interval) {
    previousMillis1 = currentMillis1;   
    if (ledState1 < 255)
      ledState1 = 255;          // 100%
    else
      ledState1 = 51;           // 20%
    analogWrite(LED1, ledState1);
  }
  }   //// Fin de LEDON1 !

 
  int LEDOFF1(void)
  { digitalWrite(LED1, LOW); }

 int LEDOFF2(void)
  { digitalWrite(LED2, LOW); }
  
  int LEDOFF4(void)
  { digitalWrite(LED4, LOW); }

Oui, quand tu fais COMPTEUR1=1

Ou alors si tu veux un programme plus structuré, tu prévois une fonction LEDON1 qui fait les initialisations suivant un paramètre qu'on lui passe.

Un grand merci.
Je viens de comprendre la logique di ledState1 !
J'ai le résultat escompté sans toucher à previousMillis1 (qui = 0).
Pas de problème pour previousMillis1 ?

 if (switchState1 != prevSwitchState1) {   // comparaison avec l'état précedent
    if (millis () - switchPressTime >= debounceTime) {     // Debounce
       switchPressTime = millis (); 
        prevSwitchState1 = switchState1;  // mis à jour de prevswitchState1 avec switchState1
         if (switchState1 == LOW) {
          if (COMPTEUR1 == 0) {
            COMPTEUR1 = 1;
            ledState1 = 0;     // LED1 HIGH lors du Click
            }
           else { COMPTEUR1 = 0; LEDOFF1(); }     // Pour éteindre la LEDOFF1 une seule fois
         Serial.print(" COMPTEUR 1 : "); Serial.println(COMPTEUR1);
   }     // Fin de compteur 0-1
   }     // Fin de Debounce avec millis
   }     // Fin de Changement du switch
      if (COMPTEUR1 == 1) { LEDON1() ;}     // Pour une boucle Blink

previousMillis1 n'est pas à 0 (sauf au tout début), il est dans l'état ou l'a laissé LEDON1()
Tu n'es pas obligé de le réinitialiser, tu peux simplement avoir un léger retard à l'allumage si tu fais rapidement plusieurs appuis successifs sur bouton1.

Merci Kamill j'ai saisis :slight_smile: