Arduino - bouton poussoir + délais

Bonjour,

J'aimerai faire un programme qui allume une led avec un bouton poussoir (4 broches) puis l'éteint au bout de X seconde sans avoir a réappuyer sur le bouton poussoir. Et à la prochaine pression du bouton, le cycle recommence.

J'ai ça pour l'instant : le bouton allume et éteint à chaque pression

boolean buttonWasUp = true;
boolean ledEnabled = false;

void setup() {
  pinMode(10, OUTPUT);
  pinMode(2, INPUT_PULLUP);
}
 
void loop() {
   boolean buttonIsUp = digitalRead(2);
   if (buttonWasUp && !buttonIsUp) {
      delay(10);
    buttonIsUp = digitalRead(2);
      if (!buttonIsUp) {
         ledEnabled = !ledEnabled;
         digitalWrite(10, ledEnabled);
         
      }
   }
   buttonWasUp = buttonIsUp;
}

Je ne vois pas ou mettre le delay (X) ?

Par avance merci.

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Il faut avant que l'on puisse te répondre que tu regardes le post des bonnes pratiques
Notemment la section concernant la présentation du code entre balise dédiées()

Il n'y a pas besoin de créer les booleans ledEnabled et buttonWasUp.
Tu peux simplement, à l'appui du bouton, allumer la LED, attendre 10 secondes puis rééteindre la LED lorsque le bouton est appuyé.
Ca pourrait donné un code comme :

