Arduino Horloge sans module RTC

Horloge Arduino sans RTC module d’horloge en temps réel (Real Time Clock) avec sortie vers un afficheur LCD 1602 i2c – ce projet permet de régler l’heure (heures et minutes) et l’heure de l’alarme. Pour cela, on utilise deux boutons-poussoir d’horloge (pour changer les modes de réglage) et le buzzer de l’Arduino pour le signal sonore. Le projet contient un schéma de l’assemblage du dispositif ainsi qu’un programme de la carte Arduino de travail.


Ce dont vous aurez besoin

Matériel supplémentaire sur ce sujet:

  1. Jeu Arduino avec afficheur LCD 1602 I2C
  2. Comment faire caractère spécial sur LCD 1602
  3. Branchement ecran LCD 1602 I2C avec Arduino

Horloge Arduino LCD 16×02 sans module RTC

Ce projet nécessite un minimum de pièces: un écran 1602 avec module i2c (vous pouvez connecter un écran sans i2c si vous le souhaitez), deux boutons d’horloge et un haut-parleur piézo. Les boutons sont connectés aux broches du microcontrôleur Arduino configuré en mode INPUT_PULLUP – avec cette méthode de connexion, vous pouvez lire le nombre de pressions sur le bouton, et aucune résistance n’est nécessaire pour l’assemblage.

Schéma de câblage horloge sans module RTC

Projet horloge simple avec Arduino sans RTC
Projet horloge simple avec Arduino sans RTC
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

Si vous utilisez un Arduino Mega, sur cette carte, les ports SDA et SCL pour la connexion de l’écran sont situés sur les broches 20 et 21. La carte Arduino Nano a le même brochage que l’Uno et le LCD 1602 est connecté aux broches A4 (SDA) et A5 (SCL). Le réveil émet un bip pendant 1 minute et vous pouvez appuyer sur le bouton connecté au port 8 pour l’éteindre. Après avoir assemblé le schéma de câblage, chargez le programme suivant dans la carte.

Programme Arduino pour horloge sans module RTC

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

// valeurs initiales de l'heure et du réveil
byte SEC = 0;
byte MIN = 34;
byte HOUR = 12;
byte MIN_A = 35;
byte HOUR_A = 12;
unsigned long timer;

boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button1IsUp;
boolean button2IsUp;

boolean alarm = true;
byte c1, c2, c3, w, i;

// icône d'alarme
byte bell [8] = {
  0b11000,
  0b11110,
  0b01100,
  0b01000,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
};

