Minuterie de compte a rebours Arduino

Minuterie de compte à rebours Arduino avec des boutons poussoirs ou un encodeur et un écran LCD 1602 I2C est un projet intéressant et utile. Voyons quelques variantes de minuterie avec compte à rebours sur Arduino Nano ou Uno qui peuvent être utilisées dans une cuisine ou un aquarium pour allumer une lumière et une indication sonore ou un relais depuis Arduino. Et vous pourrez choisir vous-même la variante la plus adaptée de ce projet.


Ce dont vous aurez besoin

  • Arduino Uno / Arduino Nano / Arduino Mega;
  • écran LCD 1602 I2C
  • bouton-poussoir / une encodeur
  • passif ou actif buzzer
  • breadboard et fils de connexion
  • librairies LiquidCrystal_I2C.h et RotaryEncoder.h.

Matériel supplémentaire sur ce sujet:

  1. Jeu Arduino avec afficheur LCD 1602 I2C
  2. Branchement ecran LCD 1602 I2C Arduino
  3. Branchement encodeur rotatif KY-040 Arduino

Créer simple chronomètre à base Arduino

Afin de comprendre le fonctionnement de la fonction Arduino millis(), montrons un exemple de programme compteur avec sortie de l’heure sur le port série. La commande millis permet une exécution de programme sans délai et le multitâche pendant l’exécution du programme Arduino. Le timing commence immédiatement après le chargement du programme chrono dans le microcontrôleur Arduino Uno ou l’ouverture du port série de l’IDE Arduino.

Programme pour chronomètre simple avec Arduino

// variables pour le comptage des minutes et des secondes
int SEC = 0;
int MIN = 0;
unsigned long timer;

void setup() {
   Serial.begin(9600);
   timer = millis();
}

void loop() {
   // si 995 ms se sont écoulées - ajouter une seconde à la variable SEC
   // si 60 secondes se sont écoulées, ajoutez une minute.
   if (millis() - timer > 995) {
      timer = millis();
      SEC = SEC + 1;
      if (SEC > 60) { SEC = 1; MIN = MIN + 1; }
      Serial.println(String(MIN) + " : " + String(SEC));
   }
}

Explication du code pour chronomètre avec Arduino:

  1. une seconde est ajoutée après 995 millisecondes, puisque les autres opérations prennent quelques millisecondes;
  2. si chronomètre Arduino se précipite, augmentez le nombre de millisecondes dans la condition.

Minuterie de compte à rebours avec boutton

Schema d'un timer Arduino avec boutons
Schéma d’assemblage d’un timer Arduino avec boutons
LCD 1602 i2c Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
VCC 5V 5V 5V
SDA A4 A4 20
SCL A5 A5 21

La première variante du projet est un timer Arduino avec commande par bouton. En cliquant sur le premier et le deuxième bouton, vous pouvez augmenter et diminuer l’intervalle de temps en minutes. Un clic sur le troisième bouton, connecté à la broche 6 de l’Arduino Nano, lance le compte à rebours. A la fin du compte à rebours, la LED s’allume et le buzzer se met en marche. Le quatrième bouton, connecté à la broche 8, est utilisé pour réinitialiser la minuterie.

Vous pouvez également arrêter le minuteur à tout moment en appuyant sur le troisième bouton-poussoir. Après avoir assemblé le schéma de câblage, téléchargez l’exemple de programme de minuterie suivant sur l’Arduino. Notez que pour faire fonctionner l’horloge sur un écran avec un module I2C, vous devrez installer la bibliothèque Arduino LiquidCrystal_I2C.

Programme Arduino pour minuterie avec boutton-poussoir

#include "Wire.h"
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C LCD(0x27, 16, 2);

boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button3WasUp = true;
boolean button4WasUp = true;

byte w = 0;

int SEC = 0;
int MIN = 0;
unsigned long timer;

