Module RTC DS3231
Un module RTC (Real Time Clock) horloge temps réel est un compteur date/heure.
Ce module RTC de précision basé sur le DS3231 donne la date et l'heure au format 12h ou 24h, en tenant compte des années bissextiles. Il communique avec un microcontrôleur type Arduino ou compatible via le bus I2C.
Il est utilisé dans les systèmes qui ont besoin de la date/heure pour déclencher ou enregistrer des événements.
Exemple : L’arrosage des plantes à une heure précise ....
De nombreuses librairies sont disponibles pour le bon fonctionnement du module RTC.
Un support pour pile de sauvegarde CR2032 est présent au dos du circuit
PinOut
| Module RTC - DS3231 | Arduino Uno |
|---|---|
| GND | GND |
| VCC (2,7v min / 5,5v max) | +5v ou +3,3v |
| SCL (I2C) | A5 (I2C) |
| SDA (I2C) | A4 (I2C) |
| SQW (horloge interne - signal carré à 1Hz, 4000Hz, 8000Hz ou 32000Hz) | |
| 32K (horloge interne - signal carré à 32kHz) |
Pile CR2032 ou LIR2032
Si vous utilisez une CR2032 Non rechargeable, il est recommandé de désactiver le circuit de charge du DS3231, en dessoudant la résistance de 220 Ohms (A coté de la diode en haut/droite)
Merci à Passion Electronique pour cette information !
Adresse I2C
A2 | A1 | A0 | Adresse I2C - (7 bits) | |
|---|---|---|---|---|
DS3231 | - | - | - | 0x68 |
Eeprom 24C32 | 0 | 0 | 0 | 0x50 |
Eeprom 24C32 | 0 | 0 | 1 | 0x51 |
Eeprom 24C32 | 0 | 1 | 0 | 0x52 |
Eeprom 24C32 | 0 | 1 | 1 | 0x53 |
Eeprom 24C32 | 1 | 0 | 0 | 0x54 |
Eeprom 24C32 | 1 | 0 | 1 | 0x55 |
Eeprom 24C32 | 1 | 1 | 0 | 0x56 |
Eeprom 24C32 | 1 | 1 | 1 | 0x57 |
Le module RTC DS3231 a deux adresses I2C
- Une adresse I2C pour la puce DS3231
- Une adresse I2C pour la mémoire eeprom 24C32
Leur valeur équivaut à «0» lorsqu’un cavalier/pont de soudure est en place à leur niveau, ou «1» s’il n’y a aucun cavalier ou pont de soudure à leur niveau.
Afficher les adresse I2C dans le moniteur serie
/* Claude EMERY - 15/02/2025
Détection de l'adresse I2C
D'un module connecté à l'Arduino UNO
SDA=A4 et SCL=A5
*/
#include <Wire.h>
void setup(){
Wire.begin();
Serial.begin(9600);
while (!Serial); // Attente connexion moniteur série
Serial.println("\nI2C Scanner");
}
void loop(){
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ ) {
/* Le scanner i2c utilise la valeur de retour de Write.endTransmission
pour vérifier si un périphérique a bien accusé réception de l'adresse.*/
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0){
Serial.print("Périphérique I2C détecté à l'adresse 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4) {
Serial.print("Erreur inconnue à l'adresse 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("Aucun périphérique I2C détecté\n");
else
Serial.println("Terminé ...\n");
delay(5000); // Patienter 5 secondes avant le prochain scan.
}
Code Arduino Simple
Nous utiliserons la bibliothèque DS3231.zip , cette librairie est à installer manuellement
- Copier cette bibliothèque dans un dossier sur votre ordinateur
- Croquis / Importer une bibliothèque / Ajouter une bibliothèque .ZIP ...
- Sélectionner la bibliothèque DS3231.zip, puis [Ouvrir]
Patienter pendant l’installation de la bibliothèque ...
Télécharger la librairie DS3231.zip
Affichage simple de la date/heure avec la DS3231.h (Utilisation de la librairie DS3231.zip ci-dessus)
/* Claude EMERY - 07/06/2026
RTC DS3231
Affichage simple date & heure
*/
#include <Wire.h>
#include <DS3231.h> // Librairie DS3231.h à installer en zip
DS3231 clock;
RTCDateTime dt;
void setup(){
Serial.begin(9600);
Serial.println("Initialize DS3231");
clock.begin(); // Initialization du DS3231
// Enregistrement manuellement de la date/Heure au format: YYYY, MM, DD, HH, MM, SS
// clock.setDateTime(2016, 12, 9, 11, 46, 00);
// Date/Heure envoyees est la date/heure de la compilation du croquis
clock.setDateTime(__DATE__, __TIME__);
/* Cette commande sera exécutée à chaque redémarrage d’Arduino.
& commenter la ligne //clock.setDateTime(__DATE__, __TIME__);
pour stocker en mémoire du module DS3231 */
}
void loop(){
dt = clock.getDateTime();
Serial.print("Date/Heure: ");
Serial.print(dt.year); Serial.print("-"); // Affichage de l'année
Serial.print(dt.month); Serial.print("-"); // Affichage du mois
Serial.print(dt.day); Serial.print(" "); // Affichage du jour
Serial.print(dt.hour); Serial.print(":"); // Affichage de l'heure
Serial.print(dt.minute); Serial.print(":"); // Affichage des minutes
Serial.print(dt.second); Serial.println(""); // Affichage des seconde
delay(1000);
}
La ligne ci-dessous enregistre la date/heure au moment de chaque compilation du code
- clock.setDateTime(__DATE__, __TIME__);
Si vous dé-commentez la ligne ci-dessous vous pouvez enregistrer manuellement la date/heure au format YYYY, MM, DD, HH, MM, SS
- clock.setDateTime(2016, 12, 9, 11, 46, 00); Séparer les chiffres (année, mois, jour, heure, minute, seconde) par des virgules
Mais il faudra commenter la ligne // pour que le code ne l’exécute pas
- //clock.setDateTime(__DATE__, __TIME__);
Code Arduino avec la librairie Adafruit
Dans cet exemple, nous utiliserons la bibliothèque RTClib.h de Adafruit , cette librairie est à installer via le gestionnaire bibliothèque de l’IDE
- Ouvrir le « Gestionnaire de bibliothèques »
Dans la zone de recherche, saisir rtclib, et installer la bibliothèque
- RTClib par Adafruit (Elle est peut-être déjà installée)
/* Claude EMERY - 07/06/2026
Affichage Date/Heure
avec RTClib de Adafruit */
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc; // Objet rtc
char daysOfTheWeek[7][12] = {"Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"};
void setup() {
Serial.begin(9600);
delay(2000);
rtc.begin(); // Initialisation d module RTC
// Recupération date et heure du téléversement dans le module RTC
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
/* Pour régler manuellement la date et l'heure,
supprimez les signes de commentaire //
et saisissez les nouvelles valeurs sur la ligne suivante
dans cet ordre : année, jour, mois, heure, minute et seconde. */
//rtc.adjust(DateTime(2000, 1, 12, 1, 00, 0)); //Ajustement date heure -- Séparer les chiffres (année, mois, jour, heure, minute, seconde) par des virgules
}
void loop() {
DateTime now = rtc.now(); // Date Heure actuelle
//Jour de la semaine
Serial.print("Jour de la semaine: ");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); // Affichage jour semaine
Serial.println();
Serial.print("Heure actuelle: "); // Affichage heure actuelle
if (now.hour() < 10) {
Serial.print("0");
Serial.print(now.hour());
} else {
Serial.print(now.hour(), DEC); // Affichage heure actuelle, DEC en decimal
}
Serial.print(':');
if (now.minute() < 10) {
Serial.print("0");
Serial.print(now.minute());
} else {
Serial.print(now.minute(), DEC);
}
Serial.print(':');
if (now.second() < 10) {
Serial.print("0");
Serial.print(now.second());
} else {
Serial.print(now.second(), DEC);
}
Serial.println();
Serial.print("Date actuelle: "); // Affichage date actuelle
if (now.day() < 10) {
Serial.print("0");
Serial.print(now.day());
} else {
Serial.print(now.day(), DEC);
}
Serial.print('/');
if (now.month() < 10) {
Serial.print("0");
Serial.print(now.month());
} else {
Serial.print(now.month(), DEC);
}
Serial.print('/');
Serial.print(now.year(), DEC);
Serial.print("");
Serial.println();
//Temperature:
Serial.print("Temperature: "); // Affichage température
Serial.print(rtc.getTemperature());
Serial.println(" C");
Serial.println();
delay(2000);
}
Ce code affiche la température (optionnel)
La ligne ci-dessous enregistre la date/heure au moment de chaque compilation du code
- rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
Si vous dé-commentez la ligne ci-dessous vous pouvez enregistrer manuellement la date/heure au format YYYY, MM, DD, HH, MM, SS
- rtc.adjust(DateTime(2000, 1, 12, 1, 00, 0)); Séparer les chiffres (année, mois, jour, heure, minute, seconde) par des virgules
Mais il faudra commenter la ligne // pour que le code ne l’exécute pas
- //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));








