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.
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
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
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]
sollte natürlich #include heisen
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
Kann man diese Library auch mit 2 Taster verwenden ?
z.B.
OneButton button(buttonPin, false)
OneButton button2(buttonPin2, false)
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
Hallo,
ist es möglich auch eine Sketch mit einem Tastendruck zu starten.
Und wie müsste das aussehen.
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)?
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?
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
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