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