Construire un Réveil Fiable avec RTC DS1302 et Arduino UNO
Composants et fournitures
| Module RTC DS1302 (horloge temps réel) | ×1 |
| Buzzer | ×1 |
| Écran LCD I2C 16×2 (blanc sur bleu) | ×1 |
| Arduino UNO | ×1 |
| Clavier matriciel 4×4 | ×1 |
À propos du projet
Bonjour à tous, dans ce projet nous allons réaliser un réveil simple avec une carte Arduino UNO. Ce projet combine différents modules que j'ai utilisés auparavant ; si vous bloquez sur quelque chose, consultez les tutoriels de chaque module sur le site, car c'est ainsi que je procède habituellement : faire les choses séparément puis les combiner.
Matériel nécessaire
- Carte Arduino UNO (ou adaptée)
- Module RTC DS1302
- Module clavier matriciel 4×4
- Écran LCD I2C
- Module buzzer (ou buzzer 2 broches)
Au cas où vous bloqueriez, consultez ces tutoriels précédents :
- Configuration du DS1302 RTC avec Clavier + Arduino + LCD
- Utilisation simple du DS1302 RTC avec Arduino et écran LCD
- Arduino LCD I2C utilisation simple et écriture directe depuis le moniteur série
- Arduino UNO + Clavier matriciel 4×4 + Écran LCD I2C
- Comment utiliser un buzzer/piézo avec Arduino
Câblage

