On/off avec un bouton poussoir

a marqué ce sujet comme résolu.

Bonsoir, j'aimerais savoir comment coder une fonction on/off avec un bouton poussoir sous arduino, j'ai essayé par moi même et j'ai franchement pas réussi, et j'ai cherché sur internet et j'ai trouvé mais j'ai pas vraiment compris o_O

Si un âme charitable pouvait me venir en aide :lol: Merci d'avance

PS: Est-ce quelqu'un aurait une idée de comment relier les entrée/sortie et "default" sous proteus ?

+0 -0

Salut, je te conseilles de chercher avec le terme "front montant". Tu pourrait par exemple inverser une variable booléenne à chaque fois que l'entrée du bouton s'active. ;)

+1 -0
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const byte led = 3;
const byte btn = 2;
boolean etatLed = 0;
byte etatBtn;

void setup()
{
  pinMode(led, OUTPUT);
  pinMode(btn, INPUT);
}

void loop()
{
  etatBtn = digitalRead(btn);
  if (etatBtn == LOW)
  {
    etatLed = 1;
  }
  else
  {
    etatLed = 0;
  }
  while (etatLed == 1)
  {
    digitalWrite(led, HIGH);
  }

}

je pense que le souci se trouve au niveau du else mais après.

@rezemika: je vais voir ça :)

Ton etatLed n'est pas mis a jour dans ta boucle, donc une fois que la boucle démarre, elle ne s'arrète jamais (donc impossible d'éteindre la led).

+3 -0

À priori tu n'as pas besoin de faire un while puisque loop(){} est déjà une boucle.

Il faut aussi que tu ajoute un délai de genre 200ms (ou jouer avec les timers) à chaque appui sur le bouton pour faire un anti-rebond si tu n'as pas prévu d'anti-rebond niveau hardware.

+2 -0

Ton etatLed n'est pas mis a jour dans ta boucle, donc une fois que la boucle démarre, elle ne s'arrète jamais (donc impossible d'éteindre la led).

mrBen

Il faut que je fasse un test dans la boucle pour voir si le bouton ne change pas d'état ?

À priori tu n'as pas besoin de faire un while puisque loop(){} est déjà une boucle.

Il faut aussi que tu ajoute un délai de genre 200ms (ou jouer avec les timers) à chaque appui sur le bouton pour faire un anti-rebond si tu n'as pas prévu d'anti-rebond niveau hardware.

Roipoussiere

Mais ducoup la led reste allumé non ?

Mais ducoup la led reste allumé non ?

Non.

Dans setup(), tu initialise ta variable etatLed à 0.

Ensuite, dans loop() tu as juste 2 conditions :

  • si etatLed est à 0 et digitalRead(btn) à 1, alors tu allume la led (+ délai anti-rebond) ;
  • si etatLed est à 1 et digitalRead(btn) à 0, alors tu éteint la led (+ délai anti-rebond).
+3 -0

Il faut que je fasse un test dans la boucle pour voir si le bouton ne change pas d'état ?

berger27

Oui, il faut ramener ton test dans ta boucle. Et du coup, ta boucle devient inutile à cause de void loop() { } (cf. Roipoussiere).

En fait, digitalWrite(led, HIGH); allume ta led, mais rien ne l'éteind. Du coup, tu peut simplement remplacer tes affectation de booléen par le changement d'état de ta led.

Et n'oublie pas :

Il faut aussi que tu ajoute un délai de genre 200ms (ou jouer avec les timers) à chaque appui sur le bouton pour faire un anti-rebond si tu n'as pas prévu d'anti-rebond niveau hardware.

Roipoussiere

édit : griller par Roipoussiere (sa solution est plus propre).

+1 -0

Tu peux aussi utiliser un interrupt. Bon, c'est peut-être un peu overkill pour ce que tu veux faire, mais c'est bien de savoir que ça existe.

En gros, tu peux demander à l'Arduino d'appeler une fonction (appelée interrupt) à chaque fois qu'un certain pin change d'état. Dans ton cas, le pin serait celui du bouton, et la fonction inverserait l'état de la LED. Je te laisse te renseigner là-dessus ;)

Salut à tous et désolé du retard de ma réponse.

Tu peux aussi utiliser un interrupt. Bon, c'est peut-être un peu overkill pour ce que tu veux faire, mais c'est bien de savoir que ça existe.

En gros, tu peux demander à l'Arduino d'appeler une fonction (appelée interrupt) à chaque fois qu'un certain pin change d'état. Dans ton cas, le pin serait celui du bouton, et la fonction inverserait l'état de la LED. Je te laisse te renseigner là-dessus ;)

Askannz

J'ai réussi ce que je voulais faire, mais merci de l'info ;)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte