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.
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é
}
}
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;
}