Arduino UNO Q - Button Entprellen

Bei der Programmierung eines Arduino UNO Q zur Erkennung eines Buttondrucks kann ein einzelner Druck mehrfach erkannt werden. Dies geschieht, weil mechanische Kontakte schnell zwischen LOW und HIGH oszillieren — ein Phänomen namens Flattern oder Chattering. Dieses Tutorial zeigt Ihnen, wie Sie dies durch Entprellung beheben.

Arduino UNO Q Chattering-Phänomen
Arduino UNO Q - Button Entprellen

Erforderliche Hardware

1×Arduino UNO Q
1×USB Cable for Arduino Uno Q
1×Breadboard-Taster mit Kappe
1×Breadboard-Taster-Kit
1×Panel-Drucktaster
1×Taster-Modul
1×Breadboard
1×Verbindungskabel
1×(Empfohlen) Schraubklemmenblock-Shield für Arduino Uno
1×(Empfohlen) Sensors/Servo Expansion Shield for Arduino Uno
1×(Empfohlen) Breadboard-Shield für Arduino Uno
1×(Empfohlen) Gehäuse für Arduino Uno
1×(Empfohlen) Prototyping-Grundplatte & Breadboard-Kit für Arduino Uno

Oder Sie können die folgenden Kits kaufen:

1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

Über Buttons

Erfahren Sie mehr über Buttons (Pinbelegung, Verdrahtung, Funktionsweise) im Tutorial Arduino UNO Q - Button.

Schaltplan

Arduino UNO Q Button Schaltplan

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

MCU-Code — Ohne Entprellung (zum Vergleich)

Das Arduino UNO Q hat zwei Prozessoren: die STM32 MCU (übernimmt die Echtzeitkontrolle der Hardware) und die Qualcomm MPU (führt Debian Linux aus). In diesem Abschnitt wird nur die STM32 MCU programmiert — die Linux-Seite bleibt inaktiv. Ein späterer Abschnitt zeigt, wie beide Prozessoren zusammenarbeiten.

Dies ist die Version ohne Entprellung aus dem Button-Tutorial. Beachten Sie, dass ein einzelner Druck mehrfach registriert werden kann:

/* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino-uno-q/arduino-uno-q-button-debounce */ #define BUTTON_PIN 7 // The Arduino UNO Q pin connected to the button int button_state; int prev_button_state = HIGH; // HIGH = not pressed (pull-up) void setup() { // initialize the pushbutton pin as a pull-up input pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the button (LOW = pressed, HIGH = not pressed) button_state = digitalRead(BUTTON_PIN); if (prev_button_state == HIGH && button_state == LOW) { // button was just pressed (HIGH → LOW transition) // TO DO: add your press action here } else if (prev_button_state == LOW && button_state == HIGH) { // button was just released (LOW → HIGH transition) // TO DO: add your release action here } // save the last state prev_button_state = button_state; }

Schnellschritte

  • Erstmals mit Arduino UNO Q? Folgen Sie zunächst dem Tutorial Getting Started with Arduino UNO Q, um Ihre Entwicklungsumgebung einzurichten.
  • Button verdrahten: Verbinden Sie einen Button-Pin mit GND und den anderen mit Pin 7 gemäß dem Schaltplan.
  • Verbinden: Schließen Sie den Arduino UNO Q mit einem USB-C-Kabel an Ihren Computer an.
  • Arduino App Lab öffnen: Starten Sie Arduino App Lab und warten Sie, bis es Ihren Arduino UNO Q erkennt.
  • Neue App erstellen: Klicken Sie auf die Schaltfläche Neue App erstellen.
Neue App in Arduino App Lab auf Arduino UNO Q erstellen
  • Geben Sie der App einen Namen, z. B.: DIYables_ButtonDebounce
  • Klicken Sie auf Erstellen, um zu bestätigen.
  • Sie sehen einen Satz von Ordnern und Dateien, die in Ihrer neuen App generiert werden.
