probleme de bouton poussoir

Bonjour,
je voudrais rendre mon bouton monostable , mais je n'ai trouvé qu'une parti du code

void setup()
{
  pinMode(11, OUTPUT);
  pinMode(2, INPUT_PULLUP);  
  
  digitalWrite(11, LOW);
}

void loop()
{
  if(digitalRead(2) == LOW)
  {
   digitalWrite(11, HIGH);
  }
}

Si quelqu'un pourrait me le compléter
merci

hello
si c'est pour commander une sortie

#define BP  2
#define LED  11
void setup() {
  pinMode(11, OUTPUT);
  pinMode(2, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(BP) == LOW)
  {
    digitalWrite(LED, !digitalRead(LED));
  }
}

Si je comprends bien, tu as un BP sur le GPIO 2 en INPUT_PULLUP et une led sur le GPIO 11.
Tu veux qu'un appui sur le bouton change l'état de la led : correct ?

Le plus simple est d'utiliser une variable booléenne qui stocke l'état de la led. Appelons-la etatLed : tu la déclares dans l'en-tête (avant le setup) en variable globale.

bool etatLed = false;

Dans ta loop, lorsque tu détectes un appui sur le bouton, tu changes la valeur de cette variable

etatLed = !etatLed;

et tu l'affectes au GPIO

digitalWrite (11, etatLed);
delay(30);

Le delay sert à effacer les rebonds.

Argh ! grillé par dfgh...

lesept:
Si je comprends bien, tu as un BP sur le GPIO 2 en INPUT_PULLUP et une led sur le GPIO 11.
Tu veux qu'un appui sur le bouton change l'état de la led : correct ?

Le plus simple est d'utiliser une variable booléenne qui stocke l'état de la led. Appelons-la etatLed : tu la déclares dans l'en-tête (avant le setup) en variable globale.

bool etatLed = false;

Dans ta loop, lorsque tu détectes un appui sur le bouton, tu changes la valeur de cette variable

etatLed = !etatLed;

et tu l'affectes au GPIO

digitalWrite (11, etatLed);

delay(30);



Le delay sert à effacer les rebonds.

Argh ! grillé par dfgh...

d'accord merci .

dfgh:
hello
si c'est pour commander une sortie

#define BP  2

#define LED  11
void setup() {
 pinMode(11, OUTPUT);
 pinMode(2, INPUT_PULLUP);
}

void loop()
{
 if (digitalRead(BP) == LOW)
 {
   digitalWrite(LED, !digitalRead(LED));
 }
}

Bonjour c'est bon ça marche mais est-ce normal que la led s'allume et s'éteint en deux temps ?

Ajoute mon

delay(30);

après le digitalWrite, pour ne pas prendre les rebonds du BP.


Que veut dire "en deux temps" ? La led doit changer d'état à chaque appui sur le BP.

dfgh:
hello
si c'est pour commander une sortie

#define BP  2

#define LED  11
void setup() {
 pinMode(11, OUTPUT);
 pinMode(2, INPUT_PULLUP);
}

void loop()
{
 if (digitalRead(BP) == LOW)
 {
   digitalWrite(LED, !digitalRead(LED));
 }
}

Avec ce code vous allez clignoter super vite tant que le bouton est tenu appuyé ...et vous avez une chance sur deux de sortir avec l'état réellement inversé...

il faut n"inverser qu'une seule fois lors de la détection d'appui et ensuite attendre le relâchement sans rien faire - en faisant attention aux rebonds bien sûr.

un delay() juste après avoir basculé est l'anti-rebond du pauvre (et marche très bien)


deux solutions:

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

sinon pour simplifier votre gestion des boutons, éventuellement utilisez la librairie de @bricoleau ou alors la librairie OneButton de Matthias Hertel.

Ca donnerait ça ?

  if (digitalRead(BP) == LOW) // appui détecté !
  {
   digitalWrite(LED, !digitalRead(LED));  // On change l'état de la led 
   delay(30);  // On attend la fin des rebonds 
   while (digitalRead(BP) == LOW);  // On attend le relâchement du BP
  // Peut-être encore un petit delay ici s'il y a des rebonds au relâchement aussi ... ?
  }

J-M-L:
Avec ce code vous allez clignoter super vite tant que le bouton est tenu appuyé ...et vous avez une chance sur deux de sortir avec l'état réellement inversé...

il faut n"inverser qu'une seule fois lors de la détection d'appui et ensuite attendre le relâchement sans rien faire - en faisant attention aux rebonds bien sûr.

un delay() juste après avoir basculé est l'anti-rebond du pauvre (et marche très bien)


deux solutions:

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

