Un appuie sur un bouton momentané laisse la led allumé jusqu'a un autre appuie

Bonjour, je suis débutant sur arduino et j'ai un problème que j'imagine simple à résoudre mais je bloque.

Je veux simplement q'un appuie sur un inter momentané allume une led , qui reste allumé jusqu’à un autre appuie du même inter.
J'ai pensé à la fonction while mais soit c'est pas adapté soit je l'utilise mal.

Pour info , j'ai pour projet de faire un panel de contrôle pour des simus spatiale ( Star citizen principalement), et ça me servira à connaitre l'état de la commande lié au bouton sans la nécessité d'avoir des inters à bascule ou qui se bloque.

Bonsoir,
Il suffit de stocker l'état dans un boolean et de l'inverser à chaque appuie

Merci ^^
C'est exactement ça en bidouillant un poils car avec le code il fallait appuyer plusieurs fois.

En fait l'exemple n'est pas très clair. Je pensais à quelque chose de plus simple :

boolean mem = 0;

void loop() {
   buttonState = digitalRead(buttonPin);
   if (buttonState ==1) digitalWrite(ledPin, mem);
    mem = !mem;
  }

Ah oui, ça à l'air plus simple.

Cette ligne signifie quoi ?

mem = !mem;

Merci

Bonjour,

jesfr:
Cette ligne signifie quoi ?
mem = !mem;

Si mem = 0 alors mem = 1
si mem = 1 alors mem = 0
Simplement l'inversion de l'état du boolean

achess:
En fait l'exemple n'est pas très clair. Je pensais à quelque chose de plus simple :

Marchera pas. Tu as oublié les accolades.
digitalRead(buttonPin) passe à 0 quand tu appuies sur le bouton
Ensuite tu dois attendre que le bouton soit relâché avant de revenir dans la boucle loop.

boolean mem = 0;

void loop() {
   buttonState = digitalRead(buttonPin);
   if (buttonState ==0) {// bouton appuié
      digitalWrite(ledPin, mem);
      mem = !mem;
      while (!digitalRead(buttonPin); // attendre que le bouton soit relaché
   }
}

Je pense que achess le savait, mais c'est simplement un oublie.
De plus ta dernière ligne avec le while ne sert a rien !

Bonjour,

Bien vu, fredericzim :slight_smile:

while consomme des cycles d'horloge qui pourraient être utilisés à d'autre tâches. Il vaut mieux se servir de variables boolean pour mémoriser les états.

Ce coups-ci, j'ai essayé ce code anti-rebond basé sur l'exemple "Debounce":

/* appuie bouton validé qu'après un délai antirebond */
// set pin numbers:
const int buttonPin = 2;    // the number of the pushbutton pin
const int ledPin = 13;      // the number of the LED pin

// Variables will change:
boolean etatLed = 0;        // the current state of the output pin
boolean etatBouton;         // état validé après anti-rebond
boolean DernierEtatBouton;  // état au dernier cycle d'horloge  
long tempo;  // temps depuis le dernier appuie
long delaiAntiRebond = 50;  // the debounce time;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, etatLed);
}

void loop() {
  int lecture = digitalRead(buttonPin);
 // tempo est réinitialisé à chaque changement d'état du bouton
 if (lecture != DernierEtatBouton) tempo = millis();
 
  // On ne traite l'info que si elle a duré l'anti rebond
  if ((millis() - tempo) > delaiAntiRebond) {
     if (lecture != etatBouton) {
      etatBouton = lecture;
      if (etatBouton == 0) {
        etatLed = !etatLed;
      }
    }
  }

  // set the LED:
  digitalWrite(ledPin, etatLed);
  DernierEtatBouton = lecture;
}