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.

Beispiel-Aufbau mit 6 Buttons

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)

Hier sieht man schon, dass die Abstände zwischen den Messwerten der Buttons nicht gleichmäßig sind. In diesem Fall funktioniert das ganze trotzdem noch sehr gut. Wenn man aber mehr Buttons anschließen möchte kann es schnell dazu führen, dass die Abstände zwischen den Messwerten zu gering werden. Da diese auch nie 100% konstant sind, sondern immer etwas schwanken können, sollte hier auf ausreichende Differenzen geachtet werden.
Um diese Werte anzupassen muss man den Widerstand am jeweiligen Button austauschen. Hierbei sollte berücksichtigt werden, dass alle darauf folgenden Buttons durch die Änderung dieses Widerstands ebenfalls Ihren Wert ändern.

Die Anpassung der Widerstände erfordert ggf. etwas Geduld. Ich empfehle, zur Sicherheit die Anpassung Schritt für Schritt durchzuführen und nach jedem getauschten Widerstand die neuen Werte erst zu prüfen.

Code-Beispiel zum Auslesen der Werte

void setup() {
  Serial.begin(9600);
  delay(500);
  pinMode(A0, INPUT);
}

void loop() {
  int x = analogRead(A0);
  if(x<1024 && x>0){
    Serial.println(x);
  }
}

Mit diesem Code-Beispiel wird der Analoge Eingang A0 ausgelesen. Sobald ein gültiger Wert (zwischen 0 und 1024) zurückgegeben wird, wird dieser auf dem Seriellen Monitor ausgegeben. So kann man bequem die Werte der einzelnen Buttons überprüfen.

Mit diesem Wissen solltet Ihr nun in der Lage sein, mehrere Buttons an einem einzelnen Arduino GPIO Pin zu betreiben. Sollten trotzdem noch Fragen auftreten, wendet euch gerne jeder Zeit per Email an support@smarthomeyourself.de. Ich werde euch so schnell und gut ich kann weiter helfen.



Hier gibt es die Anleitung noch als Video:

ARDUINO BASICS #17 - Mehrere Taster an einem Pin betreiben
Dieses Video ansehen auf YouTube.
Durch starten des Videos stellen Sie eine Verbindung zu YouTube her. Die Datenschutzerklärung von YouTube finden Sie hier: https://www.youtube.com/static?gl=DE&template=terms&hl=de. Weitere Informationen zum Thema Datenschutz bei Google/YouTube finden Sie hier: https://policies.google.com/privacy?hl=de&gl=de

Bei Links auf Amazon- und Ebay-Artikel handelt es sich um Affiliate-Links. In diesen Links wird meine jeweilige Partner-Id mit übergeben, wodurch ich eine kleine Provision für eure Käufe erhalte. Ihr zahlt natürlich das gleiche wie sonst auch.
Ich würde mich freuen, wenn Ihr bei eurer Bestellung die Links verwendet und mich so einfach und für euch kostenlos unterstützt, um weiterhin neue Projekte mit euch teilen zu können.

Vielen Dank für euer Verständnis und eure Unterstützung!