sinon pour simplifier votre gestion des boutons, éventuellement utilisez la librairie de @bricoleau ou alors la librairie OneButton de Matthias Hertel.

oui mais je crois que le problème c'est que du courant parasite passe dans le circuit . Donc il faudrait rajouter une resistance je pense

lesept:
Ca donnerait ça ?

  if (digitalRead(BP) == LOW) // appui détecté !

{
  digitalWrite(LED, !digitalRead(LED));  // On change l'état de la led
  delay(30);  // On attend la fin des rebonds
  while (digitalRead(BP) == LOW);  // On attend le relâchement du BP
  // Peut-être encore un petit delay ici s'il y a des rebonds au relâchement aussi ... ?
  }

Oui avec le petit délai à la fin, mais ça veut dire maintenant que le code est bloqué tant qu'on n'a pas relâché.

dragonard:
oui mais je crois que le problème c'est que du courant parasite passe dans le circuit . Donc il faudrait rajouter une resistance je pense

désolé mais rien compris... A quoi faites vous référence ? :o :o

lesept:
Ca donnerait ça ?

  if (digitalRead(BP) == LOW) // appui détecté !

{
  digitalWrite(LED, !digitalRead(LED));  // On change l'état de la led
  delay(30);  // On attend la fin des rebonds
  while (digitalRead(BP) == LOW);  // On attend le relâchement du BP
 // Peut-être encore un petit delay ici s'il y a des rebonds au relâchement aussi ... ?
 }

c'est bon merci ça marche

J-M-L:
Oui avec le petit délai à la fin, mais ça veut dire maintenant que le code est bloqué tant qu'on n'a pas relâché.

désolé mais rien compris... A quoi faites vous référence ? :o :o

non en fait rien j'ai fini mon code
ça donne ça

#define BP  2
#define LED  11
void setup() {
  pinMode(11, OUTPUT);
  pinMode(2, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(BP) == LOW)
  {
   delay(30);  // On attend la fin des rebonds (tester avec 20 voire 15 si pas assez réactif)
   while (digitalRead(BP) == LOW);  // On attend le relâchement du BP
   digitalWrite(LED, !digitalRead(LED));  // On change l'état de la led
  // Peut-être encore un petit delay ici s'il y a des rebonds au relâchement aussi ... ?
  }
}

"VOTRE" code ressemble beaucoup au travail de @lesept :slight_smile:

tel que rédigé la LED s'inverse que quand vous relâchez le bouton. Si vous inversez les lignes de code, ce sera instantané lors de l'appui

#define BP  2
#define LED  11
void setup() {
  pinMode(LED, OUTPUT);
  pinMode(BP, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(BP) == LOW)
  {
   digitalWrite(LED, !digitalRead(LED));  // On change l'état de la led
   delay(30);  // On attend la fin des rebond
   while (digitalRead(BP) == LOW);  // On attend le relâchement du BP
   delay(30);  // On attend la fin des rebonds
  }
}

J-M-L:
"VOTRE" code ressemble beaucoup au travail de @lesept :slight_smile:

tel que rédigé la LED s'inverse que quand vous relâchez le bouton. Si vous inversez les lignes de code, ce sera instantané lors de l'appui

#define BP  2

#define LED  11
void setup() {
  pinMode(LED, OUTPUT);
  pinMode(BP, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(BP) == LOW)
  {
  digitalWrite(LED, !digitalRead(LED));  // On change l'état de la led
  delay(30);  // On attend la fin des rebond
  while (digitalRead(BP) == LOW);  // On attend le relâchement du BP
  delay(30);  // On attend la fin des rebonds
  }
}

J-M-L:
"VOTRE" code ressemble beaucoup au travail de @lesept :slight_smile:

tel que rédigé la LED s'inverse que quand vous relâchez le bouton. Si vous inversez les lignes de code, ce sera instantané lors de l'appui

#define BP  2

#define LED  11
void setup() {
  pinMode(LED, OUTPUT);
  pinMode(BP, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(BP) == LOW)
  {
  digitalWrite(LED, !digitalRead(LED));  // On change l'état de la led
  delay(30);  // On attend la fin des rebond
  while (digitalRead(BP) == LOW);  // On attend le relâchement du BP
  delay(30);  // On attend la fin des rebonds
  }
}

ok merci
et oui j'ai piqué le code de @lesept

C'est fait pour, l'important c'est que tu le comprennes pour pouvoir le faire seul ensuite...

lesept:
C'est fait pour, l'important c'est que tu le comprennes pour pouvoir le faire seul ensuite...

Oui je vais le regarder plus en détail pour le mieux comprendre

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