Arduino UNO Q - Anti-rebond du Bouton

Lors de la programmation de l'Arduino UNO Q pour détecter un appui sur un bouton, un seul appui peut être détecté plusieurs fois. Cela se produit parce que les contacts mécaniques rebondissent rapidement entre LOW et HIGH — un phénomène appelé chattering (rebond). Ce tutoriel vous montre comment le corriger grâce à l'anti-rebond (debouncing).

Phénomène de chattering sur Arduino UNO Q
Arduino UNO Q - Anti-rebond du Bouton

Matériel Requis

1×Arduino UNO Q
1×USB Cable for Arduino Uno Q
1×Bouton avec capuchon pour plaque d'essai
1×Kit bouton pour plaque d'essai
1×Bouton poussoir pour montage sur panneau
1×Module bouton poussoir
1×Plaque d'essai
1×Fils de connexion
1×Recommandé: Shield à bornier à vis pour Arduino Uno
1×Recommandé: Sensors/Servo Expansion Shield for Arduino Uno
1×Recommandé: Shield plaque d'essai pour Arduino Uno
1×Recommandé: Boîtier pour Arduino Uno
1×Recommandé: Kit plaque de base prototypage et plaque d'essai pour Arduino Uno

Ou vous pouvez acheter les kits suivants:

1×Kit de Capteurs DIYables (18 capteurs/écrans)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À Propos du Bouton

Apprenez-en plus sur les boutons (brochage, câblage, fonctionnement) dans le Arduino UNO Q - Bouton.

Schéma de Câblage

Schéma de câblage Arduino UNO Q Bouton

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

Code MCU — Sans Anti-rebond (Pour Comparaison)

L'Arduino UNO Q dispose de deux processeurs : le MCU STM32 (gère le contrôle matériel en temps réel) et le MPU Qualcomm (exécute Debian Linux). Dans cette section, seul le MCU STM32 est programmé — le côté Linux reste inactif. Une section ultérieure montrera comment les deux processeurs fonctionnent ensemble.

Voici la version sans anti-rebond du Arduino UNO Q - Bouton. Remarquez comment un seul appui peut enregistrer plusieurs événements :

/* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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; }

Étapes Rapides

  • Première utilisation de l'Arduino UNO Q ? Suivez le tutoriel Démarrer avec Arduino UNO Q pour préparer votre environnement de développement avant de continuer.
  • Câbler le bouton : Connectez une broche du bouton à GND et l'autre à la broche 7 selon le schéma de câblage.
  • Connecter : Branchez l'Arduino UNO Q sur votre ordinateur avec un câble USB-C.
  • Ouvrir Arduino App Lab : Lancez Arduino App Lab et attendez qu'il détecte votre Arduino UNO Q.
  • Créer une nouvelle application : Cliquez sur le bouton Créer une nouvelle application.
Créer une nouvelle application dans Arduino App Lab sur Arduino UNO Q
  • Donnez un nom à l'application, par exemple : DIYables_ButtonDebounce
  • Cliquez sur Créer pour confirmer.
  • Un ensemble de dossiers et de fichiers sera généré dans votre nouvelle application.
Dossiers et fichiers de l'application Arduino App Lab sur Arduino UNO Q
  • Trouvez le fichier sketch/sketch.ino — c'est là que vous collerez le programme MCU.
  • Coller le programme : Copiez le code sans anti-rebond ci-dessus et collez-le dans le fichier de programme. Laissez les autres fichiers par défaut.
  • Téléverser : Cliquez sur le bouton Exécuter dans Arduino App Lab pour compiler et téléverser sur le STM32.
  • Cliquer sur le bouton Exécuter dans Arduino App Lab sur Arduino UNO Q
    • Appuyez une fois sur le bouton puis relâchez-le — observez que plusieurs événements peuvent être enregistrés (visible via le Moniteur Bridge dans la section suivante).
    • Remarque : C'est l'effet de chattering — la section suivante y remédie.

    Code MCU — Avec Anti-rebond (Utilisant millis)

    Cette version utilise millis() pour attendre que le signal se stabilise avant de le traiter comme un véritable événement. Seuls les changements d'état qui persistent plus de DEBOUNCE_TIME millisecondes sont acceptés :

    /* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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; } }
    • Fonctionnement : Si l'état du bouton change rapidement (rebond), le timer se réinitialise à chaque fois. Ce n'est que lorsque l'état est stable pendant 50ms qu'il est traité comme un véritable appui ou relâchement.
    • Conseil : Si votre bouton affiche toujours plusieurs événements, essayez d'augmenter DEBOUNCE_TIME à 75 ou 100.

    ※ Note:

    Le DEBOUNCE_TIME optimal dépend de la qualité du bouton et de l'application. 50ms est une valeur par défaut sûre pour la plupart des boutons poussoirs.

    Anti-rebond Simplifié avec la Bibliothèque ezButton

    Pour les débutants et les projets multi-boutons, nous avons créé la bibliothèque ezButton — elle gère INPUT_PULLUP, l'anti-rebond et la détection de front automatiquement.

    Bouton unique avec ezButton :

    /* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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
    • Fonctionnement : button.loop() doit être appelé à chaque cycle de boucle. Ensuite, button.isPressed() retourne true exactement une fois par appui physique, et button.isReleased() retourne true exactement une fois par relâchement — aucun chattering.

    Plusieurs boutons avec ezButton (trois boutons sur les broches 6, 7, 8) :

    Schéma de câblage Arduino UNO Q Plusieurs Boutons

    Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

    /* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino-uno-q/arduino-uno-q-button-debounce */ #include <ezButton.h> ezButton button_1(6); // objet ezButton sur la broche 6 ezButton button_2(7); // objet ezButton sur la broche 7 ezButton button_3(8); // objet ezButton sur la broche 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()) { /* action bouton 1 appuyé */ } if (button_1.isReleased()) { /* action bouton 1 relâché */ } if (button_2.isPressed()) { /* action bouton 2 appuyé */ } if (button_2.isReleased()) { /* action bouton 2 relâché */ } if (button_3.isPressed()) { /* action bouton 3 appuyé */ } if (button_3.isReleased()) { /* action bouton 3 relâché */ } }

    Programmation Bridge Linux + MCU

    L'Arduino UNO Q dispose de deux processeurs fonctionnant ensemble : le MPU (Qualcomm, exécute Debian Linux) et le MCU (STM32, exécute Zephyr OS avec votre programme Arduino). Ils communiquent via RPC grâce à la bibliothèque Arduino_RouterBridge — jamais via des ports série bruts.

    • Le bouton est connecté au MCU (STM32) — câblé à une broche d'entrée numérique du STM32. Le MCU lit et élimine les rebonds des appuis sur le bouton en utilisant la bibliothèque ezButton.
    • Le MPU ne peut pas lire le bouton directement — il doit demander des données au MCU via Bridge.call(). Le MCU répond avec le nombre d'appuis ou le réinitialise.
    • Le MPU dispose du Wi-Fi — car le MPU exécute Debian Linux complet avec Wi-Fi, il peut rapporter les nombres d'appuis via Telegram et accepter des commandes de réinitialisation à distance.
    • Communication : Bridge.call() côté Linux invoque Bridge.provide() côté MCU
    • ⚠️ Réservé : /dev/ttyHS1 (Linux) et Serial1 (MCU) sont utilisés par le routeur Arduino — ne les ouvrez jamais directement

    En résumé : Le MCU élimine les rebonds et compte les appuis → le MPU demande le compteur → le MPU le transmet via Telegram.

    Programme MCU — anti-rebond bouton avec compteur d'appuis et Bridge :

    /* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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"); }

    Script Python (Arduino App Lab) — interrogation du compteur d'appuis depuis Linux :

    /* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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)
    • Remarque : Assurez-vous que Bridge.begin() est appelé dans le programme MCU et que le programme est téléversé avant d'exécuter le script Python côté Linux.
    • ⚠️ Avertissement : N'ouvrez jamais directement /dev/ttyHS1 (sous Linux) ou Serial1 (sur MCU) dans votre code — ces ports sont réservés par le routeur Arduino et y accéder brisera le Bridge.

    Étapes Rapides

    • Téléversez le programme MCU : Ouvrez Arduino App Lab, créez une nouvelle application, collez le programme MCU Bridge ci-dessus dans sketch/sketch.ino, installez les bibliothèques ezButton et Arduino_RouterBridge, puis cliquez sur Exécuter.
    • Ajoutez le script Python : Collez le code Python ci-dessus dans l'onglet Python de la même application.
    • Exécutez l'application : Cliquez sur Exécuter — le côté Python interroge le compteur d'appuis toutes les 3 secondes.
    • Appuyez sur le bouton plusieurs fois.
    • Vérifiez la console : Ouvrez l'onglet Console → sous-onglet Moniteur MCU pour voir les événements d'appui/relâchement. Ouvrez le sous-onglet Console Python pour voir le compteur interrogé.

    Sortie de la Console App Lab

    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

    Intégration Telegram

    Vous pouvez interroger le nombre d'appuis sur le bouton ou le réinitialiser depuis n'importe où via Telegram.

    Si vous n'avez pas encore de bot Telegram, consultez Arduino UNO Q - Bot Telegram pour obtenir votre token de bot avant de continuer.

    Programme MCU : Conservez le même programme MCU de la section Bridge précédente — aucune modification nécessaire. Assurez-vous qu'il est déjà téléversé et en cours d'exécution sur le STM32 avant de continuer.

    Script Python (Arduino App Lab) — bot Telegram pour le suivi des appuis sur le bouton :

    /* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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)
    • Remarque : Remplacez YOUR_BOT_TOKEN par le token obtenu depuis @BotFather sur Telegram.
    • Envoyez /count pour voir combien de fois le bouton a été appuyé depuis la mise sous tension ou la dernière réinitialisation.
    • Envoyez /reset pour réinitialiser le compteur à 0.

    Étapes Rapides

    • Téléversez le programme MCU : Utilisez le programme MCU Bridge de la section précédente (téléversez-le d'abord s'il ne l'est pas déjà).
    • Collez le script Telegram : Copiez le code Python ci-dessus dans l'onglet Python de votre application dans Arduino App Lab.
    • Définissez votre token : Remplacez YOUR_BOT_TOKEN dans le script par votre vrai token de bot.
    • Exécutez l'application : Cliquez sur Exécuter — le bot commence à écouter les messages Telegram immédiatement.
    • Testez : Appuyez sur le bouton 5 fois, puis envoyez /count sur Telegram — vous devriez recevoir 5. Envoyez ensuite /reset et /count à nouveau pour confirmer la réinitialisation.
    • Conseil : Utilisez ceci comme compteur d'événements pour compter les visiteurs, les cycles de machine ou les alertes déclenchées.

    Sortie de la Console App Lab

    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

    Intégration d'OpenClaw

    Vous pouvez adapter OpenClaw à ce tutoriel en vous référant aux instructions du tutoriel Arduino UNO Q - OpenClaw.

    Idées d'Applications / Projets

    • Compteur de visiteurs : Placez un bouton à une porte — le compteur d'appuis suit le nombre de personnes entrées
    • Compteur de cycles de machine : Comptez les cycles d'actionneur dans une ligne de production, vérifiez le compteur via Telegram
    • Journal d'événements manuel : Appuyez sur le bouton pour enregistrer un événement horodaté côté Linux (le MPU a une vraie horloge)
    • Contrôleur multi-mode : Chaque appui sur le bouton passe au mode suivant ; vérifiez le mode via Telegram
    • Appuyer pour commander : Appuyez sur le bouton pour envoyer un message Telegram de "réapprovisionnement" pour des fournitures

    ※ NOS MESSAGES

    • N'hésitez pas à partager le lien de ce tutoriel. Cependant, veuillez ne pas utiliser notre contenu sur d'autres sites web. Nous avons investi beaucoup d'efforts et de temps pour créer ce contenu, veuillez respecter notre travail !