Bibliothèques et code
- Bibliothèque LCD I2C (choisissez celle-ci ou téléchargez la vôtre)
- Bibliothèque Keypad (ou téléchargez depuis l'IDE Arduino)
- Bibliothèque RTC DS1302 virtuabotix
Code
Télécharger le code
Le fonctionnement est simple : après le câblage, appuyez sur « * » pour régler l'heure et la date sur le RTC DS1302. L'affichage montrera alors le jour et l'heure actuels. Pour régler l'alarme, appuyez sur « A » et définissez l'heure et les minutes. Vous pouvez la désactiver en appuyant sur « B » avant l'heure ou sur n'importe quel bouton pendant la sonnerie.
J'espère que ça vous plaira, contactez-moi pour tout problème.
Code source (RTC_alarm_clock_LCD.ino)
// Code pour DS1302 RTC + Clavier 4x4 + LCD I2C + Arduino + Buzzer
// Après câblage, l'affiche la date/heure par défaut ou celle définie auparavant
// Objectif : régler le module RTC depuis le clavier, l'heure reste stockée
// Puis l'afficher et régler l'alarme.
// Référez-vous à Surtrtech.com ou chaîne YouTube SurtrTech pour plus d'infos
#include <Keypad.h>
#include <Wire.h>
#include <virtuabotixRTC.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
virtuabotixRTC myRTC(2, 3, 4); // CLK, DAT, RST
const byte numRows = 4;
const byte numCols = 4;
char keymap[numRows][numCols] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[numRows] = {12,11,10,9};
byte colPins[numCols] = {8,7,6,5};
int i1,i2,i3,i4;
char c1,c2,c3,c4;
char keypressed, keypressedx;
int A_hour = NULL;
int A_minute = NULL;
int AlarmIsActive = NULL;
int buzzer = 13;
Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);
void setup() {
Serial.begin(9600);
lcd.begin(16,2);
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);
lcd.home();
}
void loop() {
while(keypressed == NO_KEY) {
keypressed = myKeypad.getKey();
lcd.clear();
myRTC.updateTime();
if(myRTC.hours == A_hour && myRTC.minutes == A_minute && AlarmIsActive == 1 && myRTC.seconds >= 0 && myRTC.seconds <= 2) {
while(keypressedx == NO_KEY) {
tone(buzzer, 1000);
delay(100);
tone(buzzer, 2000);
delay(100);
lcd.clear();
lcd.print("Reveillez-vous !!!");
keypressedx = myKeypad.getKey();
}
}
keypressedx = NO_KEY;
noTone(buzzer);
lcd.setCursor(0,0);
lcd.print(myRTC.dayofmonth);
lcd.print("/");
lcd.print(myRTC.month);
lcd.print("/");
lcd.print(myRTC.year);
lcd.setCursor(0,1);
lcd.print(myRTC.hours);
lcd.print(":");
lcd.print(myRTC.minutes);
lcd.print(":");
lcd.print(myRTC.seconds);
delay(100);
}
if (keypressed == '*') {
lcd.clear();
lcd.print(" Reglage");
delay(1000);
lcd.clear();
lcd.print("Regler annee");
// Saisie année (4 chiffres)
char keypressed2 = myKeypad.waitForKey();
if (keypressed2 != NO_KEY && keypressed2 != '*' && keypressed2 != '#' && keypressed2 != 'A' && keypressed2 != 'B' && keypressed2 != 'C' && keypressed2 != 'D') {
c1 = keypressed2; lcd.setCursor(0,1); lcd.print(c1);
}
char keypressed3 = myKeypad.waitForKey();
if (keypressed3 != NO_KEY && keypressed3 != '*' && keypressed3 != '#' && keypressed3 != 'A' && keypressed3 != 'B' && keypressed3 != 'C' && keypressed3 != 'D') {
c2 = keypressed3; lcd.setCursor(1,1); lcd.print(c2);
}
char keypressed4 = myKeypad.waitForKey();
if (keypressed4 != NO_KEY && keypressed4 != '*' && keypressed4 != '#' && keypressed4 != 'A' && keypressed4 != 'B' && keypressed4 != 'C' && keypressed4 != 'D') {
c3 = keypressed4; lcd.setCursor(2,1); lcd.print(c3);
}
char keypressed5 = myKeypad.waitForKey();
if (keypressed5 != NO_KEY && keypressed5 != '*' && keypressed5 != '#' && keypressed5 != 'A' && keypressed5 != 'B' && keypressed5 != 'C' && keypressed5 != 'D') {
c4 = keypressed5; lcd.setCursor(3,1); lcd.print(c4);
}
i1 = (c1-48)*1000; i2 = (c2-48)*100; i3 = (c3-48)*10; i4 = c4-48;
int N_year = i1+i2+i3+i4;
delay(500);
lcd.clear();
lcd.print("Regler mois");
// Saisie mois (2 chiffres)
char keypressed6 = myKeypad.waitForKey();
if (keypressed6 != NO_KEY && keypressed6 != '*' && keypressed6 != '#' && keypressed6 != 'A' && keypressed6 != 'B' && keypressed6 != 'C' && keypressed6 != 'D') {
c1 = keypressed6; lcd.setCursor(0,1); lcd.print(c1);
}
char keypressed7 = myKeypad.waitForKey();
if (keypressed7 != NO_KEY && keypressed7 != '*' && keypressed7 != '#' && keypressed7 != 'A' && keypressed7 != 'B' && keypressed7 != 'C' && keypressed7 != 'D') {
c2 = keypressed7; lcd.setCursor(1,1); lcd.print(c2);
}
i1 = (c1-48)*10; i2 = c2-48;
int N_month = i1+i2;
delay(500);
lcd.clear();
lcd.print("Regler jour");
// Saisie jour (2 chiffres)
char keypressed8 = myKeypad.waitForKey();
if (keypressed8 != NO_KEY && keypressed8 != '*' && keypressed8 != '#' && keypressed8 != 'A' && keypressed8 != 'B' && keypressed8 != 'C' && keypressed8 != 'D') {
c1 = keypressed8; lcd.setCursor(0,1); lcd.print(c1);
}
char keypressed9 = myKeypad.waitForKey();
if (keypressed9 != NO_KEY && keypressed9 != '*' && keypressed9 != '#' && keypressed9 != 'A' && keypressed9 != 'B' && keypressed9 != 'C' && keypressed9 != 'D') {
c2 = keypressed9; lcd.setCursor(1,1); lcd.print(c2);
}
i1 = (c1-48)*10; i2 = c2-48;
int N_day = i1+i2;
delay(500);
lcd.clear();
lcd.print("Regler heure");
// Saisie heure (2 chiffres)
char keypressed10 = myKeypad.waitForKey();
if (keypressed10 != NO_KEY && keypressed10 != '*' && keypressed10 != '#' && keypressed10 != 'A' && keypressed10 != 'B' && keypressed10 != 'C' && keypressed10 != 'D') {
c1 = keypressed10; lcd.setCursor(0,1); lcd.print(c1);
}
char keypressed11 = myKeypad.waitForKey();
if (keypressed11 != NO_KEY && keypressed11 != '*' && keypressed11 != '#' && keypressed11 != 'A' && keypressed11 != 'B' && keypressed11 != 'C' && keypressed11 != 'D') {
c2 = keypressed11; lcd.setCursor(1,1); lcd.print(c2);
}
i1 = (c1-48)*10; i2 = c2-48;
int N_hour = i1+i2;
delay(500);
lcd.clear();
lcd.print("Regler minutes");
// Saisie minutes (2 chiffres)
char keypressed12 = myKeypad.waitForKey();
if (keypressed12 != NO_KEY && keypressed12 != '*' && keypressed12 != '#' && keypressed12 != 'A' && keypressed12 != 'B' && keypressed12 != 'C' && keypressed12 != 'D') {
c1 = keypressed12; lcd.setCursor(0,1); lcd.print(c1);
}
char keypressed13 = myKeypad.waitForKey();
if (keypressed13 != NO_KEY && keypressed13 != '*' && keypressed13 != '#' && keypressed13 != 'A' && keypressed13 != 'B' && keypressed13 != 'C' && keypressed13 != 'D') {
c2 = keypressed13; lcd.setCursor(1,1); lcd.print(c2);
}
i1 = (c1-48)*10; i2 = c2-48;
int N_minutes = i1+i2;
delay(500);
lcd.clear();
myRTC.setDS1302Time(22, N_minutes, N_hour, 1, N_day, N_month, N_year);
// 22 = secondes (peut être ajouté), 1 = jour de semaine (non affiché)
keypressed = NO_KEY;
}
// Configuration alarme
if (keypressed == 'A') {
lcd.clear();
lcd.print(" Reglage alarme");
delay(1000);
lcd.clear();
lcd.print("Regler heure alarme");
char keypressed14 = myKeypad.waitForKey();
if (keypressed14 != NO_KEY && keypressed14 != '*' && keypressed14 != '#' && keypressed14 != 'A' && keypressed14 != 'B' && keypressed14 != 'C' && keypressed14 != 'D') {
c1 = keypressed14; lcd.setCursor(0,1); lcd.print(c1);
}
char keypressed15 = myKeypad.waitForKey();
if (keypressed15 != NO_KEY && keypressed15 != '*' && keypressed15 != '#' && keypressed15 != 'A' && keypressed15 != 'B' && keypressed15 != 'C' && keypressed15 != 'D') {
c2 = keypressed15; lcd.setCursor(1,1); lcd.print(c2);
}
i1 = (c1-48)*10; i2 = c2-48;
A_hour = i1+i2;
delay(500);
lcd.clear();
lcd.print("Regler minutes alarme");
char keypressed16 = myKeypad.waitForKey();
if (keypressed16 != NO_KEY && keypressed16 != '*' && keypressed16 != '#' && keypressed16 != 'A' && keypressed16 != 'B' && keypressed16 != 'C' && keypressed16 != 'D') {
c1 = keypressed16; lcd.setCursor(0,1); lcd.print(c1);
}
char keypressed17 = myKeypad.waitForKey();
if (keypressed17 != NO_KEY && keypressed17 != '*' && keypressed17 != '#' && keypressed17 != 'A' && keypressed17 != 'B' && keypressed17 != 'C' && keypressed17 != 'D') {
c2 = keypressed17; lcd.setCursor(1,1); lcd.print(c2);
}
i1 = (c1-48)*10; i2 = c2-48;
A_minute = i1+i2;
delay(500);
lcd.clear();
AlarmIsActive = 1;
keypressed = NO_KEY;
}
if (keypressed == 'B') {
lcd.clear();
lcd.print("Alarme desactivee");
AlarmIsActive = 0;
keypressed = NO_KEY;
delay(500);
} else {
myRTC.updateTime();
keypressed = NO_KEY;
}
}
Schémas

Processus de fabrication
- Panneau de contrôle Arduino Nano pour Flight Simulator 2020 – Affichage LCD et CDI
- Horloge POV Arduino : Construire un affichage LED à persistance rétinienne
- Construire une horloge Numitron rétro avec Arduino : simple, fiable et économe en énergie
- Horloge à Mots DIY Arduino – Afficheur Temps Réel Élégant et Personnalisable
- Horloge Arduino temps réel pour les heures de prière islamiques
- Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
- Moniteur de Température et Horloge Temps Réel Arduino avec Écran TFT 3.2"
- Capteur d'obstacle IR simple avec Arduino — LED IR + Photodiode
- Horloge numérique TM1637 avec réglage heure/alarme – Prototype Arduino Nano