Usage de 2 boutons simultanés

Bonjour,
Est il possible d'utiliser cette fonction mais avec 2 bouton?
Je m'explique:
J aimerai que mon programme s'exécute si et seulement si mes 2 boutons sont maintenus enfoncés.
Est ce possible?

La librairie gère les boutons, tu fais ce que tu veux de l'information retournée.

j'ai déplacé cette question qui n'a pas besoin de "polluer" le tuto.


Si vous suivez l'appui et le relâchement des boutons, vous pouvez effectivement savoir si les 2 sont appuyés

la bibliothèque OneButton réagit au relâchement cela dit donc ce n'est pas forcément la plus adaptée.

1 Like

Merci d'être intervenu @J-M-L .

@fdufnews , je ne comprend pas ce que tu veux dire...
Si je tente de mette 2 conditions du type:

OneButton bouton(dcy); // bouton dcy sur la pin 1 câblage pin - bouton – GND
OneButton bouton(dcy02); // bouton dcy sur la pin 3 câblage pin - bouton – GND

Cela me renvoi un message d'erreur...

vous avez deux fois le même nom pour la variable :slight_smile:

OneButton bouton1(dcy); // bouton dcy sur la pin 1 câblage pin - bouton – GND
OneButton bouton2(dcy02); // bouton dcy sur la pin 3 câblage pin - bouton – GND

évitez d'utiliser la pin 1, sur de nombreuses cartes c'est lié au port série

1 Like

ah bah oui effectivement!

donc si je met bien les 2 variables (en étant plus concentré...)
dans le void setup je met:

bouton1 && bouton2.attachClick(simpleclick); // fonction appelée en cas de click
bouton1 && bouton2.attachDoubleClick(doubleclick); // fonction appelée en cas de double click
bouton1 && bouton2.attachDuringLongPress(clicklong); // fonction appelée au moment ou le BP est relâché après un appui long

Ca fonctionne ca?

oui mais ça ne va pas vous aider car cette bibliothèque déclenche au relâchement

soit vous testez juste l'état avec un digitalRead (attention aux rebonds) soit vous utilisez la bibliothèque Toggle de @dlloyd.

voici un petit exemple

