Bonjour à tous
Je cherche à allumer deux leds avec un seul bouton, jusque-là rien de bien compliqué, là où ça se complique c’est que je souhaite que la led 1 s’allume tant que l’appuis sur le bouton est fait, et que la une et la deux s’allume si un double appuis (avec maintien de l’appuis ) se fait en moins de 2 secondes.
Quelqu’un aurait une idée a me proposer
Pour le moment je sèche
j'ai reussi a faire allumer une puis les deux mais sans condision de temps entre les deux appuis et ça ne fonctionne qu'une fois après faut couper et redemarrer la carte
voila le code que j'utilise pour le moment
const int buttonPin = 2;
const int ledPin1 = 12;
const int ledPin2 = 11;
int buttonPushCounter = 0;
int buttonState = 0;
int lastButtonState = 0;
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
Serial.begin(9600);
}
void loop()
{
buttonState = digitalRead(buttonPin);
if (buttonState != lastButtonState)
{
if (buttonState == HIGH)
{
buttonPushCounter++;
Serial.println("APPUI");
Serial.print("nombre d'appuis: ");
Serial.println(buttonPushCounter, DEC); // affiche la valeur au format décimal
}
else
{
Serial.println("PAS D'APPUI");
}
lastButtonState = buttonState;
if(buttonPushCounter == 1 && buttonState == HIGH)
{
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin2, LOW);
if (buttonPushCounter == 2 && buttonState == HIGH)
{
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
}
else
{
digitalWrite(ledPin1, LOW);
}
}
}
}
Je pense qu'il faut que tu remette ton compteur d'appui à 0 au bout de 2 secondes en utilisant la fonction millis()
Ce qui donne quelque chose comme ça:
const int buttonPin = 2;
const int ledPin1 = 12;
const int ledPin2 = 11;
int buttonPushCounter = 0;
int buttonState = 0;
int lastButtonState = 0;
unsigned long tempsAppui=0;
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
Serial.begin(9600);
}
void loop()
{
buttonState = digitalRead(buttonPin);
if (buttonState != lastButtonState)
{
if (buttonState == HIGH)
{
buttonPushCounter++;
tempsAppui=millis();
Serial.println("APPUI");
Serial.print("nombre d'appuis: ");
Serial.println(buttonPushCounter, DEC); // affiche la valeur au format décimal
}
else
{
Serial.println("PAS D'APPUI");
}
lastButtonState = buttonState;
if (buttonPushCounter == 1 && buttonState == HIGH)
{
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin2, LOW);
if (buttonPushCounter == 2 && buttonState == HIGH)
{
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
}
else
{
digitalWrite(ledPin1, LOW);
}
}
}
if (millis()-tempsAppui>2000)
buttonPushCounter=0;
}
Après avoir relu ton programme, je pense qu'il y a des aussi erreurs de logique:
le if (buttonPushCounter == 2 ... est à l'intérieur du if (buttonPushCounter == 1 ... donc il n'est jamais exécuté.
A mon avis tu ne dois pas entrer souvent dans le second if....
"je souhaite que la led 1 s'allume tant que l'appuis sur le bouton est fait, et que la une et la deux s'allume si un double appuis (avec maintien de l'appuis ) se fait en moins de 2 secondes."
Un peu bizarre ce code, surtout avec un gros delay(500) à chaque relâchement du bouton.
Du coup si le double clic est trop rapide ton programme ne le voit pas.
autres effets de bord si le bouton est maintenu enfoncé pendant plus d'une seconde.
Le résultat ne ressemble pas trop à ta description initiale.
M'enfin, si ça fait ce que tu veux...
Y a au moins le test "buttonPushCounter >= 0" qui ne sert à rien car toujours vrai.