Arduino App Lab App-Ordner und Dateien auf Arduino UNO Q
  • Suchen Sie die Datei sketch/sketch.ino — dies ist, wo Sie die MCU-Skizze einfügen.
  • Skizze einfügen: Kopieren Sie den Code ohne Entprellung oben und fügen Sie ihn in die Skizzendatei ein. Behalten Sie andere Dateien als Standard bei.
  • Hochladen: Klicken Sie auf die Run-Schaltfläche in Arduino App Lab, um zu kompilieren und auf die STM32 hochzuladen.
  • Klicken Sie auf die Run-Schaltfläche in Arduino App Lab auf Arduino UNO Q
    • Button einmal drücken, dann loslassen — beobachten Sie, dass mehrere Ereignisse protokolliert werden können (sichtbar über den Bridge Monitor im nächsten Abschnitt).
    • Hinweis: Dies ist der Chattering-Effekt — der nächste Abschnitt behebt ihn.

    MCU-Code — Mit Entprellung (mit millis)

    Diese Version verwendet millis(), um zu warten, bis sich das Signal stabilisiert, bevor es als echtes Ereignis behandelt wird. Nur Zustandsänderungen, die länger als DEBOUNCE_TIME Millisekunden anhalten, werden akzeptiert:

    /* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino-uno-q/arduino-uno-q-button-debounce */ #define BUTTON_PIN 7 // The Arduino UNO Q pin connected to the button #define DEBOUNCE_TIME 50 // The debounce time in milliseconds; increase if output flickers int last_steady_state = LOW; // the previous stable state from the input pin int last_flickerable_state = LOW; // the previous flickerable state from the input pin int current_state; // the current reading from the input pin unsigned long last_debounce_time = 0; // the last time the state changed void setup() { // initialize the pushbutton pin as a pull-up input pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the current state of the button current_state = digitalRead(BUTTON_PIN); // if the state changed (due to noise or a press/release), reset the debounce timer if (current_state != last_flickerable_state) { last_debounce_time = millis(); last_flickerable_state = current_state; } if ((millis() - last_debounce_time) > DEBOUNCE_TIME) { // the state has been stable for DEBOUNCE_TIME ms — treat it as real if (last_steady_state == HIGH && current_state == LOW) { // TO DO: button pressed action here } else if (last_steady_state == LOW && current_state == HIGH) { // TO DO: button released action here } last_steady_state = current_state; } }
    • So funktioniert es: Wenn sich der Button-Zustand schnell ändert (Flattern), wird der Timer jedes Mal zurückgesetzt. Nur wenn der Zustand für 50 ms stabil ist, wird er als echtes Drücken oder Loslassen behandelt.
    • Pro-Tipp: Wenn Ihr Button immer noch mehrfache Ereignisse anzeigt, versuchen Sie, DEBOUNCE_TIME auf 75 oder 100 zu erhöhen.

    ※ Notiz:

    Die optimale DEBOUNCE_TIME hängt von der Button-Qualität und der Anwendung ab. 50 ms ist ein sicherer Standard für die meisten Druckschalter.

    Einfacheres Entprellen mit der ezButton-Bibliothek

    Für Anfänger und Multi-Button-Projekte haben wir die ezButton-Bibliothek erstellt — sie verwaltet INPUT_PULLUP, Entprellung und Edge-Erkennung automatisch.

    Einzelner Button mit ezButton:

    /* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino-uno-q/arduino-uno-q-button-debounce */ #include <ezButton.h> ezButton button(7); // create ezButton object attached to pin 7 void setup() { button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first if (button.isPressed()) { // TO DO: button pressed action here } if (button.isReleased()) { // TO DO: button released action here } }
    • Install the library: Click the Add sketch library button (the open book icon with a + sign) in the left sidebar.
    Add sketch library in Arduino App Lab on Arduino UNO Q
    • Search for ezButton created by ArduinoGetStarted.com and click the Install button.
    My Apps / DIYables Apps
    Run
    Bricks
    No bricks added...
    Sketch Libraries
    No sketch libra...
    Files
    python
    sketch
    .gitignore
    README.md
    app.yaml
    sketch.ino
    Add sketch library
    ezButton ArduinoGetStarted.com

    Button library supports debounce, pressed/released events and the press counting. It is easy to use with multiple buttons. The library can be used for push-button, momentary switches, toggle switch, magnetic contact switch (door sensor)... It is designed for not only beginners but also experienced users.

    1.0.6
    Install
    More Info
    • Search for Arduino_RouterBridge created by Arduino and click the Install button.
    My Apps / DIYables Apps
    Run
    Bricks
    No bricks added...
    Sketch Libraries
    No sketch libra...
    Files
    python
    sketch
    .gitignore
    README.md
    app.yaml
    sketch.ino
    Add sketch library
    Arduino_RouterBridge Arduino

    This library provides a simple RPC bridge for Arduino UNO Q boards, allowing communication between the board and other devices using MsgPack serialization.

    0.4.1
    Install
    More Info
    • So funktioniert es: button.loop() muss bei jedem Loop-Zyklus aufgerufen werden. Dann gibt button.isPressed() genau einmal pro physikalischem Druck true zurück, und button.isReleased() gibt genau einmal pro Loslassen true zurück — kein Flattern.

    Mehrere Buttons mit ezButton (drei Buttons auf Pins 6, 7, 8):

    Arduino UNO Q Multi-Button Schaltplan

    Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

    /* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino-uno-q/arduino-uno-q-button-debounce */ #include <ezButton.h> ezButton button_1(6); // ezButton object on pin 6 ezButton button_2(7); // ezButton object on pin 7 ezButton button_3(8); // ezButton object on pin 8 void setup() { button_1.setDebounceTime(50); button_2.setDebounceTime(50); button_3.setDebounceTime(50); } void loop() { button_1.loop(); button_2.loop(); button_3.loop(); if (button_1.isPressed()) { /* button 1 pressed action */ } if (button_1.isReleased()) { /* button 1 released action */ } if (button_2.isPressed()) { /* button 2 pressed action */ } if (button_2.isReleased()) { /* button 2 released action */ } if (button_3.isPressed()) { /* button 3 pressed action */ } if (button_3.isReleased()) { /* button 3 released action */ } }

    Linux + MCU Bridge-Programmierung

    Das Arduino UNO Q hat zwei Prozessoren, die zusammenarbeiten: die MPU (Qualcomm, führt Debian Linux aus) und die MCU (STM32, führt Zephyr OS mit Ihrer Arduino-Skizze aus). Sie kommunizieren mittels RPC über die Arduino_RouterBridge-Bibliothek — niemals über rohe serielle Anschlüsse.

    • Der Button ist mit der MCU (STM32) verbunden — verdrahtet mit einem digitalen Eingangspin auf der STM32. Die MCU liest und entprellt Button-Drücke mit der ezButton-Bibliothek.
    • Die MPU kann den Button nicht direkt lesen — sie muss Daten über Bridge.call() von der MCU anfordern. Die MCU antwortet mit der Druckzahl oder setzt sie zurück.
    • Die MPU hat Wi-Fi — da die MPU vollständiges Debian Linux mit Wi-Fi ausführt, kann sie Druckzahlen über Telegram melden und Remote-Reset-Befehle akzeptieren.
    • Kommunikation: Bridge.call() auf der Linux-Seite ruft Bridge.provide()-Funktionen auf der MCU-Seite auf
    • ⚠️ Reserviert: /dev/ttyHS1 (Linux) und Serial1 (MCU) werden vom Arduino Router verwendet — öffnen Sie sie nie direkt

    Kurz gesagt: MCU entprellt Button-Drücke und zählt sie → MPU fordert die Zahl an → MPU leitet sie über Telegram weiter.

    MCU-Skizze — Button-Entprellung mit Druckzähler und Bridge:

    /* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino-uno-q/arduino-uno-q-button-debounce */ #include "Arduino_RouterBridge.h" #include <ezButton.h> ezButton button(7); int press_count = 0; void get_press_count() { Monitor.println("Press count: " + String(press_count)); } void reset_count() { press_count = 0; Monitor.println("Press count reset to 0"); } void setup() { button.setDebounceTime(50); Bridge.begin(); Monitor.begin(); Bridge.provide("get_press_count", get_press_count); Bridge.provide("reset_count", reset_count); Monitor.println("Button Debounce Bridge ready"); } void loop() { button.loop(); if (button.isPressed()) { press_count++; Monitor.println("Button PRESSED — count: " + String(press_count)); } if (button.isReleased()) Monitor.println("Button RELEASED"); }

    Python-Skript (Arduino App Lab) — Druckzahl von Linux abrufen:

    /* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino-uno-q/arduino-uno-q-button-debounce */ from arduino.app_utils import * import time def loop(): while True: count = Bridge.call("get_press_count") print(f"Current press count: {count}") time.sleep(3) App.run(user_loop=loop)
    • Hinweis: Stellen Sie sicher, dass Bridge.begin() in der MCU-Skizze aufgerufen wird und die Skizze hochgeladen ist, bevor Sie das Python-Skript auf der Linux-Seite ausführen.
    • ⚠️ Warnung: Öffnen Sie nie direkt /dev/ttyHS1 (auf Linux) oder verwenden Sie Serial1 (auf MCU) in Ihrem Code — diese sind vom Arduino Router reserviert und deren Zugriff unterbricht die Bridge.

    Schnellschritte

    • MCU-Skizze hochladen: Öffnen Sie Arduino App Lab, erstellen Sie eine neue App, fügen Sie die Bridge-MCU-Skizze oben in sketch/sketch.ino ein, installieren Sie die ezButton- und Arduino_RouterBridge-Bibliotheken, und klicken Sie auf Run.
    • Python-Skript hinzufügen: Fügen Sie den Python-Code oben in die Python-Registerkarte derselben App ein.
    • App ausführen: Klicken Sie auf Run — die Python-Seite fragt die Druckzahl alle 3 Sekunden ab.
    • Button mehrfach drücken.
    • Konsole prüfen: Öffnen Sie die Registerkarte Konsole → Unterregisterkarte MCU Monitor, um Druck-/Loslassereignisse zu sehen. Öffnen Sie die Python-Konsole-Unterregisterkarte, um die abgerufene Zahl zu sehen.

    App Lab Konsolenausgabe

    DIYables_Apps
    Stop
    sketch.ino
    1#include "Arduino_RouterBridge.h"
    Serial Monitor
    Python
    Message (Enter to send a message to "Newbiely" on usb(2820070321))
    New Line
    9600 baud
    Button Debounce Bridge ready Button PRESSED — count: 1 Button RELEASED Button PRESSED — count: 2 Button RELEASED Button PRESSED — count: 3 Button RELEASED

    Telegram-Integration

    Sie können die Button-Druckzahl von überall aus über Telegram abfragen oder zurücksetzen.

    Wenn Sie noch keinen Telegram-Bot haben, sehen Sie How to Create a Telegram Bot, um Ihr Bot-Token zu erhalten, bevor Sie fortfahren.

    MCU-Skizze: Behalten Sie die gleiche MCU-Skizze aus dem vorherigen Bridge-Abschnitt — keine Änderungen erforderlich. Stellen Sie sicher, dass sie bereits auf die STM32 hochgeladen ist und läuft, bevor Sie fortfahren.

    Python-Skript (Arduino App Lab) — Telegram-Bot für Button-Druckzähler-Verfolgung:

    /* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino-uno-q/arduino-uno-q-button-debounce */ from arduino.app_utils import * import requests import time BOT_TOKEN = "YOUR_BOT_TOKEN" API_URL = f"https://api.telegram.org/bot{BOT_TOKEN}" last_update_id = 0 def send_message(chat_id, text): requests.post(f"{API_URL}/sendMessage", json={"chat_id": chat_id, "text": text}) def get_updates(): global last_update_id resp = requests.get(f"{API_URL}/getUpdates", params={"offset": last_update_id + 1, "timeout": 5}) return resp.json().get("result", []) def loop(): global last_update_id updates = get_updates() for update in updates: last_update_id = update["update_id"] msg = update.get("message", {}) chat_id = msg.get("chat", {}).get("id") text = msg.get("text", "").strip() if text == "/count": count = Bridge.call("get_press_count") send_message(chat_id, f"Button pressed {count} time(s) since last reset") elif text == "/reset": Bridge.call("reset_count") send_message(chat_id, "Press count reset to 0") else: send_message(chat_id, "Commands:\n/count — get button press count\n/reset — reset the count to 0") time.sleep(1) App.run(user_loop=loop)
    • Hinweis: Ersetzen Sie YOUR_BOT_TOKEN durch das Token, das Sie von @BotFather auf Telegram erhalten haben.
    • Senden Sie /count, um zu sehen, wie oft der Button seit dem Einschalten oder dem letzten Zurücksetzen gedrückt wurde.
    • Senden Sie /reset, um den Zähler auf 0 zurückzusetzen.

    Schnellschritte

    • MCU-Skizze hochladen: Verwenden Sie die Bridge-MCU-Skizze aus dem vorherigen Abschnitt (laden Sie sie zuerst hoch, falls nicht bereits geschehen).
    • Telegram-Skript einfügen: Kopieren Sie den Python-Code oben in die Python-Registerkarte Ihrer App in Arduino App Lab.
    • Ihr Token setzen: Ersetzen Sie YOUR_BOT_TOKEN im Skript durch Ihr echtes Bot-Token.
    • App ausführen: Klicken Sie auf Run — der Bot beginnt sofort, auf Telegram-Nachrichten zu lauschen.
    • Testen Sie es: Drücken Sie den Button 5 Mal, senden Sie dann /count auf Telegram — Sie sollten 5 erhalten. Senden Sie dann /reset und /count erneut, um zu bestätigen, dass es zurückgesetzt wird.
    • Pro-Tipp: Verwenden Sie dies als Ereigniszähler zum Zählen von Besuchern, Maschinenzyklen oder ausgelösten Warnungen.

    App Lab Konsolenausgabe

    DIYables_Apps
    Stop
    sketch.ino
    1#include "Arduino_RouterBridge.h"
    Serial Monitor
    Python
    [2026-04-29 12:00:01] Telegram: /count [2026-04-29 12:00:01] Button pressed 5 time(s) since last reset [2026-04-29 12:01:30] Telegram: /reset [2026-04-29 12:01:30] Press count reset to 0 [2026-04-29 12:01:45] Telegram: /count [2026-04-29 12:01:45] Button pressed 0 time(s) since last reset
    Telegram
    Telegram 12:45
    Welcome to Telegram!
    ArduinoBot 10:19
    Chatting with Arduino...
    telegram-botfather
    BotFather Yesterday
    Your bot has been created.

    ArduinoBot

    bot
    Today
    /count
    10:15 AM ✓✓
    Button pressed 5 time(s) since last reset
    10:16 AM
    /reset
    10:17 AM ✓✓
    Press count reset to 0
    10:18 AM
    /count
    10:19 AM ✓✓
    Button pressed 0 time(s) since last reset
    10:20 AM

    OpenClaw-Integration

    Sie können die OpenClaw diesem Tutorial anpassen, indem Sie sich auf die Anleitung im Tutorial Arduino Uno Q - OpenClaw beziehen

    Ideen für Anwendungen/Projekte

    • Besucherzähler: Platzieren Sie einen Button an einer Tür — die Druckzahl verfolgt, wie viele Personen eingetreten sind
    • Maschinenzyklusszähler: Zählen Sie Aktuator-Zyklen in einer Produktionslinie, überprüfen Sie die Zahl über Telegram
    • Manuelles Ereignisprotokoll: Drücken Sie den Button, um ein zeitgestempeltes Ereignis auf der Linux-Seite (MPU hat echte Uhr) zu protokollieren
    • Multi-Mode-Controller: Jeder Button-Druck wechselt zum nächsten Modus; überprüfen Sie den Modus über Telegram
    • Zum-Bestellen-Drücken: Drücken Sie den Button, um eine Telegram-"Nachbestellung"-Nachricht für Vorräte zu senden

    Fordern Sie sich selbst heraus

    • Einfach: Ändern Sie die Bridge-Skizze, um auch zu verfolgen, wie oft der Button losgelassen wurde
    • Mittel: Fügen Sie eine get_last_press_time()-Bridge-Funktion hinzu, die die Anzahl der Sekunden seit dem letzten Druck zurückgibt
    • Fortgeschritten: Erstellen Sie einen Telegram-Bot, der automatisch eine Nachricht sendet, wenn die Druckzahl eine Zielzahl erreicht (z. B. "10 Drücke erreicht!")

    Funktionsreferenzen

    ※ UNSERE NACHRICHTEN

    • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!