Probleme de temporisation bouton Poussoir

Bonjour à tous ,

je bute actuellement sur un programme qui me paraissait simple , mais apparemment pas tant que ça :slight_smile:

je voudrais , ''simplement " commander une led avec un bouton poussoir , mais avec 2 contraintes :
si j'appuie sur le BP , la led doit forcement s'allumer 2 secondes ( même si j'appuie sur le BP moins de 2 secondes )
et si j'appuie plus que 2 secondes , elle reste allumé évidement tant que j'appuie et doit s'éteindre aussitôt que j’arrête l'appuie sur le BP

j'en suis là pour l'instant , mais je ne vois pas où ça pèche >:(

const int BPoussoir = 8; 


const int Led = 2; 


unsigned long temps = 0;


int Etat = 0; 


void setup()
{
   pinMode(Led, OUTPUT); 
  
   pinMode(BPoussoir, INPUT_PULLUP); 
    
}
void loop()
{
 

 
       if (( digitalRead(BPoussoir) == LOW ) && ( Etat == 0   ))
       {
        temps = millis(); // on demarre le comptage
        digitalWrite(Led,HIGH); // on active la sortie
        
       } 
       
      if ((millis()-temps >= 2000)   ) // 
      {
  
         
      if  (digitalRead(BPoussoir) == HIGH ) // Bp relaché
           {
           digitalWrite(Led,LOW); 
           Etat = 0 ;
           }
           
      
      if  (digitalRead(BPoussoir) == LOW ) // on reste appuyé
           {
           digitalWrite(Led,HIGH); 
           Etat = 1 ;
           }  
  
   }     
  
  delay(5);

}

merci d'avance pour votre aide

Bonjour,

C'est assez simple:

  • quand on vient d'appuyer sur le bouton tu mémorises millis() et tu allumes la led
  • en continu s'il s'est écoulé plus de 2s depuis l'appui tu recopie l'état du bouton (inversé) sur la led. Donc si le bouton continue à être enfoncé la led sera allumée.
const int BPoussoir = 8;
const int Led = 2;

void setup()
{
  pinMode(Led, OUTPUT);

  pinMode(BPoussoir, INPUT_PULLUP);
}
void loop()
{
  static bool etatPrec=false; // état précédent du bouton
  static unsigned long debutAppui=0;
  
  bool etat=digitalRead(BPoussoir) == LOW;

  if (etat!=etatPrec)
  {
    etatPrec=etat;
    if (etat)
    {
      debutAppui=millis();
      digitalWrite(Led,HIGH);
    }
    delay(20);  // anti rebond
  }

  if (millis()-debutAppui>=2000)
    digitalWrite(Led,etat);
}

un grand merci pour votre aide , c'est parfait !
je vais tester ce soir
bien à vous

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.