Rendre l’appui d’un bouton poussoir temporise

Bonjour :D .

Je suis nouveau sur ce forum et en programmation sur l’arduino, j’ai besoin que lorsque j’appuis sur un bouton poussoir faut que l’appui soit maintenus pendant 3 sec (par exemple) et au bout de se délais la une LED s’allume (par exemple).

J’ai passé un sacre temps a chercher des tuto sur internet mais jais rien trouver :confused:

Je m’en doute que faut que j’utilise la fonction Millis mais j’arrive vraiment pas a maitre au point la structure du programme.

Merci pour votre aide :wink:

bonjour, appui bouton===>start=millis() si appui 3s ===>millis()-start>=3000====>allumage led

const int APPUI=0; // Bouton apuiller const int PAS_APPUI=1; //Bouton pas apuiller int ETAT_BP; // Variable etat du bouton

char start;

void setup() {

pinMode(2, INPUT); // Button digitalWrite(2, HIGH) ; // activation du pullup de la broche en entrée pinMode(13, OUTPUT); // LED }

void loop() {

ETAT_BP=digitalRead(2); // lit l'état du BP et met la valeur 0/1 dans la variable "ETAT_BP"

if (ETAT_BP==APPUI){ // si l'état du BP est appuyé start=millis();

if (ETAT_BP==APPUI==millis()-start>=3000) { digitalWrite (13 , HIGH); // allumer LED

}// fin 2eme if }// fin 1 er if

else (ETAT_BP==PAS_APPUI);{ // si l'état du BP est pas appuyé digitalWrite (13 , LOW); // eteint LED

} //fin de else if } // fin dr void loop

Ca marche bien MERCI , par contre au démarrage de la carte il a y bien les 3 sec après l’appui sur le bouton , par contre comment je fait pour faire un reset de Millis ? , car après la LED s’allume normalement je suppose que Millis ne se remet pas a 0 après une boucle complété du programme :O.

Hello,

Dans ta boucle, tu lis la valeur de millis() à chaque fois que tu passe et que bouton est appuyé. Il est impossible que tu puisses alors mesurer une différence de 3 secondes.

Cela fonctionne une fois parce que ton test ETAT_BP==APPUI==Milis()-start>=3000 est faux également.

Il y a deux tests à faire : ETAT_BP==APPUI et Millis()-start >= 3000

Il faut donc modifier ton test et changer l'assignation de start afin qu'il ne soit assigné qu'au début de la période d'appui du bouton. (Tu pourrais utiliser une variable booléenne pour cela par exemple...

Voilà... Je te laisse plancher un peu sur la chose...

Bon amusement !

Coyotte

Mercii pour sais renseignement , je vais me pencher la dessus

code entre balise code </>
merci

Bonjour,pourriez-vous indiquer le code final SVP merci.

Bonjour, j'aimerais faire un clignotant temporisé 10s .

un appuie sur l'inter je lance la tempo clignotante si aucune action la tempo s'arrête au bout de 10s et led ON.

si avant l'arrêt de la tempo j'appuie une nouvelle fois je dois pouvoir l'arrêter celle si et led off.

et je dois pouvoir relancer le cycle.

j'ai fais un code mais il ne fonctionne pas comme ça.

un appuie sur l'inter la tempo clignotante se lance 10s , et puis s'arrête et led on. si un autre appuie pendant la tempo cela arrête bien celle si et led off. (enfin la led s'éteint mais je pense que la tempo ne s'arrête pas ). le problème est que je ne peux pas redémarrer le cycle avec un autre appuie sur l'inter . quand j'appuie une autre fois la led s'allume et reste allumée fixe. voila ou j'en suis .

merci de votre aide. voici mon code

  const int LED = 13 ;
  const int BP  =  2 ;
  
  int etat_LED = 0 ;
  int etat_BP  = 0 ;

  unsigned long ms_precedente = 0  ;
  // variable qui stocke le dernier temps.
  const long interval_clignot = 500 ;
  void setup ()
  {
  pinMode       ( LED , OUTPUT ) ;
  pinMode  ( BP , INPUT_PULLUP ) ;
  }
  void loop ()
  {
  etat_BP = digitalRead ( BP ) ;
  if       ( etat_BP == HIGH ) 
  {
  digitalWrite   ( LED , LOW ) ;
  }
  if ( etat_BP == LOW ) 
  {
  unsigned long ms_actuelle = millis () ; 
  // on stocke le temps actuel dans une variable 
  // ms_actuelle.
  if ( ms_actuelle - ms_precedente >= interval_clignot )
  // si le temps actuel ( ms_actuelle ) - ( ms_précédente ) 
  // est supérieur ou égal à ( interval_clignot ) 
  // soit 1000s faire ---->
  {
  ms_precedente = ms_actuelle ;
  // on stocke la nouvelle valeur de temps passé (ms_actuelle) 
  // dans la variable ms_precedente.
  
  if ( etat_LED == LOW )
  etat_LED = HIGH ;
  else
  etat_LED = LOW ;
  digitalWrite ( LED , etat_LED ) ;
  if ( ms_precedente > 10000 )
  {
  digitalWrite ( LED , HIGH ) ;
  }}}}

Bonjour,

Tu essaies de faire la gestion de la led quand le bouton est appuyé, ça ne peut pas fonctionner car le traitement de la led (en particulier le clignotement) doit être fait tout le temps.

Il faut que tu découpes ton programme en deux parties

  • traitement du bouton et détermination de l’état de la led
  • gestion de l’état de la led.

Par exemple comme ceci

const int LED = 13;
const int BP  =  2;

enum {ETEINT, ALLUME, CLIGNOTANT} etat_LED = ETEINT;
const long interval_clignot = 500;

void setup ()
{
  pinMode(LED , OUTPUT);
  pinMode(BP , INPUT_PULLUP);
}
void loop ()
{
  static int etat_BP_Prec=HIGH;
  static unsigned long millisDebutClig=0;
  static unsigned long millisLastClig=0;
  int etat_BP = digitalRead (BP);

  if (etat_BP!=etat_BP_Prec)
  {
    etat_BP_Prec=etat_BP;
    delay(20);  // anti rebond
    if (etat_BP==LOW)
    {
      // on vient d'appuyer sur le bouton
      switch (etat_LED)
      {
        case ETEINT:
          etat_LED=CLIGNOTANT;
          millisDebutClig=millis();
          break;

        case ALLUME:
        case CLIGNOTANT:
          etat_LED=ETEINT;
          break;
      }
    }
  }

  switch (etat_LED)
  {
    case ALLUME:
      digitalWrite(LED,HIGH);
      break;
    case ETEINT:
      digitalWrite(LED,LOW);
      break;
    case CLIGNOTANT:
      if (millis()-millisDebutClig<10000)
      {
        if (millis()-millisLastClig>=interval_clignot)
        {
          digitalWrite(LED,!digitalRead(LED));
          millisLastClig=millis();
        }
      }
      else
      {
        etat_LED=ALLUME;
      }
      break;
  }
}

Bonsoir ,

Merci Beaucoup pour votre réponse .

ça fonctionne parfaitement ,comme je le souhaitais .

J'ai commencé l'arduino il y a peu de temps mais je pense

que même dans 5 ans je serais incapable de faire un code aussi

technique .

Dans la vie il y a ceux qui cherchent des jours et des jours pour trouver un code,

et des personnes qui ont le savoir et qui font des codes complexes en quelques

minutes.

bon moi je cherche souvent des jours et des jours, je me crispe sur la souris

et je transpire beaucoup pour voir si mon code va compiler, et si ça compile

je suis content, mais pas longtemps car ça fonctionne rarement comme je le

veux.

Vous avez du mettre moins de temps à concevoir ce code que moi à le taper

dans le croquis.

maintenant il faut que je le comprenne pour moi pour évoluer c'est important.

ENCORE MERCI et bonne soirée.

On a tous commencé un jour (moi ça commence à faire un moment que j'ai commencé) :)