Jeder der schon mal ein etwas größeres Projekt mit einem Arduino oder ESP umgesetzt hat, wird das Problem kennen. Viel zu schnell werden die Pins knapp. Besonders wenn man noch Benutzereingaben mit Buttons ermöglichen will und für jeden Button einen eigenen Pin nutzt. Um dieses Problem zu vermeiden erkläre ich in diesem Artikel, wie Ihr mehrere Buttons an einem Arduino GPIO Pin verwenden könnt.
Allgemeine Informationen
Im Normalfall wird bei Buttons am GPIO nur geprüft ob ein HIGH oder LOW Signal anliegt. Am Analog-Pin können wir messen wie viel Strom anliegt. Das nutzen wir aus um mehrere Buttons an einem Pin auszuwerten.
Diese Variante hat allerdings einen Nachteil. Mit dieser Variante ist es nicht möglich auszuwerten, wenn mehrere Buttons gleichzeitig gedrückt werden.
Sobald dies gewünscht ist, müssen die beiden Knöpfe die parallel gedrückt werden sollen an unterschiedlichen Pins hängen. Sind beliebige Kombinationen möglich scheidet dieses Vorgehen also aus. Benötigt man aber nur einen Funktions-Knopf (wie z.B. die Shift-Taste bei einer PC-Tastatur), kann man alle Knöpfe wie in dieser Anleitung beschrieben an den Analogen Pin hängen und nur die Funktionstaste an einen separaten Input-Pin anschließen.
Vorgehen
Der Anschluss der Buttons am analogen Pin erfolgt prinzipiell wie bei einem einzigen Button auch. Der Analog-Pin wird mit einem PullDown-Widerstand (>=10k) mit GND verbunden. Somit erhält der AnalogPin sofern kein Button gedrückt wird nur den minimal-Strom.
Eine Seite jedes Buttons wird nun direkt mit dem 3,3V bzw 5V Pin des Arduino/ESP verbunden. Die andere Seite des Buttons muss über einen Widerstand mit dem AnalogPin verbunden werden. Die Widerstände aller Buttons werden dabei so in Reihe geschaltet, dass jeder Button einen anderen Gesamtwiderstandswert zum Analog-Pin besitzt.

Beim hier gezeigten Aufbau sieht man, dass beim drücken des linken Buttons der Strom durch alle 6 Widerstände fließt. Beim darauf folgenden Button nur noch durch 5, und so weiter.
Durch dieses Vorgehen erhält man beim drücken eines Buttons immer einen eindeutigen Messwert am Analogen Input-Pin. Somit lässt sich der gedrückte Button anhand des Wertes immer eindeutig identifizieren.
Auswahl der Widerstände an den Buttons
Die zurückgegebenen Werte für das oben gezeigte Beispiel mit 6x 470Ohm Widerständen liefert bei der Abfrage mit analogRead(A0) bei mir folgende Werte:
Button 1 = 548; (Links) Button 2 = 732; Button 3 = 821; Button 4 = 877; Button 5 = 913; Button 6 = 940; (Rechts)


