Normale Drucktaster, auch Pushbuttons genannt, die nur im gedrückten Zustand Kontakt herstellen, werden bei vielen Arduino Projekten benötigt. Der Anschluss des Schalters an den Arduino ist recht einfach – solange man nicht auf den notwendigen Pulldown- oder Pullup-Widerstand vergisst, der das Arduino-Pin auch im offenen Schalterzustand auf einen definierten Pegel zieht.

Die OneButton-Library von Matthias Hertel bewahrt uns davor, dass wir uns selbst um Dinge wie prellende Taster und Mehrfachklicks etc. kümmern müssen. Die Library stellt in sehr einfacher Form einen Mechanismus zur Verfügung, mit dem es möglich ist, beim Eintreten bestimmter Ereignisse (Klick, Doppelklick, langer Klick etc.) eigene Funktionen aufzurufen.

Die OneButton-Library ist hier auf Github zu finden:
https://github.com/mathertel/OneButton

Zur Installation rechts „Download ZIP“ auswählen, das heruntergeladene File entpacken und in den /libraries-Ordner von Arduino kopieren. Dort noch das „-master“ aus dem Verzeichnisnamen löschen. Damit die Library auch erkannt wird, muss die Arduino Entwicklungsumgebung einmal neu gestartet werden.

Die Initialisierung eines Buttons im Arduino Sketch erfolgt z.B. so:

OneButton button(buttonPin, false);

buttonPin ist dabei das Arduino-Pin, an dem der Taster hängt. Der zweite Parameter gibt an, ob der ungedrückte Zustand des Buttons dem Pegel LOW oder HIGH entspricht. Das false im Beispiel bedeutet, dass ein Pulldown-Widerstand verwendet wurde und der Pegel am Arduino bei einem Druck des Tasters von LOW auf HIGH wechselt.

An dieses Button-Objekt können dann Callback-Funktionen für bestimmte Ereignisse gebunden werden, z.B.:

 button.attachClick(clickedIt);

D.h. wenn der Button das Ereignis „Klick“ erkennt, wird unsere Funktion clickedIt() aufgerufen.

Damit die OneButton-Library richtig arbeitet, muss in der loop()-Funktion des Sketches regelmäßig

 button.tick();

aufgerufen werden. Die Methode arbeitet sehr effizient und ist schnell abgearbeitet. Irgendwelche delay()-Aufrufe zum Entprellen der Tasten sind nicht notwendig, darum kümmert sich die Library.

Grundlegende Infos zu Pushbuttons und ein Beispiel zur OneButton-Library habe ich im Video zusammengestellt:

Am einfachsten kann man den aktuellen Zustand eines Pushbuttons in der loop()-Funktion abfragen und entsprechend darauf reagieren. Diese Variante kann aber mit wenig Aufwand nur auf den aktuellen Zustand, nicht aber auf Zustandsänderungen reagieren. Zustandsänderungen (war der Button beim letzten Mal noch nicht gedrückt, jetzt ist er es aber?) bedürfen außerdem besonderer Aufmerksamkeit, da sie durch prellende Taster usw. nicht immer sofort eindeutig zu erkennen sind oder bei einem Tastendruck irrtümlich mehrfach erkannt werden.

Hier ein Code-Beispiel ohne die OneButtion-Library, das sich in ähnlicher Form auch im Button-Tutorial von arduino.cc findet:

const int buttonPin = 12;
const int ledPin = 2;
 
void setup() {
 pinMode(ledPin, OUTPUT);
 pinMode(buttonPin, INPUT);
}
 
void loop() {
 if (digitalRead(buttonPin) == HIGH) {
 digitalWrite(ledPin, HIGH);
 }
 else {
 digitalWrite(ledPin, LOW);
 }
}

Das folgende, komplexere Beispiel verwendet die OneButton-Library und unterscheidet bereits zwischen normalen Klicks und Doppelklicks. Da kann man auch die Funktionsweise der Library schon sehr gut erkennen:

#include "OneButton.h"
 
const int buttonPin = 12;
const int ledPin = 2;
 
OneButton button(buttonPin, false);
 
int ledState = LOW;
 
void setup() {
 pinMode(ledPin, OUTPUT);
 pinMode(buttonPin, INPUT);
 
 button.attachClick(clickedIt);
 button.attachDoubleClick(doubleClickedIt);
 
}
 
void loop() {
 button.tick();
 
 delay(10);
}
 
 
void clickedIt() {
 ledState = !ledState;
 digitalWrite(ledPin, ledState);
}
 
