Viele Buttons mit Arduino auslesen

Um viele Buttons mit Arduino auszulesen ist es nötig, dass man das Programm nirgends mit Delays aufhält. Um trotzdem zeitabhängige Funktionen zu verwenden, sollte man auf Timer zurück greifen. Dazu habe ich hier schon mal etwas geschrieben: Timer mit Arduino. Ansonsten ist das Auslesen vieler Buttons mit Arduino recht unkompliziert. Es bietet sich an, den Zustand aller Buttons einmal pro Frame (also dem Aufruf der Loop-Funktion) in eine Variable zu schreiben und im weiteren Programmverlauf auf diese Zustandsvariable zuzugreifen.

Schaltplan

Mit Arduino viele Buttons auslesen

Hier sind drei Button mit den digitalen Pins 8 bis 10 verbunden. Zusätzlich sind drei LEDs mit der Kathoden-Seite (kurzes Beinchen) über einen 220 Ohm Widerstand mit dem GND verbunden. Das lange Beinchen (Anode) ist jeweils mit einem digitalen Kanal (2, 3, 4) verbunden.

Code: Viele Buttons mit Arduino auslesen

int ledPins[]={2,3,4};
int buttonPins[]={8,9,10};
int buttonStates[]={0,0,0};


void setup() {
  Serial.begin(9600);
  
  for (int i=0; i<sizeof(buttonPins); i++){
    pinMode(buttonPins[i],INPUT_PULLUP);  
  }
  Serial.println(sizeof(buttonPins));
  for (int i=0; i<sizeof(ledPins); i++){
    pinMode(ledPins[i],OUTPUT);  
  }
  
}

void loop() {
  for (int i=0; i<3; i++){
    if (digitalRead(buttonPins[i])==HIGH) buttonStates[i]=1;
    else buttonStates[i]=0;
  }

  for (int i=0; i<3; i++){
    if (buttonStates[i]==1) digitalWrite(ledPins[i],HIGH);
    else digitalWrite(ledPins[i],LOW);
  }

  delay(10);
}

Im Codebeispiel werden zunächst drei Arrays angelegt. Diese speichern jeweils die digitalen Pins des Arduinos für die LEDs und Buttons, sowie den Zustand der Buttons, der im Loop jeweils festgestellt und zugewiesen wird.

Alle Buttons werden per INPUT_PULLUP deklariert. Somit benötigt man keine externen Pullup-Widerstände.

Im Loop gibt es zwei for-Schleifen. Die erste liest die Buttons aus und speichert ihren Zustand im Array buttonState, die zweite for-Schleife gibt die Werte des State-Arrays als LED-Anzeige aus.


ishiro präsentiert buch

Wow! Ich hoffe, der Beitrag hat dir gefallen. Wenn ja hab ich was für dich. Das neue E-Book von StartHardware! Darin findest du die beliebtesten Projekte von StartHardware und vieles mehr!

Wenn du noch tiefer einsteigen willst, empfehle ich Dir das Buch: Arduino: Kompendium: Elektronik, Programmierung und Projekte* – Damit wirst Du zum Arduino-Profi!

Und falls du weitere Fragen hast, stelle sie gern hier im Arduino-Forum :-)

2 thoughts on “Viele Buttons mit Arduino auslesen

  1. Hallo, finde das Tutorial “Viele Buttons mit Arduino auslesen” echt interessant – besonders desswegen, weil ich genau diese Funktion für mein Projekt (ca.20 Schalter + Touchscreen Buttons) benötige.
    Leider bin ich vollkommener Anfänger – aber hoffentlich noch lernfähig ;)
    Ich habe die Schaltung mit meinem Uno einmal nachgebaut und den Sketch von euch hochgeladen.
    Grundsätzlich hätte ich damit gerechnet, dass die LEDs nach dem Einschalten Status LOW hätten und bei Tasterdruck einschalten. Bei mir leuchten allerdings die LEDs sofort und schalten sich nur aus, wenn man den Taster gedrückt hält. Nach loslassen leuchten sie sofort wieder.
    Ich würde den Sketch gerne genau verstehen und so umstellen können, dass er so funktioniert wie ich mir es erhofft hatte.
    Würde mich riesig freuen wenn ihr mir helfen könntet.
    VG… Marcus

    1. Hi Marcus, das Verhalten, dass du beobachtest ist schon richtig so. Beim Arduino setzen die internen Pull-Ups die Buttons auf HIGH, wenn die Buttons nicht gedrückt sind. Wenn man sie drückt, sind sie LOW. Wenn man das, wie im Beispiel, 1:1 auf die LEDs anwendet sind sie an, wenn die Taster nicht gedrückt sind. Das kannst du ändern, indem du die Ausgaben invertierst. Also wenn du den Code von:

      if (buttonStates[i]==1) digitalWrite(ledPins[i],HIGH);
      else digitalWrite(ledPins[i],LOW);
      }

      zu

      if (buttonStates[i]==1) digitalWrite(ledPins[i],LOW);
      else digitalWrite(ledPins[i],HIGH);
      }

      änderst. Ich hoffe, das hilft dir weiter.

      Liebe Grüße

      Stefan

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

 

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.