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);
Code-Sprache: JavaScript (javascript)

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);Code-Sprache: CSS (css)

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();Code-Sprache: CSS (css)

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);
 }
}
Code-Sprache: Arduino (arduino)

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);
}

Code-Sprache: Arduino (arduino)

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

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

  • 9. Januar 2015 at 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

    Reply
    • 10. Januar 2015 at 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

      Reply
  • 9. Mai 2015 at 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]

    Reply
    • 9. Mai 2015 at 18:36
      Permalink

      sollte natürlich #include heisen

      Reply
  • 2. Januar 2016 at 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

    Reply
  • 13. Februar 2016 at 12:49
    Permalink

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

    Reply
  • 18. August 2016 at 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

    Reply
  • 24. November 2017 at 7:51
    Permalink

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

    Reply
  • 31. Dezember 2018 at 20:20
    Permalink

    Hallo, danke für diese Beschreibung. Etwas „nachteilig“ finde ich bei der hier gezeigten Schaltfunktion des Tasters, dass dieser erst dann auslöst, wenn man den Taster loslässt. Für schnelle Funktionen, bei denen es auf zeitliche Genauigkeit ankommt (zB Stoppuhr usw), ist das nicht gut verwendbar. Was muss man machen, wenn (ich beziehe mich auf das hier verwendete Video) die LED exakt dann an- bzw (bei nochmaligem Tastendruck) ausgehen soll, sobald ich den Taster drücke? Also nicht erst beim Loslassen des Tasters, sondern sofort beim Drücken (sobald also der elektrische Tasterkontakt schließt)?

    Reply
  • 24. Januar 2019 at 19:13
    Permalink

    Hallo
    Ich bin relativ neu in der Arduino Welt unterwegs, finde deine Videos und Anleitungen super lehrreich. Danke

    Jetzt die Frage:
    Wozu gibt es hier die „else“ Funktion? Wenn ich das nachbaue, funktioniert das auch ohne.
    Was verstehe ich da nicht?

    Reply
  • 20. Mai 2019 at 17:01
    Permalink

    Hallo bin Anfänger im programieren.
    Ich würde gerne mit der One Button funktion 2 Taster schalten.
    Was muß ich ändern um diese Funktion zu erhalten?
    MfG G.Bender

    Reply
  • 29. November 2019 at 15:25
    Permalink

    Hi,

    habe mal ne Frage ich würde gerne wenn ich den Taster drücke das über Mqtt der status true gesendet wird wenn nicht mehr gedrückt der Status false

    Bei der Schleife im Loop wird permanent true oder false gesendet.

    Wie kann ich den Status jeweils nur einemal senden also beim drücken 1 mal true und beim loslassen wieder 1 mal false

    Danke gruss

    Reply

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.