(j'ai caché quelques fils de masse pour les LEDs pour que le schéma ne soit pas trop chargé)

la LED bleue s'allume quand le bouton bleu est appuyé, idem pour la verte.
la rouge s'allume si les 2 boutons sont tenus appuyés

Sur wokwi pour simuler qu'on tient un bouton appuyé il faut faire cmd+ click sur Mac ou si vous êtes sur PC ctrl+ click (parce que sinon vous ne pourrez pas tenir les 2 appuyés à la fois)

Bonjour damienzd

Je doute.

Pour réaliser ça:

J aimerai que mon programme s'exécute si et seulement si mes 2 boutons sont maintenus enfoncés.

Une simple lecture des 2 boutons avec
digitalRead(pinDuBouton1);
devrait suffire, pas besoin d'anti-rebonds, si le programme est assez long.

Cordialement
jpbbricole

@J-M-L
Ca m'as effectivement l'air beaucoup plus simple :sweat_smile:

@jpbbricole
le programme fais une dizaine de ligne

oui et j'ai été un peu verbeux pour que ce soit facile à lire, mais avec l'opérateur ternaire on pourrait juste écrire

void loop() {
  btnVert.poll();
  btnBleu.poll();
  digitalWrite(brocheLedVerte, btnVert.isPressed() ? HIGH : LOW);
  digitalWrite(brocheLedBleue, btnBleu.isPressed() ? HIGH : LOW);
  digitalWrite(brocheLedRouge, btnVert.isPressed() && btnBleu.isPressed() ? HIGH : LOW);
}

Bonjour damienzd

Voilà une façon de faire, après détection des 2 boutons pressés, on attend que les 2 soient relâchés pour éviter des répétitions intempestives.

Le programme:

const int btn1pin = 11;     // Bouton 1
const int btn2pin = 3;     // Bouton 2

void setup() 
{
	Serial.begin(115200);

	// Les boutons sont actifs avec un GND (LOW)
	pinMode(btn1pin, INPUT_PULLUP);    
	pinMode(btn2pin, INPUT_PULLUP);
}


void loop() 
{
	if (digitalRead(btn1pin) == LOW && digitalRead(btn2pin) == LOW)     // Si les 2 boutons pressés
	{
		programmeDemarrer();

		while(digitalRead(btn1pin) == LOW || digitalRead(btn2pin) == LOW)     // Tant qu'un de 2 bouton est pressé
		{}
	}
}

void programmeDemarrer()
{
	Serial.println("Programme demarre");
}

Reste à ajuster btn1Pin et btn2pin à ton installation.

Cordialement
jpbbricole

Si je comprend bien....
ca donne avec 2 bouton qui doivent impérativement resté appuyés:



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

const byte dcy1 = 1;
const byte dcy2 = 3;
const byte d1 = 8;
const byte d2 = 7;

LiquidCrystal_I2C LCD (0x27,16,2); // définir l'ecran, son adresse 0x27 et l'ensemble colone (16) et ligne (2)

Toggle dcy01(dcy1);
Toggle dcy02(dcy2);

void setup() {
  LCD.init(); // initialisation de l'écran  
  pinMode(d1, OUTPUT);
  pinMode(d2, OUTPUT);
  dcy01.begin(dcy1);
  dcy02.begin(dcy2);
}

void loop() {
  dcy01.poll();
  dcy02.poll();
  LCD.backlight(); // active le retro eclaireage sur l ecran
  LCD.setCursor(0,0); // se positionner a la premiere ligne
  LCD.print(" HRT-023-OCEAN");  // Afficher le mot sur l'ecran


  if (dcy01.isPressed() && dcy02.isPressed()) {
    // les 2 boutons sont appuyés
  LCD.clear(); // supprime les lignes de l ecran
  LCD.setCursor(0,1);  // se positionner à la deuxième ligne
  LCD.print("Rotation ON"); // Afficher le mot 
digitalWrite(d1,HIGH);
delay(300);
  LCD.clear(); // supprime les lignes de l ecran
  LCD.setCursor(0,1);  // se positionner à la deuxième ligne
  LCD.print("Pressage ON"); // Afficher le mot 
digitalWrite(d2,HIGH);
delay(500);
  LCD.clear(); // supprime les lignes de l ecran
  LCD.setCursor(0,1);  // se positionner à la deuxième ligne
  LCD.print("Pressage OFF"); // Afficher le mot 
digitalWrite(d2,LOW);
delay(500);
  LCD.clear(); // supprime les lignes de l ecran
  LCD.setCursor(0,1);  // se positionner à la deuxième ligne
  LCD.print("Rotation OFF"); // Afficher le mot 
digitalWrite(d1,LOW);
delay(300);
  LCD.clear(); // supprime les lignes de l ecran
  } else {
    // zéro ou un seul bouton appuyé
  LCD.setCursor(0,1);  // se positionner à la deuxième ligne
  LCD.print("  Attente dcy"); // Afficher le mot 
  }
}

Est-ce que ça fonctionne ?
(Vous faites bcp d’affichages pour rien dans la loop si rien ne change)
Sinon la bibliothèque lcd que vous utilisez n’est pas la plus optimale, celle ci est plus efficace hd44780 - Arduino Reference

Ah...
c'est mon deuxième projet Arduino et le premier avec un écran...
la bibliothèque hd44780 gère aussi le I2C?
J'ai pas encore tester...
j'ai câblé les 2 bouton sur ma shield.
j'essai très vite

oui, voici un petit code de base tout simple

faut juste avoir les bons include

#include <Wire.h>
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h> // i2c expander i/o class header

et ensuite vous définissez votre instance

hd44780_I2Cexp lcd;

et il faut appeler

lcd.begin(nbCols, nbLignes);

dans le setup()

1 Like

Ah ok,
et je n'ai pas besoin d'effacer les lignes a chaque étape de mon programme avec cette librairie?

Ca n’écrit que les caractères demandés

Si vous avez affiché en 0,0 le nombre 12.345 et que vous demandez d’afficher 42 alors vous verrez 42.345 sur l’écran

➜ il faut vous assurer du formatage à taille constante ou effacer effectivement le champ précédent

J'ai mis mon programme dans mon setup...
l'écran affiche un message en boucle qu'il m est impossible de lire :sweat_smile:

Dans le setup ça ne passe qu’une fois donc pas de boucle sauf si vous avez mis vous même la boucle ou que l’arduino reboote sans cesse



#include <Toggle.h>// librairie bouton
#include "Wire.h"
#include <hd44780.h>// librairie écran
#include <hd44780ioClass/hd44780_I2Cexp.h> // i2c expander i/o class header

const byte dcy1 = 1;
const byte dcy2 = 3;
const byte d1 = 8;
const byte d2 = 7;
hd44780_I2Cexp lcd;
const int nbCols = 16;// définir l'ecran,  l'ensemble colone (16)
const int nbLignes = 2;// définir l'ecran, l'ensemble ligne (2)

Toggle dcy01(dcy1);
Toggle dcy02(dcy2);

void setup() {
  Serial.begin(115200);

  int lcdAbsent = lcd.begin(nbCols, nbLignes);
  if (lcdAbsent) {
    Serial.print(" initialisation LCD - erreur ");
    Serial.println(lcdAbsent);
    hd44780::fatalError(lcdAbsent);
  }
  pinMode(d1, OUTPUT);
  pinMode(d2, OUTPUT);
  dcy01.begin(dcy1);
  dcy02.begin(dcy2);
}

void loop() {
  dcy01.poll();
  dcy02.poll();



  if (dcy01.isPressed() && dcy02.isPressed()) {
    // les 2 boutons sont appuyés
  lcd.print("Rotation ON"); // Afficher le mot 
digitalWrite(d1,HIGH);
delay(300);
  lcd.print("Pressage ON"); // Afficher le mot 
digitalWrite(d2,HIGH);
delay(500);
  lcd.print("Pressage OFF"); // Afficher le mot 
digitalWrite(d2,LOW);
delay(500);
  lcd.print("Rotation OFF"); // Afficher le mot 
digitalWrite(d1,LOW);
delay(300);
  lcd.clear(); // supprime les lignes de l ecran
  } else {
    // zéro ou un seul bouton appuyé
  lcd.print("  Attente dcy"); // Afficher le mot 
  }
}

Voila mon code.
comment savoir si elle reboot