void setup() {
  pinMode(9, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(5, OUTPUT);
  LCD.init();
  LCD.backlight();
  LCD.createChar(1, bell);
  timer = millis();
}

void loop() {
  button1IsUp = digitalRead(9);
  button2IsUp = digitalRead(8);

  if (button1WasUp && !button1IsUp) {
    delay(10);
    button1IsUp = digitalRead(9);
    if (!button1IsUp) {
      SEC = 0; w = 1;
    }
  }
  button1WasUp = button1IsUp;

  if (button2WasUp && !button2IsUp) {
    delay(10);
    button2IsUp = digitalRead(8);
    if (!button2IsUp) {
      alarm = false;
    }
  }
  button2WasUp = button2IsUp;

  if (millis() - timer > 1000) {
    timer = millis();
    SEC++;
    if (SEC > 59) { SEC = 0; MIN++; }
    if (MIN > 59) { MIN = 0; HOUR++; }
    if (HOUR > 23) { HOUR = 0; }
    if (alarm == true && HOUR == HOUR_A && MIN == MIN_A && i < 60) {
      tone(5, 50); i++;
    }
    if (i >= 60) {
      noTone(5); alarm == false; i = 0;
    }

    if (HOUR < 10) { c1 = 5; }
    if (HOUR >= 10) { c1 = 4; }
    if (MIN < 10) { c2 = 8; }
    if (MIN >= 10) { c2 = 7; }
    if (SEC < 10) { c3 = 11; }
    if (SEC >= 10) { c3 = 10; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("0");
    LCD.setCursor(c3, 0);
    LCD.print(SEC);
    if (alarm == true) { LCD.print(char(1)); }
    if (alarm == false) { LCD.print(" "); }
    noTone(5);
  }

  while (w == 1) {
    if (HOUR > 23) { HOUR = 0; }
    if (HOUR < 10) { c1 = 5; }
    if (HOUR >= 10) { c1 = 4; }
    if (MIN < 10) { c2 = 8; }
    if (MIN >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if (alarm == true) { LCD.print(char(1)); }
    if (alarm == false) { LCD.print(" "); }

    LCD.setCursor(2, 1);
    LCD.print("HOUR SETTING");

    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(9);
      if (!button1IsUp) {
        LCD.clear(); w = 2;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(8);
      if (!button2IsUp) {
        HOUR++;
      }
    }
    button2WasUp = button2IsUp;
  }

  while (w == 2) {
    if (MIN > 59) { MIN = 0;}
    if (HOUR < 10) { c1 = 5; }
    if (HOUR >= 10) { c1 = 4; }
    if (MIN < 10) { c2 = 8; }
    if (MIN >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if (alarm == true) { LCD.print(char(1)); }
    if (alarm == false) { LCD.print(" "); }

    LCD.setCursor(1, 1);
    LCD.print("MINUTE SETTING");

    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(9);
      if (!button1IsUp) {
        LCD.clear(); w = 3;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(8);
      if (!button2IsUp) {
        MIN++;
      }
    }
    button2WasUp = button2IsUp;
  }

  while (w == 3) {
    if (MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if (HOUR_A > 23) { HOUR_A = 0; }
    if (HOUR_A < 10) { c1 = 5; }
    if (HOUR_A >= 10) { c1 = 4; }
    if (MIN_A < 10) { c2 = 8; }
    if (MIN_A >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR_A);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN_A);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if (alarm == true) {
      LCD.print(char(1)); LCD.setCursor(4, 1); LCD.print("ALARM ON ");
    }
    if (alarm == false) {
      LCD.print(" "); LCD.setCursor(4, 1); LCD.print("ALARM OFF");
    }
 
    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(9);
      if (!button1IsUp) {
        LCD.clear(); w = 4;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(8);
      if (!button2IsUp) {
        alarm = !alarm;
      }
    }
    button2WasUp = button2IsUp;
  }

  while (w == 4) {
    if (MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if (HOUR_A > 23) { HOUR_A = 0; }
    if (HOUR_A < 10) { c1 = 5; }
    if (HOUR_A >= 10) { c1 = 4; }
    if (MIN_A < 10) { c2 = 8; }
    if (MIN_A >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR_A);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN_A);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if (alarm == true) { LCD.print(char(1)); }
    if (alarm == false) { LCD.print(" "); }

    LCD.setCursor(1, 1);
    LCD.print("ALARM SET HOUR");

    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(9);
      if (!button1IsUp) {
        LCD.clear(); w = 5;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(8);
      if (!button2IsUp) {
        HOUR_A++;
      }
    }
    button2WasUp = button2IsUp;
  }

  while (w == 5) {
    if (MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if (HOUR_A > 23) { HOUR_A = 0; }
    if (HOUR_A < 10) { c1 = 5; }
    if (HOUR_A >= 10) { c1 = 4; }
    if (MIN_A < 10) { c2 = 8; }
    if (MIN_A >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR_A);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN_A);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if (alarm == true) { LCD.print(char(1)); }
    if (alarm == false) { LCD.print(" "); }

    LCD.setCursor(0, 1);
    LCD.print("ALARM SET MINUTE");

    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(9);
      if (!button1IsUp) {
        LCD.clear(); w = 0;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(8);
      if (!button2IsUp) {
        MIN_A++;
      }
    }
    button2WasUp = button2IsUp;
  }

}

Explication du code pour horloge sans RTC:

  1. pendant le réglage de l’horloge et du réveil, la minuterie s’arrête;
  2. les variables c1 et c2 sont responsables de la position du curseur lorsque l’heure et les minutes sont affichées à l’écran, selon qu’un nombre à deux ou à un chiffre est stocké dans la variable.

Conclusion. Une horloge sans module RTC (Real Time Clock) remettra l’heure aux valeurs d’origine lorsque l’alimentation est coupée, c’est pourquoi des boutons ont été ajoutés au projet. Ils peuvent être utilisés pour régler l’horloge sans avoir à recharger le croquis – un projet Arduino simple pour les débutants en programmation. Vous pouvez également ajouter un capteur DHT22 ou BMP180 pour afficher la température à l’écran LCD 1602 i2c.





4 Replies to “Arduino Horloge avec LCD 1602 sans RTC”

  1. Bonjour,
    comme il etait ecris sur cette page et il etait ecris que cela allait pour les cartes uno mais moi j’ai une carte uno mais ca a ecris ca au moment du televersement: exit status 1
    Merci de me dire pourquoi…

  2. Après avoir assemblé le schéma de câblage, chargez le programme suivant dans la carte.

    ok mais comment

    merci

    1. Pour charger (téléverser) un programme dans un arduino il faut :
      – Le logiciel (IDE arduino) que vous trouverez ici gratuitement:
      https://arduino.cc/en/software
      (au jour ou j’écris ces lignes on en est à la version 2.0.3)
      – Brancher votre carte sur un port usb
      – Choisir « le type de carte » et le « port » dans l’IDE onglet « Outils »
      – Copier/écrire du code
      – Dans l’onglet « Croquis » choisir téléverser
      – Et si tout a été fait correctement votre carte va faire ce que vous lui avez demandé

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.