void setup() {
   pinMode(2, INPUT_PULLUP);
   pinMode(4, INPUT_PULLUP);
   pinMode(6, INPUT_PULLUP);
   pinMode(8, INPUT_PULLUP);

   pinMode(10, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(10, HIGH);

   LCD.init();
   LCD.backlight(); 

   LCD.setCursor(2, 0);
   LCD.print("TIMER  STOP");
   LCD.setCursor(5, 1);
   LCD.print(MIN);
   LCD.print(" : ");
   LCD.print(SEC);
}

void loop() {
   boolean button1IsUp = digitalRead(2);
   boolean button2IsUp = digitalRead(4);
   boolean button3IsUp = digitalRead(6);
   boolean button4IsUp = digitalRead(8);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(2);
      if (!button1IsUp) {
         MIN = MIN - 1; SEC = 0;
         if (MIN < 0) { MIN = 0; }
         LCD.clear(); 
         LCD.setCursor(2, 0); 
         LCD.print("TIMER STOP"); 
         LCD.setCursor(5, 1); 
         LCD.print(MIN); 
         LCD.print(" : "); 
         LCD.print(SEC);
      }
   } 
   button1WasUp = button1IsUp;
   
   if (button2WasUp && !button2IsUp) {
      delay(10); 
      button2IsUp = digitalRead(4); 
      if (!button2IsUp) { 
         MIN = MIN + 1; SEC = 0; 
         LCD.clear(); 
         LCD.setCursor(2, 0); 
         LCD.print("TIMER STOP"); 
         LCD.setCursor(5, 1); 
         LCD.print(MIN); 
         LCD.print(" : "); 
         LCD.print(SEC);
      }
   } 
   button2WasUp = button2IsUp;

   if (button3WasUp && !button3IsUp && MIN > 0) {
      delay(10);
      button3IsUp = digitalRead(6);
      if (!button3IsUp) {
         if (SEC == 0) { SEC = 60; MIN = MIN - 1; }
         if (MIN < 0 ) { MIN = 0; }
         digitalWrite(10, LOW);
         w = 1;
      }
   }
   button3WasUp = button3IsUp;

   if (button4WasUp && !button4IsUp) {
      delay(10);
      button4IsUp = digitalRead(8);
      if (!button4IsUp) {
         MIN = 0; SEC = 0;
         digitalWrite(10, HIGH);
         LCD.clear();
         LCD.setCursor(2, 0);
         LCD.print("TIMER STOP");
         LCD.setCursor(5, 1);
         LCD.print(MIN);
         LCD.print(" : ");
         LCD.print(SEC);
      }
   }
   button4WasUp = button4IsUp;

   while (w == 1 ) {
      if (millis() - timer > 995) {
         timer = millis();
         SEC = SEC - 1;

         if (SEC == 0 && MIN == 0) {
            LCD.clear();
            LCD.setCursor(2, 0);
            LCD.print("TIMER  STOP");
            LCD.setCursor(5, 1);
            LCD.print(MIN);
            LCD.print(" : ");
            LCD.print(SEC);
            digitalWrite(10, HIGH);
            tone(12, 100);
            delay(500);
            noTone(12);
            w = 0;
         }

         if (SEC == 0) {
            SEC = 59; MIN = MIN - 1;
            if (MIN < 0 ) { MIN = 0; }
         }

         if (w == 1) {
            LCD.clear();
            LCD.setCursor(2, 0);
            LCD.print("TIMER START");
            LCD.setCursor(5, 1);
            LCD.print(MIN);
            LCD.print(" : ");
            LCD.print(SEC);
         }
     }
 
     boolean button3IsUp = digitalRead(6);
     if (button3WasUp && !button3IsUp) {
        delay(10);
        button3IsUp = digitalRead(6);
        if (!button3IsUp) {
           LCD.setCursor(2, 0);
           LCD.print("TIMER  STOP");
           w = 0;
        }
     }
     button3WasUp = button3IsUp; 
   }
}

Explication du code pour minuterie avec boutton-poussoir (arduino timer):

  1. dans la boucle while, une seconde est soustraite après 995 millisecondes, car d’autres opérations prennent quelques millisecondes;
  2. le compte à rebours ne peut être réinitialisé qu’en arrêtant le compte à rebours.

Minuterie de compte à rebours avec encodeur

Schema minuterie de compte a rebours avec encoder
Schéma minuterie de compte à rebours avec encoder

Nous allons maintenant voir comment réaliser un timer sur Arduino avec encodeur et l’afficher LCD. Le principe de contrôle est similaire au précédent. En tournant le bouton de l’encodeur, vous pouvez régler l’intervalle de temps requis, et en appuyant sur le bouton, vous pouvez démarrer et arrêter le compte à rebours. Voici le schéma de l’assemblage du projet sur Arduino Nano, ce projet peut également être assemblé sur la carte Arduino Uno.

Programme Arduino pour minuterie avec encodeur

#include "Wire.h"
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C LCD(0x27, 20, 2);

#include "RotaryEncoder.h"
RotaryEncoder encoder(4, 2);

#define STEPS  1
#define POSMIN 0
#define POSMAX 30

int lastPos, newPos;
boolean buttonWasUp = true;

byte w = 0;

int SEC = 0;
int MIN = 0;
unsigned long timer;

