Appui simultane sur boutons poussoirs

Bonjour.
J’ai une question simple de débutant mais que je n’arrive pas à résoudre.

Suivant le schéma joint, si j’appuie sur un bouton, comment empêcher que si j’appuie sur un autre bouton en même temps que le premier, ce dernier n’ai aucun effet?

Voici un bout de code:

void setup() {

  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);

  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
}

void loop() {

  bool Bouton1 = digitalRead(3);
  bool Bouton2 = digitalRead(4);
  bool Bouton3 = digitalRead(5);
  bool Bouton4 = digitalRead(6);

  if (Bouton1) {
    digitalWrite(7, HIGH);
  }

  if (Bouton2) {
    digitalWrite(8, HIGH);
  }

  if (Bouton3) {
    digitalWrite(9, HIGH);
  }

  if (Bouton4) {
    digitalWrite(10, HIGH);
  }
}

si j'appuie sur un autre bouton en même temps que le premier

Situation impossible en réalité. L'appui ne peut pas être simultané.
Donc si tu mémorise l'état du premier bouton appuyé, tant que celui-ci reste appuyé, il faut ignorer les autres.
Il faudra quand même gérer les rebonds avant tout, soit électroniquement soit avec du logiciel.

@+

Je ne saisis pas bien comment 'ignorer les autres boutons'.
Pour ignorer les autres boutons, est-ce que je peux faire ça?

if (Bouton1) {
    Bouton2 = false;
    Bouton3 = false;
    Bouton4 = false;

    digitalWrite(7, HIGH);
  }

  if (Bouton2) {
    Bouton1 = false;
    Bouton3 = false;
    Bouton4 = false;
    
    digitalWrite(8, HIGH);
  }
   Etc...

Quelque chose comme ça, mais il faudrait avant tout gérer les rebonds.

Si tu appuies sur le bouton1 puis sur le bouton2, le bouton1 rebondit et le logiciel voit le bouton2 qui rebondit à son tour, et ainsi de suite.

Voir ICI

@+

Si j’ai bien compris pour éviter les rebonds par logiciel il faut monter les entrées en INPUT_PULLUP, exact ?

J’ai la même question pour un montage en analogique (voir schéma joint), même problème, je veux que l’appui sur un premier bouton empêche toute action d’un deuxième bouton appuyé. Est-ce que c’est plus facilement réalisable?

void setup() {

  pinMode(A0, INPUT);

  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
}


int Lis_boutons_ana() {
  int EntreeAna = analogRead(A0);

  if (EntreeAna < 50)  return 1;
  if (EntreeAna > 100 && EntreeAna < 250)  return 2;
  if (EntreeAna > 250 && EntreeAna < 400)  return 3;
  if (EntreeAna > 400 && EntreeAna < 600)  return 4;

  if (EntreeAna > 900) return 0;
}



void loop() {

  int lb = Lis_boutons_ana();


  if (lb == 1) {
    digitalWrite(7, HIGH);
  }
  if (lb == 2) {
    digitalWrite(8, HIGH);
  }
  if (lb == 3) {
    digitalWrite(9, HIGH);
  }
  if (lb == 4) {
    digitalWrite(10, HIGH);
  }
  if (lb == 0) {
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
  }
}

Si j'ai bien compris pour éviter les rebonds par logiciel il faut monter les entrées en INPUT_PULLUP, exact ?

Non mettre les résistances de "pull-up" interne ne fait qu'économiser une résistance externe.
On ne peut pas empêcher les rebonds qui sont d'origine mécanique mais on peut supprimer leur effets. Soit par logiciel comme dans l'exemple fourni par hbachetti soit en plaçant un condensateur en parallèle sur les contacts.
Quelque soit la méthode que tu choisi un anti rebond est OBLIGATOIRE, sinon le programme croira que tu presses 10 ou 20 fois sur le bouton et il te semblera que le programme fait n'importe quoi.

Tu ne peux pas empêcher d'appuyer sur plusieurs boutons en même temps sauf par des moyens mécaniques.
Par contre dès qu'un bouton est détecté appuyé tu peux interdire la lecture des autres en utilisant des variables auxiliaires

Exemple avec 2 boutons --> logique en français, à traduire en code
Variables auxiliaires B_pressé; B2_pressé

//lecture bouton_1
Si (B2_pressé== 0) lire état bouton_1
Si (le bouton1 est détecté pressé) mettre B1_pressé à l'état haut ou 1 logique

// lecture bouton_2

Si (B1_pressé== 0) lire état bouton_2
Si (le bouton2 est détecté) mettre B2_pressé à l'état haut ou 1 logique