Allumer/éteindre un led avec un unique bouton

Salut tout le monde, je m'appelle Samuel et j'ai 16 ans. J'ai débuté dans Arduino il y a quelques mois, et je bloque totalement sur un montage pourtant très facile à mon avis. :sweat_smile: Je voudrais , qu'en appuyant et relâchant un bouton, une led s'allume et reste allumée. Avec un second appui relâchement du bouton, la led s'éteint. Je n'arrive pas à trouver la condition à mettre dans la fonction "if" et j'ai testé et cherché longtemps avant d'arriver à la solution de secours que vous êtes. C'est pour simuler l'éclairage d'une maison miniature au fait. J'espère que vos connaissances pourront m'aider, Merci d'avance :D Samuel

bonjour, pourquoi s'emmerd... avec tout ca? boolean existe pour ce genre de solution

int LEDpin = 5;       
int switchPin = 13;  
boolean running = false;

void setup()
{
  pinMode(LEDpin, OUTPUT);
  pinMode(switchPin, INPUT);
  digitalWrite(switchPin, HIGH);     
}

void loop()
{
  if (digitalRead(switchPin) == LOW){
    delay(100);                       
    running = !running;                
    digitalWrite(LEDpin, running);      
  }
}

;)

Une bonne réponse est effectivement avec une machine à état (ou en hardware de prendre un vrai interrupteur et pas un bouton momentané)

pepe: ... peut-être parce qu'en faisant trop simple, la led ne fait que clignoter à haute fréquence tant qu'on laisse le bouton appuyé, et reste dans un état indéterminé quand on relâche le bouton. :P

effectivement, dans ce cas, un while juste après le if permet d'éliminer ce phénomène, pas vérifié, mais ca devrait le faire.

int LEDpin = 5;      
int switchPin = 13;  
boolean running = false;

void setup()
{
  pinMode(LEDpin, OUTPUT);
  pinMode(switchPin, INPUT_PULLUP);
  digitalWrite(switchPin, HIGH);    
}

void loop()
{
  if (digitalRead(switchPin) == LOW){
    delay(100);  
while(  digitalRead(switchPin) == LOW){digitalWrite(LEDpin, running);} // 1ere variante
//while(  digitalRead(switchPin) == LOW){} // 2eme variante                 
    running = !running;                
    digitalWrite(LEDpin, running);      
  }
}

Quelques commentaires qui se veulent constructifs:

Oui c'est mieux :) et revient à simplifier un peu la machine état avec attente active (on ne gère rien d'autre avec cette approche) en ajoutant une mémoire bascule au lieu d'états

Pour la lisibilité et cohérence des types il faudrait changer digitalWrite(LEDpin, running); en

digitalWrite(LEDpin, running ? HIGH : LOW);

votre seconde variante attend le relâchement du bouton pour l'action - On pourrait aussi n'avoir qu'un digitalWrite après le delay de debounce (15 ou 20 devraient suffire) et un while d'attente active de relâchement qui tourne à vide ensuite.

Enfin pour la lisibilité c'est mieux maintenant d'utiliser INPUT_PULLUP que de mettre la sortie en output puis HIGH

(Sinon Bizarre de metttre Le switch sur la Pin de la LED Intégrée à la carte :) )

(Sinon Bizarre de metttre Le switch sur la Pin de la LED Intégrée à la carte :) )

oui, vite fait hier soir en intervertissant les pins, mais bon, le principe est là.

digitalWrite(LEDpin, running ? HIGH : LOW);

pour une personne avertie, il vaut mieux utiliser cette solution, mais comme notre demandeur indique qu'il a débuté il y a quelques mois, autant simplifier le code avant de rentrer dans des détails d'un autre niveau. Et cela fait moins de touches a taper sur le clavier pour coder :)

Après, chacun sa facon de coder et pour un même code, il y aura autant de différences que de codeurs.

Après, chacun sa facon de coder et pour un même code, il y aura autant de différences que de codeurs.

bien sûr - mais je pense que pour des débutants justement c'est important de leur apprendre à respecter les types de données à la fois conceptuellement et en réalité.

Effectivement le cast automatique du C/C++ et l'équivalence de valeur des constantes fait que true == HIGH et false == LOW mais pour moi (même si ça m'arrive par flemme :) ) ce n'est pas une bonne pratique et le jour où ils passeront à un langage plus fortement typé ou simplement des règles de compilations plus strictes, leur code sera plein de warning ou ne compilera pas du tout... donc autant prendre de bonnes habitudes tôt :)

Tiens j'ajoute mon grain de sel avec un code en deux lignes d'instructions :smiling_imp:

#include "simpleBouton.h"
#include "simpleLed.h"

simpleBouton bouton(8);
simpleLed led(13);

void setup(){}
void loop() {
  bouton.actualiser();
  if (bouton.vientDEtreEnfonce()) led.basculer();
}

bricoleau: Tiens j'ajoute mon grain de sel avec un code en deux lignes d'instructions :smiling_imp:

et en 2 librairies de plus :)

bien sûr - mais je pense que pour des débutants justement c'est important de leur apprendre à respecter les types de données à la fois conceptuellement et en réalité.

Effectivement le cast automatique du C/C++ et l'équivalence de valeur des constantes fait que true == HIGH et false == LOW mais pour moi (même si ça m'arrive par flemme :) ) ce n'est pas une bonne pratique et le jour où ils passeront à un langage plus fortement typé ou simplement des règles de compilations plus strictes, leur code sera plein de warning ou ne compilera pas du tout... donc autant prendre de bonnes habitudes tôt :)

tout a fait, pour le conceptuel, mais pour un code aussi simple, je pars du principe qu'il n'y a pas besoin de se prendre la tête. surement la flemme aussi de faire plus compliqué un dimanche soir.

Le jour, où ils coderont pour un projet plus complexe, on peut passer à plus compliquer et dans une bonne syntaxe. Mais lorsque l'on apprend a lire, on commence par des histoires pour enfant, pas par de la métaphysique, du Balzac ou du Freud. C'est déjà aussi compliqué comme ca pour en rajouter encore. ceci n'est que mon avis personnel et n"engage que moi.

la preuve, un troisième larron vient se greffer et une autre manière de coder, avec des lib, mais c'est un autre code, cela confirme bien ce que je disais plus haut :)

Bonjour à tous Je cherche un programme pour deux LED et un bouton quand j'appuie et je reste appuyé sur le bouton une LED s'allume puis s'éteint après une seconde et quand je relâche lebouton l'autre LED s'allume et s'éteint après une seconde Merci d'avance

Proposez un code - et on vous aide

Bonjour

Crées ton propre sujet au lieu d'exhumer un vieux sujet qui n'a pas grand chose à voir.

Salut infobarquee. Pourrait tu expliquer ton code(celui là ⬇️) avec beaucoup de détails pour comprendre et refaire sans copier-coller, modifier en faire une autre utilisation etc ?

int LEDpin = 5;     
int switchPin = 13; 
boolean running = false;

void setup()
{
  pinMode(LEDpin, OUTPUT);
  pinMode(switchPin, INPUT_PULLUP);
   
}

void loop()
{
  if (digitalRead(switchPin) == LOW){
    delay(100); 
while(  digitalRead(switchPin) == LOW){digitalWrite(LEDpin, running);} // 1ere variante
//while(  digitalRead(switchPin) == LOW){} // 2eme variante                 
    running = !running;               
    digitalWrite(LEDpin, running);     
  }
}