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
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...
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)
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)
{
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
{
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:
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
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
}
}
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
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
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
}
}