led clignotante ne s'éteind pas complètement?

Bonjour j’ai un code qui fonctionne avec millis pour faire clignoter une led mais sera utilsé aussi avec un buzzer si ça fonctionne.

Le problème est que la led ne s’éteint pas complètement. Quand au même essai avec un buzzer il ne s’arrête pas. Je ne comprends pas.

Pourriez-vous m’aider svp? le code est ci-dessous.

Je ne suis pas contre une programmation alternative pour le même résultat.
Merci pour votre aide.

int led= 7;
unsigned long tempsDebut; // variable pour stocker le temps de départ
unsigned long tempsActuel;// variable pour stocker le le temps qui s'écoule

unsigned long duree3;// variable pour stocker la duree d'attente

void setup() {
  Serial.begin(9600);// on initialise la communication série
  pinMode(led, OUTPUT);
  
  tempsDebut = millis(); // on initialise le temps de départ sur le temps Arduino
  
  duree3 = 5000;
}
void loop() {
    tempsActuel = millis(); //on stocke le temps Arduino
  if (tempsActuel - tempsDebut < duree3) {
  bip();
  }
   }
  

void bip() {  

   if (tempsActuel - tempsDebut >= 500) {// on teste si la durée est dépassée
      digitalWrite(led, HIGH);
      
   if (tempsActuel - tempsDebut >= 1000) { 
      digitalWrite(led, LOW);
    
   if (tempsActuel - tempsDebut >= 1500) {
      digitalWrite(led, HIGH);
   
   if (tempsActuel - tempsDebut >= 2000) { 
      digitalWrite(led, LOW);
   
   if (tempsActuel - tempsDebut >= 2500) {
      digitalWrite(led, HIGH);
  
   if (tempsActuel - tempsDebut >= 3000) { 
      digitalWrite(led, LOW);
  
    if (tempsActuel - tempsDebut >= 3500) {
       digitalWrite(led, HIGH); 
  
    if (tempsActuel - tempsDebut >= 4000) { 
       digitalWrite(led, LOW);

    if (tempsActuel - tempsDebut >= 4500) {
       digitalWrite(led, HIGH); 
  
    if (tempsActuel - tempsDebut >= 5000) { 
       digitalWrite(led, LOW);
    }
  }
    }
}
    }
}
   }
}
  }
}
  }

C'est normal, tes conditions sont simplistes. Tu fais du PWM sans le vouloir.
Si par exemple ton tempsActuel vaut 3000, il est donc supérieur à 500, à 1000, à 1500, à 2000 et à 2500.
Ton code exécute donc ON, OFF, ON, OFF, ON.

Pour chaque test il faut ajouter une condition du type :
si temps est supérieur à x et inférieur à x+500

Mais il y a plus simple :

void bip() {

  if ((tempsActuel - tempsDebut) % 500 == 0) {
    digitalWrite(led, HIGH);
  }
  if ((tempsActuel - tempsDebut) % 1000 == 0) {
    digitalWrite(led, LOW);
  }
}

@+

Magnifique hbachetti, toujours en première ligne. :wink:

j'ai testé c'est impeccable. Après quelques recherches je ne comprends pas bien "% 500 == 0".

Pourriez-vous m'expliquez en quelques mots svp.

Merci encore.

% en C/C++ c'est le modulo, c'est à dire le reste d'une division.

Ici, la condition est vrai si le reste de la division par 500 vaut 0.,

Ah je comprends mieux j'ai souvent utilisé le modulo dans Excel quand je travaillais toujours.

Autre chose le PWM si je me souviens bien c'est une modification du rapport cyclique comme les alimentations à découpage.

Merci

C'est ça, de l'anglais Pulse width modulation, en français, MLI: Modulation de largeur d'impulsion