void setup() {
   pinMode(6, INPUT_PULLUP);
   encoder.setPosition(0 / STEPS);

   pinMode(10, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(10, HIGH);

   LCD.init();
   LCD.backlight();

   LCD.setCursor(2, 0);
   LCD.print("TIMER  STOP");
   LCD.setCursor(5, 1);
   LCD.print(MIN);
   LCD.print(" : ");
   LCD.print(SEC);
}

void loop() {

   encoder.tick();
   newPos = encoder.getPosition() * STEPS;
   if (newPos < POSMIN) {
      encoder.setPosition(POSMIN / STEPS);
      newPos = POSMIN;
   }
   else if (newPos > POSMAX) {
      encoder.setPosition(POSMAX / STEPS);
      newPos = POSMAX;
   }

   if (lastPos != newPos) {
      MIN = newPos;
      lastPos = newPos;
      LCD.clear();
      LCD.setCursor(2, 0);
      LCD.print("TIMER  STOP");
      LCD.setCursor(5, 1);
      LCD.print(MIN);
      LCD.print(" : ");
      LCD.print(SEC);
   }

   boolean buttonIsUp = digitalRead(6);
   if (buttonWasUp && !buttonIsUp && MIN > 0) {
      delay(10);
      buttonIsUp = digitalRead(6);
      if (!buttonIsUp) {
         if (SEC == 0) { SEC = 60; MIN = MIN - 1; }
         if (MIN < 0 ) { MIN = 0; }
         digitalWrite(10, LOW);
         w = 1;
      }
   }
   buttonWasUp = buttonIsUp;

   while (w == 1 ) {
      if (millis() - timer > 993) {
         timer = millis();
         SEC = SEC - 1;
 
      if (SEC == 0 && MIN == 0) {
         lastPos = 0; newPos = 0; MIN = 0; SEC = 0;
         LCD.clear();
         LCD.setCursor(2, 0);
         LCD.print("TIMER  STOP");
         LCD.setCursor(5, 1);
         LCD.print(MIN);
         LCD.print(" : ");
         LCD.print(SEC);
         digitalWrite(10, HIGH);
         tone(12, 100);
         delay(500);
         noTone(12);
         w = 0;
      }

      if (SEC == 0 && w==1) {
         SEC = 59; MIN = MIN - 1;
         if (MIN < 0 ) { MIN = 0; }
      }

      if (w == 1) {
         LCD.clear();
         LCD.setCursor(2, 0);
         LCD.print("TIMER START");
         LCD.setCursor(5, 1);
         LCD.print(MIN);
         LCD.print(" : ");
         LCD.print(SEC);
      }
    }

    buttonIsUp = digitalRead(6);
    if (buttonWasUp && !buttonIsUp) {
       delay(10);
       buttonIsUp = digitalRead(6);
       if (!buttonIsUp) {
          lastPos = 0; newPos = 0; MIN = 0; SEC = 0;
          LCD.clear();
          LCD.setCursor(2, 0);
          LCD.print("TIMER  STOP");
          LCD.setCursor(5, 1);
          LCD.print(MIN);
          LCD.print(" : ");
          LCD.print(SEC);
          digitalWrite(10, HIGH);
          w = 0;
       }
    }
    buttonWasUp = buttonIsUp;
  }
}

Explication du code pour minuterie avec encodeur (timer arduino):

  1. la fréquence du buzzer Arduino peut être modifiée avec la commande tone();
  2. la bibliothèque RotaryEncoder doit être installée pour que le programme fonctionne.

Conclusion. Cette revue ne présente que deux options pour fabriquer de ses propres mains une horloge avec minuterie pour un aquarium ou une cuisine. Dans les commentaires, vous pouvez laisser des questions sur ce projet (s’il y en a) ou proposer votre propre version du projet avec un compte à rebours, que vous pouvez ajouter à cette critique.





7 Replies to “Minuterie de compte à rebours Arduino (chronometre)”

  1. Bonjour je voulais savoir dans le programme avec l’encodeur il n’y a pas de bouton poussoir mais dans la description il disent qu’il faut appuyer sur un bouton??
    Merci

  2. Bonjour, il faudrait spécifier pour les futurs utilisateurs que le brochage sur une MEGA2560 R3 est différent d’une NANO ou d’une UNO et s’effectue sur les sorties de communication 20 et 21 (SDA & SCL). Sinon ça fonctionne et je vous remercie.
    Bonne continuation. Paul

  3. Il y a un bug de celui a 4 bouton. On en peut pas faire pause s’il reste moins de 1 minute au chrono.

  4. Bonjour je débute dans l’arduino, je voudrais faire pour mon club de tir un compte à rebours, avec deux affichages écarté de 20m sans possibilité de les relier par câble est possible de réaliser un montage comme ça (bluethoo, wifi radio?
    Merci de votre aide

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. Découvrez comment les données de vos commentaires sont traitées.