Deux actions avec un seul bouton

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);   
      }

    }
  }
}

Merci d’avance

Bonjour,

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

Merci je teste et je revien dire quoi!!

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

    if (buttonPushCounter == 1 && buttonState == HIGH)
    {
      digitalWrite(ledPin2, HIGH);
      digitalWrite(ledPin2, LOW);

      if (buttonPushCounter == 2 && buttonState == HIGH)

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."

Pas assez précis.
La led2, elle s'éteint quand ?

Merci pour les reponses

après plusieur essais j'ai reussi a faire ce que je voulai avec ce code :

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);
      }
    if (buttonPushCounter == 2 && buttonState == HIGH)
      {
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      }
    if(buttonPushCounter >= 0 && buttonState == LOW)
      {
       digitalWrite(ledPin1, LOW);
       delay (500);
       digitalWrite(ledPin2, LOW);
      }
    
  }
  if (millis()-tempsAppui>1000)
    buttonPushCounter=0;
}

petite question comment on fait pour recevoir un mail pour le suivie du sujet?

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.

Merci pour les réponses

Alors oui c'est vrai ça ne correspond pas exactement à ce que j'avais demandé à la base mais mon besoin a légèrement évolué.

pour le test "buttonPushCounter >= 0" effectivement il ne sert a rien je l’ai enlevé

Bonjour,

melarc:
petite question comment on fait pour recevoir un mail pour le suivie du sujet?

Jamais fonctionné pour moi.
J'ai posé la question dans le bar mail , notifications et MP - #5 by achess - Le bar - Arduino Forum

Pas de réponse pour l'instant