[Mise à jour le 30/7/2024]
Une horloge temps réel (abrégé en HTR, en anglais real-time clock ou RTC), est une horloge permettant un décompte très précis du temps (par exemple en nanosecondes) pour un système électronique, en vue de dater ou déclencher des évènements selon l'heure. Par rapport à l'horloge à quartz, l'horloge en temps réel réduit le risque de panne mécanique. Il peut donc être utilisé dans un environnement très vibratoire. Wikipédia
L'horloge temps réel (RTC) à circuit DS1307 est une horloge / calendrier BCD (décimal codé binaire) disposant de 56 octets de NV SRAM. Elle communique avec un microcontrôleur via un bus I2C.
Ce circuit fournit l'année, le mois, le jour, les heures, les minutes et les secondes en tenant compte des années bissextiles. L'horloge fonctionne au format 24 heures ou 12 heures avec l'indication AM / PM. Un circuit de détection de puissance intégré passe automatiquement sur une alimentation de secours en cas de coupure du courant.
ou
// Code testé sur Arduino Uno et Arduino MKR Zéro // Interruption générée toutes le 1s par une HTR à DS3231M #include "DFRobot_DS3231M.h" // Broche utilisée pour l'interruption // Arduino UNO : 2 (D2) // Arduino MKR0 ou MKR Wifi1010 : 0 (D0) const byte interruptPin = 0; int i=0; DFRobot_DS3231M rtc; void setup() { pinMode(interruptPin, INPUT_PULLUP); // INT du circuit DS3231M sur drain ouvert Serial.begin(115200); // Sortie dans la console /* On attend que l'initialisation du DS3231M soit complète */ while (rtc.begin() != true) { Serial.println("Circuit non initialisé, vérifier les connexions. "); delay(1000); } /*! *@brief Broche INT *@param mode eDS3231M_OFF = 0x01 // Désactivation du signal en sortie, DS3231M en mode interruption *@n eDS3231M_SquareWave_1Hz = 0x00 // signal carré 1Hz *@n eDS3231M_SquareWave_1kHz = 0x08 // signal carré 1kHz *@n eDS3231M_SquareWave_4kHz = 0x10 // signal carré 4kHz *@n eDS3231M_SquareWave_8kHz = 0x18 // signal carré 8kHz */ rtc.writeSqwPinMode(eDS3231M_SquareWave_1Hz); // digitalPinToInterrupt convertit le n° de broche en n° d'interruption attachInterrupt(digitalPinToInterrupt(interruptPin), interrupt_handler, RISING); } void loop() { // Mettre le code répétitif ici } void interrupt_handler() { Serial.println("Hello " + (String)i++); }