Ardu? No!Les boutons ≫ Deux boutons par broche

Deux boutons par broche

Avec une seule broche

Plus pour le fun, même si ce montage est simple et la lecture aisée, je ne l'ai pas vu utilisé.

Schéma pour 2 boutons mais 1 seule broche

Pour lire le bouton du bas, on met l'entrée en INPUT_PULLUP, la résistance de 100kΩ donnera une tension plus faible que VCC, mais supérieure à la limite (0,6xVCC). La pull-up interne est donnée pour un Atmega328P à 35kΩ. Si le bouton n'est pas appuyé, on lit donc HIGH et on aura un LOW si on presse ce bouton.

Pour lire le bouton du haut, en mettant en INPUT l'entrée, on utilise une pulldown externe. La résistance de 3,3kΩ est faible devant les 100kΩ et peut être négligée. Si le bouton n'est pas appuyé, on lit donc LOW et on aura un HIGH si on presse ce bouton.

La résistance de 3,3kΩ permet l'appui simultané des deux boutons. Dans ce cas, on lira un LOW, la lecture du bouton du bas est prioritaire. La lecture est mono.

Si on veut plus de boutons

Il suffit de multiplier le schéma!

Exemple de programme pour deux boutons

const byte BOUTONS = 2; // VCC -- 3,3ko -- bouton H -- Pin2 -- (bouton L // 100ko) -- GND

byte etatH; // Valeur lue pour le bouton H
byte etatL; // Valeur lue pour le bouton L
byte ancienEtatL = HIGH; // Permettra de ne pas trop écrire
byte ancienEtatH = LOW; // Permettra de ne pas trop écrire

void setup()
{
  Serial.begin(115200); // Régler aussi la console à 115200 bauds!
}

void loop()
{
  // Lecture et affichage pour le bouton H
  pinMode(BOUTONS, INPUT); // Mise en route de la pulldown de 330ko
  etatH=digitalRead(BOUTONS); // Test du bouton
  if (etatH != ancienEtatH) // Si on a un changement sur le bouton H
  {
    if (etatH == HIGH) Serial.println("Bouton H appuyé");
    else Serial.println("Bouton H relâché");
    ancienEtatH = etatH; // Mémorisation du nouvel état
    delay(50); // Antirebond
  }

  // Lecture et affichage pour le bouton L
  pinMode(BOUTONS, INPUT_PULLUP); // Mise en route de la pullup interne de 35ko
  etatL=digitalRead(BOUTONS); // Test du bouton
  if (etatL != ancienEtatL) // Si on a un changement sur le bouton L
  {
    if (etatL == LOW) Serial.println("Bouton L appuyé");
    else Serial.println("Bouton L relâché");
    ancienEtatL = etatL; // Mémorisation du nouvel état
    delay(50); // Antirebond
  }
}

Bilan

- deux fois moins de broches que le montage classique
- lecture assez simple (juste un pinMode() digitalRead())
MAIS
- une résistance par bouton en plus
- aucune bibliothèque pour ce type de montage
- lecture mono
- pour N boutons, il faut N/2 sorties
- on ne peut pas utiliser les claviers pré-câblés
- rique d'avoir à ajuster les résistances en fonction de la pull-up interne
- l'utilisation d'interruption est impossible

Ce montage semble intéressant, mais il n'est pas utilisé.