Appui deux fois sur un bouton pour activer

Bonjour,
je suis sur un projet de distributeur de boisson et j'aimerai pouvoir appuyer deux fois sur un bouton poussoir 2 pin pour pouvoir activer le pin 13 de ma carte arduino par exemple es que quelqu'un c'est comment faire si oui merci de bien vouloir me le dire.
Merci
Code:


#include<Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);
void setup(){
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(4,INPUT);
  pinMode(5,INPUT);
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(10,OUTPUT);
  
}

void loop(){
  int a;
  int b;
  int c;
  int d;
  int e;
  
  a = digitalRead(2);
  b = 1;
  c = digitalRead(3);
  d = digitalRead(4);
  d = digitalRead(5);
  
  if(a==b)                                             // bouton #1  
  {
    lcd.init();
  lcd.backlight();
    lcd.setCursor(6,0);
  lcd.print("EAU");
  lcd.setCursor(3,1);
  lcd.print("Grenadine");
    digitalWrite(13,HIGH);
    delay(11000); //Exemple: eau  #1 pin 13
    digitalWrite(13,LOW);
    digitalWrite(12,HIGH);
    delay(0); //Exemple: eau  #1 pin 12
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH);
    delay(0); //Exemple: eau  #1 pin 13
    digitalWrite(11,LOW);
    digitalWrite(10,HIGH);
    delay(0); //Exemple: eau  #1 pin 12
    digitalWrite(10,LOW);
    lcd.init();
  lcd.backlight();
    lcd.setCursor(4,0);
  lcd.print("Boisson");
  lcd.setCursor(4,1);
  lcd.print("Terminée");
  delay(2000);
     lcd.init();
  lcd.backlight();
    lcd.setCursor(5,0);
  lcd.print("Choix");
  lcd.setCursor(2,1);
  lcd.print("de la boisson");
  
    }
    if(c==b)                                             // bouton #2  
   {
    digitalWrite(13,HIGH);
    delay(0); //Exemple: eau  #1 pin 13
    digitalWrite(13,LOW);
    digitalWrite(12,HIGH);
    delay(0); //Exemple: eau  #1 pin 12
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH);
    delay(0); //Exemple: eau  #1 pin 13
    digitalWrite(11,LOW);
    digitalWrite(10,HIGH);
    delay(0); //Exemple: eau  #1 pin 12
    digitalWrite(10,LOW);
    }
    if(d==b)                                           // bouton #3  
      {
    digitalWrite(13,HIGH);
    delay(0); //Exemple: eau  #1 pin 13
    digitalWrite(13,LOW);
    digitalWrite(12,HIGH);
    delay(0); //Exemple: eau  #1 pin 12
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH);
    delay(0); //Exemple: eau  #1 pin 13
    digitalWrite(11,LOW);
    digitalWrite(10,HIGH);
    delay(0); //Exemple: eau  #1 pin 12
    digitalWrite(10,LOW);
    }
    if(e==b)                                           //bouton #4  
        {
    digitalWrite(13,HIGH);
    delay(0); //Exemple: eau  #1 pin 13
    digitalWrite(13,LOW);
    digitalWrite(12,HIGH);
    delay(0); //Exemple: eau  #1 pin 12
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH);
    delay(0); //Exemple: eau  #1 pin 13
    digitalWrite(11,LOW);
    digitalWrite(10,HIGH);
    delay(0); //Exemple: eau  #1 pin 12
    digitalWrite(10,LOW);
    }
}

Pour cela tu vas utiliser une variable qui va compter les appuis sur le bouton. Tu initialises cette variable à 0 et tu l'incrémentes à chaque fois que tu détectes un appui sur le bouton. Lorsque la variable atteint 2 : tu actives la pin 13 et tu remets la variable à 0.

Tu peux simplifier ton code pour le rendre plus facile à lire :
D'abord la variable b ne sert à rien (pour le moment) : tu peux simplement comparer avec HIGH:
if (a == HIGH) { ...

Ensuite, un bouton enfoncé renvoie HIGH s'il est câblé en Pull Down. Si tu ne sais pas ce que c'est cherche un tuto sur les boutons poussoirs.
Enfin, un bouton poussoir est susceptible de faire des rebonds, c'est à dire que lorsqu'il est enfoncé, le signal change entre LOW et HIGH de manière très rapide et aléatoire pendant une certaine durée (de l'ordre de 20ms) pour se fixer sur la valeur cherchée enfin. Pendant ces rebonds, la loop fonctionne et capte ces valeurs, ce qui fait qu'elle peut compter plusieurs appuis là où il n'y en a qu'un seul pour toi. Pour contrer ça, il y a plusieurs solutions, la plus simple est d'ajouter un petit delay après la lecture des boutons :

  a = digitalRead(2);
  b = 1;
  c = digitalRead(3);
  d = digitalRead(4);
  d = digitalRead(5);
  delay(30);

Enfin tu devrais créer des fonctions pour y mettre les instructions correspondant à chaque appui sur un bouton, ça rendrait le code plus lisible.

Merci beaucoup pour votre réponse est-ce que vous pouvez juste m'expliquer le code de la variable où me donner le code de la variable merci.

Pour créer une variable globale, tu mets avant le setup :
int compteur = 0;

Ensuite dans ton bloc du bouton 2

if (a == HIGH) {
  compteur += 1;
  if (compteur == 2) { 
     compteur = 0;
// ici les lignes de code à exécuter
  }
}

Un peu de lecture pour toi : le blog d'eskimon
Les boutons poussoirs

Merci beaucoup

et comment on fait que au bout de 4s le compteur s'annule par exemple pour changer de bouton

Salut,
Tu as une fonction : millis() qui te donne le nombre de millisecondes écoulées depuis le démarrage de l'Arduino

Tu crées une variable mémoire qui va pointer sur ce nombre de millisecondes. Ce nombre va continuer d'augmenter jusqu'à ce que l'écart avec le pointage atteigne ou dépasse 4000 ms soit 4 secondes. Tu reset alors le compteur

unsigned long pointeur = 0;
bool flag = 0;
int compteur = 0;

void loop()
{
  if (flag == 1)
  {
    pointeur = millis();
    flag = 0;
  }

  if ((millis() - pointeur) >= 4000)
  {
    compteur = 0;
  }

  if (a) 
  {
    compteur ++;
    if (compteur == 1)  { flag = 1; }
    if (compteur == 2)
    {
      compteur = 0;
      ......
    }
  }
}

il y a un probleme

Tu l'as bien déclaré avant le setup ?
Et les 3 petits points sous if (compteur == 2), tu les remplis avec ton code, tu ne les laisses pas

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.