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

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