void setup() {
  pinMode(10, OUTPUT);
  pinMode(2, INPUT_PULLUP);
}
void loop() {
  if (digitalRead(2)) {
    digitalWrite(10, true);
    delay(10000);
    digitalWrite(10, false);
}

Normalement ça marche mais je ne l'ai pas testé donc à voir. delay() arrête totalement le code avant que le temps ne soit écoulé donc pas besoin de vérifier si elle était déjà allumée.

Meri pour la réponse. le programme que vous me proposer allume la led puis lorsque je je presse le bouton (quelques secondes) la led s'eteint mais se rallume lorsque je relache le bouton..

En fait, je souhaite allumer la Led pendant X seconde en appuyant sur le bouton poussoir et qu'elle s'éteigne avant de recommencer le cycle...

Merci beaucoup du temps que vous prenez pour mon petit projet

Vous voulez dire que le temps d'appui sur le bouton doit définir la durée de la LED allumée?

Non un seul appui (bref) allume la led qui s'éteindra automatiquement après x seconde .. C'est en gros une simple veilleuse pour enfant qui s'éteint toute seule..

Dans ce cas c'est normal si à la fin du "cycle" le bouton est appuyé, la lampe se rallume je ne vois pas le problème.

Peut tu prendre toi aussi un peu de ton temps, pour modifier ton premier post?
Celui-ci ne respectant pas les régles de la partie francaise et surtout est illisible pour certains participants :frowning:

Edit: @jc_73100 :+1:

Tout d'abord, il y a 2 inconnues sur le BP, comment est-il branché?
Est-ce 1 BP Normalement Ouvert ou Normalement Fermé?

Cela joue sur le code car cela influence son état de repos (lorsqu'il est inactif) qui sera false dans un cas, et true dans l'autre.

Ensuite, les BP ont des rebonds pendant disons au maxi 100ms, si la boucle est rapide, elle peut même si vous n'appuyez plus sur le BP, lire différents états (pendant 100ms) dû aux rebonds.

Personnellement, je ne comprends pas tout algorithme.

Tu change d'état de la led à chaque fois que le BP est relaché pour un NO, ou appuyé pour un NC, c'est cela?

Mais ce n'est pas cela que tu recherche.

Selon moi:

Tu dois allumer la led à chaque fois que le BP est appuyé (buttonIsUp) si à la boucle d'avant il ne l'était pas (!buttonWasUp).

Comme cela, même si tu reste appuyé 10h sur le BP, il faut une tempo de 10s seulment.

Si elle était déja allumée, c'est pas grave, la re allumer est sans incidence.

Par contre:
Et à chaque fois que tu allume la Led, tu dois relancer une tempo de 10s (10 000ms).

Comme cela, mêle si tu appuie sur le BP avant la fin de la tempo, elle se ré initialise.

Ça c'est selon moi, et comme je suis là pour t'aider, je te laisse vérifier la proposition et faire le code qui irait avec.

Bonjour gamerdev

Vu que pinMode(2, INPUT_PULLUP);
il faut faire if (digitalRead(2) == LOW)

Au repos, la pin 2 est UP.

Cordialement
jpbbricole

D'où ma question (que vous n'avez pas lu probablement):

Bonjour jef59

Oui, je l'ai lue mais trouvée inutile puisque tout est dans le premier post, j'ai l'impression que tu na l'a pas lu.

Le bouton fonctionne vu que:

Il est initialisé par:
pinMode(2, INPUT_PULLUP); donc câblé d'un côté à GND.
et lu

   boolean buttonIsUp = digitalRead(2);
   if (buttonWasUp && !buttonIsUp) {

C'est un peu "alambiqué" mais ça fonctionne.
donc c'est un bouton NO.

Cordialement
jpbbricole

1 BP NO avec 1 input_pullup, ça donne 1 entrée à 0 quand vous appuyez.

1 BP NC avec 1 input_pulluo, ça donne 1 entrée à 0 quand vous n'appuyez pas.

Mais pour info, l'Arduino ne voit pas si vous appuyez ou non sur le bouton.

Tout ce qu'il voit, c'est l'état de son entrée.

Dans le cas A:
quand tu appuie, ça s'allume, et susnd tu ré appuie, ça s'éteind.

Dans le cas B:
Quand tu relâche, ça s'allume, et quand tu re appuie et relâche, ça s'éteind.

Si tu va "vite", tu appuie et 1/10 de seconde et tu relâche, tu ne vois pas la différence entre le cas A et le cas B.

1 Like

Bonjour jef59

Oui, tu répètes ce que j'ai dit plus haut

qui a provoqué ceci:

Tu tournes en rond!

Cordialement
jpbbricole

Non je ne tourne pas en rond, juste que je tourne rond.

"Au repos, la pin 2 est UP." est le juste inverse de "1 BP NC avec 1 input_pulluo, ça donne 1 entrée à 0 quand vous n'appuyez pas."

j'ai écris ceci qui marche aussi bien avec 1 BP NO que 1 BP NC et qui quand ou appuie et relache le BP (NO ou NC) démarre une minuterie qui peut en cours de route être réinitialiser.

Par exemple:
J'appuie relache
la minuterie démarre pour 10s
la led s'allume
au bout de 5s j’appuie relâche, la minuterie repart pour 10s
la led reste allumée
je ne touche plus au BP
au bout de 10s la led s'éteint

boolean buttonIsUp = false;// mettre "false" si BP NC, mettre "true" si BP NO
boolean buttonWasUp = false;// mettre "false" si BP NC, mettre "true" si BP NO
boolean ledEnabled = false;

int timeIs = 0;
int timeWas = 0;
int tempo = 10000;

void setup() {
  //Serial.begin(9600);
  
  pinMode(13, OUTPUT);// Led verte sur la carte Arduino
  pinMode(2, INPUT_PULLUP);// BP NO ou NC, selon le cas corriger ligne 1 et 2
}
 
void loop() {
  digitalWrite(13, ledEnabled);
  boolean buttonIsUp = digitalRead(2);

  /*Serial.print("buttonIsUp = ");
  Serial.println(buttonIsUp);
  Serial.print("buttonWasUp = ");
  Serial.println(buttonWasUp);*/
  
  if (buttonWasUp != buttonIsUp) {
     //delay(10);
     if (!buttonIsUp){
       timeWas = millis();
       ledEnabled = true;
       buttonWasUp = buttonIsUp;
     }
     else{
      buttonWasUp = buttonIsUp;
     }
    }
    
    timeIs = millis();
    
    if (timeIs-timeWas>=tempo) {
      ledEnabled = false;
    }
}

@jpbbricole

Ce que tu n'a pas compris dans mon propos, c'est que pour que "buttonWasUp && !buttonIsUp" soit "true", il faut que
"buttonWasUp" soit "true"
et
"buttonIsUp" soit "false"

ors
avec un BP NO appuyé c'est "false"
avec un BP NC non appuyé c'est "false" aussi

Quand à l'Arduino, il n'a pas le don de deviner si le BP est NO ou NC ni s'il est appuyé ou pas, tout ce qu'il voit, c'est si c'est "false" ou "true".

et si on fait, comme sur un bouton de minuterie d'escalier, l'action d'appuyer/relacher sur le BP, le resultat au final est le même, on déclenche une minuterie quelque soit le BP (NO ou NC).

A condition, comme dans mon code, de modifier les conditions initiales.

Et au final, ça tourne rond très bien.

Merci à tous, tant sur la réactivité que par la qualité des échanges.. le programme (de Jef59) fonctionne parfaitement. Je n'ai pas de doute sur les autres propositions..
Et en plus j'ai appris pas mal de chose sur les BP

Hello,

Pour écrire ce bout de code, j'ai utilisé les conseils quu m'avait été donnés pour éviter les "délays" qui bloquent les boucles le temps qu'ils se fassent.

Donc ce forum est aussi une boucle sans fin du genre "passe à ton voisin un bout du savoir que tu as toi même reçus d'un autre...".

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