Code de recherche

Leçon 14/31-3 : Exemple 3 de codage Arduino millis() avec bouton poussoir

Leçon 14/31-3 : Exemple 3 de codage Arduino millis() avec bouton poussoir

Avez-vous déjà eu besoin que votre Arduino se souvienne quand quelque chose s'est produit—comme une pression de bouton—puis agisse une durée précise plus tard, tout en laissant le reste de votre programme fonctionner sans accroc ? C'est un défi classique en programmation Arduino, et la solution est la fonction millis(). Ce tutoriel, faisant partie du cours Arduino Robojax, démontre un exemple pratique : détecter si un bouton poussoir est pressé une seconde fois après qu'un délai de 5 secondes se soit écoulé depuis la première pression. Cette technique est fondamentale pour créer des projets réactifs et non bloquants où le timing est crucial.

Voiture Sunfounder assemblée

Ce modèle d'utilisation de millis() pour suivre le temps sans interrompre le programme est essentiel pour une large gamme d'applications réelles. Voici quelques idées pour inspirer vos propres projets :

  • Interfaces de boutons avec anti-rebond : Implémentez un système où un bouton doit être maintenu enfoncé pendant une durée spécifique (par exemple, 3 secondes) pour allumer un appareil, évitant ainsi les pressions accidentelles.
  • Actions séquentielles : Créez un système où un événement, comme le déclenchement d'un capteur de mouvement, arme une action secondaire qui ne se produit que si un autre événement survient dans une fenêtre de temps donnée.
  • Minuteries d'interaction utilisateur : Construisez un projet qui nécessite une entrée de « confirmation » (comme une seconde pression de bouton) dans un délai défini pour exécuter une fonction critique, telle que l'envoi d'une commande ou le démarrage d'un moteur.
  • Filtrage de capteurs : Utilisez un premier signal d'un capteur pour démarrer une fenêtre de temps, pendant laquelle la lecture d'un second capteur différent est considérée comme valide ou est ignorée.

Matériel requis

Ce projet utilise des composants du kit Arduino 3-en-1 SunFounder, qui est une excellente ressource pour apprendre. Vous aurez besoin de :

  • Carte Arduino (Uno, Nano, etc.)
  • Un bouton poussoir momentané
  • Fils de connexion

Guide de câblage

Le câblage pour cet exemple est très simple, grâce aux résistances de tirage internes de l'Arduino, ce qui élimine le besoin d'une résistance externe. (Dans la vidéo à 08:29)

  • Connectez une patte du bouton poussoir à la broche GND de l'Arduino.
  • Connectez l'autre patte du bouton poussoir à la broche numérique 2 de l'Arduino.

En utilisant INPUT_PULLUP, la broche est connectée en interne à 5V, donc elle lit HIGH normalement. Lorsque le bouton est pressé, il connecte la broche à GND, ce qui la fait lire LOW. C'est la logique que nous utiliserons dans le code.

Explication du code

Le cœur de ce projet est la logique qui suit la première pression du bouton, puis vérifie une seconde pression après un intervalle de temps spécifique. Le code est conçu pour être non bloquant, ce qui signifie qu'il ne mettra pas en pause l'exécution d'autres tâches dans votre loop().

En haut du croquis, vous trouverez les variables clés configurables par l'utilisateur qui contrôlent le comportement temporel :

unsigned long event = 5000;// 5 secondes
unsigned long buttonPushed =0;
  • event : C'est la variable de timing cruciale. Elle définit la durée du délai en millisecondes. Dans cet exemple, elle est définie sur 5000, ce qui équivaut à 5 secondes. Vous pouvez modifier cette valeur pour toute autre durée selon les besoins de votre projet.
  • buttonPushed : Cette variable est utilisée comme un indicateur et un horodatage. Elle commence à 0 et est mise à jour avec la valeur de millis() la première fois que le bouton est pressé. Ce temps stocké est ensuite utilisé pour calculer la différence pour la vérification de la seconde pression.

La logique dans la fonction loop() fonctionne en deux étapes. D'abord, elle lit l'état du bouton et, s'il est pressé pour la première fois (pb == LOW && buttonPushed == 0), elle enregistre le temps actuel via millis() dans la variable buttonPushed. La seconde étape vérifie si le bouton est toujours pressé et si une première pression a été enregistrée. Si c'est le cas, elle calcule la différence de temps entre le temps actuel et le temps de la première pression. Si cette différence est supérieure ou égale à votre temps event, elle exécute l'action—dans ce cas, imprimer un message sur le moniteur série.

Démonstration du projet en direct

Dans la vidéo, le code est téléversé sur l'Arduino, et le moniteur série est ouvert pour observer le comportement. (Dans la vidéo à 16:03) Vous verrez la valeur de millis() s'imprimer en continu, montrant le temps écoulé depuis le démarrage du programme. Lorsque vous pressez le bouton pour la première fois, un message comme First push at:5019 est imprimé. Si vous pressez le bouton à nouveau et le maintenez enfoncé pendant plus de 5 secondes depuis la première pression, le message Action after 5 seconds of first push est imprimé. Cela démontre que l'action n'est déclenchée que lorsque la seconde pression se produit après que le délai spécifié se soit écoulé.

La puissance de cette approche est que la ligne Serial.println(millis()) en haut de la boucle continue de s'exécuter sans interruption, prouvant que la logique de timing ne bloque pas l'exécution d'autres codes. C'est l'avantage fondamental d'utiliser millis() plutôt que la fonction delay().

Projets connexes de cette vidéo

Chapitres

  • [00:00] Introduction à millis() et au cours
  • [01:19] Qu'est-ce que millis() et pourquoi l'utiliser ?
  • [03:06] Premier exemple pratique : affichage de millis()
  • [05:46] Utilisation de millis() pour déclencher un événement après 5 secondes
  • [08:29] Exemple 2 : Action sur bouton poussoir avec un délai de 5 secondes
  • [12:14] Exemple 3 : Détection d'une seconde pression sur le bouton après un délai
  • [17:20] Introduction à la fonction map()
  • [19:47] Exemple pratique de mappage des pourcentages de luminosité des LED

Images

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
918-Lesson 14/31-3: Arduino coding millis() example 3 with push button
Langue: C++
/*
Lesson 14/31: Arduino coding millis() example 3 with push button
Get this code and watch video Download and resource page https://robojax.com/RJT597
YouTube video https://www.youtube.com/watch?v=lqgzQohNiIM
 
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */


unsigned long event = 5000;// 5 seconds
unsigned long buttonPushed =0;

void setup() {
  Serial.begin(9600);//initialize serial monitor
  Serial.println("Introduction to millis");
  pinMode(2,INPUT_PULLUP);
  


}

void loop() {
  // ilmoFan.com example-2 millis()
  Serial.println(millis());
  int pb = digitalRead(2);// read pin 2
  if(pb ==LOW && buttonPushed ==0)
  {
    buttonPushed =millis();
    Serial.print("First push at:");
    Serial.println(buttonPushed);
  }
  if( pb ==LOW &&  buttonPushed >0 )
  {
   unsigned long difference = millis()- buttonPushed;
      if( difference >= event)
      {
        Serial.println("Action after 5 seconds of first push");
      }
  }
  
}

Fichiers📁

Manuel de l'Utilisateur