void doubleClickedIt() {
 for (int i=0; i<5; i++) {
 digitalWrite(ledPin, HIGH);
 delay(60);
 digitalWrite(ledPin, LOW);
 delay(60);
 }
 
 digitalWrite(ledPin, ledState);
}

 

Fragen, Anmerkungen und Kritik bitte einfach in die Kommentare schreiben.

 

8 thoughts on “Arduino und Taster – Drucktaster einbinden mit der OneButton Library

  • 9. Januar 2015 um 21:13
    Permalink

    Ich hätte nochmal die Frage, in welchen zeitl. Abständen der Befehl aufgerufen werden muss. In meinem Projekt dauert ein Loop ~1s, das wird wahrscheinlich zu lange sein. Ich könnte den Befehl button.tick(); mehrmals einfügen, dann würde er aber unregelmäßig aufgerufen werden (z.B. Aufruf – 100ms Pause – Aufruf – 200ms Pause – Aufruf). Wäre das auf irgendeine Art und Weise schlimm? :)
    Würde mich über eine Antwort freuen, VG Yannik

    Antworten
    • 10. Januar 2015 um 23:31
      Permalink

      Hallo Yannik, ja, eine Loop mit 1s ist da sicher ein Problem, da würde die meisten Buttonklicks verloren gehen. Mehrmals einfügen geht natürlich, ob aber nicht auch 200ms zu lange sind, das musst du ausprobieren.
      Generell sollte der Befehl delay() ja vermieden werden (eben weil er andere programmteile auch blockiert), ich weiss aber dass es meistens einfach der bequemste Weg ist :)
      lg, Adi

      Antworten
  • 9. Mai 2015 um 18:25
    Permalink

    Hallo
    Erst mal große Lob für deine Tutorial. Ich habe ein kleines Problem mit OneButton.
    ich möchte wenn ich den Taster loslasse die LED wieder ausgeht was muß ich an meinen Code ändern
    Gruß Holger

    [code]
    #include 
    int ledPin=13;
    int buttonPin1=A1;
    OneButton button1=OneButton(buttonPin1,true);

    void setup() {
      pinMode(ledPin,OUTPUT);
      pinMode(buttonPin1,INPUT);
      button1.attachPress(halten);
      button1.setPressTicks(3000);
    }

    void loop() {
     button1.tick();
      delay(10);
    }
    void halten()
     {
       static int ledState=LOW;
       ledState=!ledState;
       digitalWrite(ledPin,ledState);
       }

    [/code]

    Antworten
  • 2. Januar 2016 um 12:24
    Permalink

    Hallo, ich bin seit ca. 1 Monat in die Arduino Welt eingestiegen und bin überrascht wie einfach diese zum aufspielen und zu ändern sind.
    Ich bin auch über zahlreiche Videos und seiten im Netz sehr froh.
    Die One Button Funktion hat mein Interesse geweckt weil ich seit sehr langem eine einfache Lösung für eine Packtische Anwendung in der Wohnung suche.
    Ich habe einige Beleuchtungen im Wohnzimmer und dementsprechend viele schalte:
    1. Normallicht
    2. Zusatzlicht
    3. TV Beleuchtung
    4. Esstisch Beleuchtung
    5. Schwache Beleuchtung (Hintergrund licht)
    Ich würde diese mit ein Relais ein und aus Schalten wollen.
    ich habe jetzt die One Butten Funktion mit Zusatz Doppelklick gesehen und wollte wissen ob es ein weg gibt 5 Funktionen mit ein oder zwei Tastern (einmal, doppel, dreifach, zwei x doppel, lange,…) auf 5 LEDs zu schalten.

    würde mich sehr auf ein Beispiel freuen, Danke.

    Yasar

    Antworten
  • 13. Februar 2016 um 12:49
    Permalink

    Kann man diese Library auch mit 2 Taster verwenden ?
    z.B.
    OneButton button(buttonPin, false)
    OneButton button2(buttonPin2, false)

    Antworten
  • 18. August 2016 um 11:35
    Permalink

    es geht auch mit 2 oder mehr Buttons…..schaue einfach oben unter dem Github Link nach.
    Dort findest Du ein Beispiel wie man 2 Taster einbindet….

    Gruß
    Thomas

    Antworten
  • 24. November 2017 um 7:51
    Permalink

    Hallo,
    ist es möglich auch eine Sketch mit einem Tastendruck zu starten.
    Und wie müsste das aussehen.

    Antworten

Schreibe einen Kommentar

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

Time limit is exhausted. Please reload the CAPTCHA.

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