temporisation avec millis()

Bonsoir a tous
Je rencontre un problème simple que je n'arrive pas à résoudre
J'ai passé l'après-midi sur internet, maintenant je ne sais plus ou j'en suis
je cherche à allumer une Led avec un BP pendant 5 secondes sans delay() mais avec millis()
Voici le code que j'ai réalisé mais la Led reste allumée
merci de votre aide

//le bouton est connecté à la broche 3 de la carte Adruino
const int BPM = 3; 

//la sortie à la broche 4
const int SortieM = 4; 

// variable temps en ms
unsigned long time;

void setup()
{
   pinMode(SortieM, OUTPUT); //la sortie est une sortie......
  
   pinMode(BPM, INPUT); //le bouton est une entrée
   digitalWrite(BPM, HIGH);  // turn on pullup resistors
   pinMode(BPM, HIGH); 
  
}
void loop()
{
  //est-ce un appui
       if ( digitalRead(BPM) == LOW ){
        time = millis(), digitalWrite(SortieM,HIGH);
       
      if (millis()-time >= 3000) {
           digitalWrite(SortieM,LOW); //on éteint la led         
       }  
      }   
  }

bonjour,
normal, tu mets la condition dans la condition du bouton.
sors cette condition en dehors du if.
de plus tu utilise un nom de variable réservé time
remplace par temps par exemple

ca m'étonnerais en plus que ton code compile tel quel

Ok
merci de ta réponse
et oui, le code compile puisque j ai mis que la led restait allumée, j ai essayé

Ça fonctionne très bien
Merci encore
Je mets le programme si ça peux intéressé quelqu'un

//le bouton est connecté à la broche 3 de la carte Adruino
const int BPM = 3; 

//la sortie à la broche 4
const int SortieM = 4; 

// variable temps en ms
unsigned long temps;

// variables anti-rebond
unsigned long TempsEcoule;  // variable pour mémoriser le temps écoulé depuis le dernier changement 



void setup()
{
   pinMode(SortieM, OUTPUT); //la sortie est une sortie
  
   pinMode(BPM, INPUT); //le bouton est une entrée
   digitalWrite(BPM, HIGH);  // turn on pullup resistors
   pinMode(BPM, HIGH);   
}
void loop()
{
  //est-ce un appui
       if ( digitalRead(BPM) == LOW )
       {
        TempsEcoule = millis();         
        temps = millis(); // on demarre le comptage
          if (millis() - TempsEcoule >= 50)
          {        
            digitalWrite(SortieM,HIGH); // on active la sortie
           }
            
              if (millis()-temps >= 150000) // 150000 = 2m30
           {
             digitalWrite(SortieM,LOW); //on éteint la led         
           }         
  }
 }

si des fois il y a des améliorations à faire, je suis preneur

Tu peux remplacer ces 3 lignes:

pinMode(BPM, INPUT); //le bouton est une entrée
digitalWrite(BPM, HIGH);  // turn on pullup resistors
pinMode(BPM, HIGH);

par:

pinMode(BPM, INPUT_PULLUP);

Tu devrais aussi intégrer une méthode de debouncing pour ton bouton. Etudie le code à la fin de cette page (mais tiens compte du fait que ton bouton est branché en Active LOW tandis que celui dans la page est branché en Active HIGH).

Merci de vos remarques, je mets a jour ce midi

C'est vrai qu'il y a souvent des subtilités dans l'utilisation des boutons.

Là, tel que le programme et codé, le délai de 3 secondes démarre APRES relâchement du bouton.

Par exemple, un appui sur le bouton pendant 5 secondes, va entraîner une led allumée pendant 8 secondes.
Et dans les 5 premières secondes, le programme va passer son temps à exécuter le premier if, et répéter de manière inutile l'instruction digitalWrite(...,HIGH).

Si c'est bien le mode de fonctionnement souhaité, alors pas de problème et pas besoin d'anti-rebond.

Par contre, si la led doit être allumée pendant 3 secondes à partir du début d'appui du bouton, puis s'éteindre même si myosotys60 s'est endormi sur le bouton, alors le code ne sera pas tout à fait le même, et là une gestion d'anti-rebond sera nécessaire.

Merci pour vos remarques très instructives.
En fait, cela ne dérange rien que le programme commence après relâchement du BP.
Mais cela ne coute rien d'y ajouter un "delay(100)"
Les modifications ont été apportées au post 4

Oui mais en général, quand on gère les temporisations par millis() au lieu de delay(), c'est pour que l'arduino puisse faire autre chose en parallèle.

Donc ajouter un delay(100) est rarement adéquat.
Tu peux également gérer cette petite temporisation via la fonction millis() + une ou deux variables d'état.

oui tout a fait, c'est le but fixé
j'ai mis delay pour faire rapide car pour l'instant le temps m'est compté
des que possible je fais le debounce avec millis()

Il m'est arrivé d'avoir un bouton qui était très sensible et qui parfois se fermait tout seul... depuis j'utilise toujours un debounce sur mes boutons, pour être sûr.

Un delay n'est pas une bonne solution de debouncing (dans un cas comme le mien, et plus généralement si ton programme doit gérer autre chose pendant ce temps).

voila, modifications apportés toujours dans le post 4
mais je viens d'essayer et ca ne fonctionne pas
je cherche pourquoi

je laisse ici le programme qui fonctionne sans le debounce

//le bouton est connecté à la broche 3 de la carte Adruino
const int BPM = 3; 

//la sortie à la broche 4
const int SortieM = 4; 

// variable temps en ms
unsigned long temps;

void setup()
{
   pinMode(SortieM, OUTPUT); //la sortie est une sortie
  
   pinMode(BPM, INPUT_PULLUP); //le bouton est une entrée
    
}
void loop()
{
  //est-ce un appui
       if ( digitalRead(BPM) == LOW )
       {
        temps = millis(); // on demarre le comptage
        digitalWrite(SortieM,HIGH); // on active la sortie
       }       
      if (millis()-temps >= 5000) // 150000 = 2m30
      {
           digitalWrite(SortieM,LOW); //on éteint la led         
       }         
  }