DS3231: horloge et calendrier en temps réel pour votre Arduino

DS3231

Dans certains projets, il est nécessaire d'avoir une preuve de l'heure, de l'heure ou de la date. Soit en raison de la nécessité d'exécuter certaines fonctions en fonction de l'heure, de maintenir un calendrier d'événements ou d'enregistrement, de conserver l'heure dans un système, ou simplement de créer une horloge numérique avec Arduino. avec le DS3231 vous pouvez l'obtenir, un autre des composants que nous ajoutons à la liste.

Le DS3231 est le module que vous recherchiez, et vous trouverez ici tout ce dont vous avez besoin pour son contrôle et je vais également vous montrer un exemple de intégrez-le avec Arduino avec un exemple pratique ...

Qu'est-ce que le DS3231?

DS3231

Tout d'abord, vous devez savoir ce qu'est un RTC (horloge en temps réel), ou horloge en temps réel. Ces puces sont très fréquentes dans une multitude d'applications, en effet, votre PC en possède une sur votre carte mère, et elle est également alimentée par un Pile CR2032 aussi. C'est celui qui maintient l'heure et la configuration dans le BIOS / UEFI et à partir duquel le système d'exploitation le prend lors du démarrage pour être à l'heure (bien que maintenant, avec Internet, la synchronisation avec les serveurs puisse être utilisée pour plus de précision, mais cela est une autre histoire…).

Ce que fait le RTC est d'obtenir des mesures de temps, aussi simple que cela. La différence avec les autres types de montres électroniques est qu'elles mesurer le temps, et il le fait en comptant les impulsions du signal d'horloge, en connaissant la fréquence et les périodes de celui-ci. En plus du temps, un RTC vous permet également de tenir un compte des jours, des semaines, des mois et des années. Autrement dit, la date complète ...

Pour que cela soit possible, le RTC doit être accompagné d'un Cristal Xtal ou quartz qui agira comme un résonateur, celui qui fournit la fréquence. De plus, vous avez besoin de circuits électroniques capables de compter et de stocker la date dans une mémoire. Le circuit doit être capable de compter les secondes, les minutes, les heures, les jours, les semaines, les mois et les années.

que la mémoire est volatileC'est pourquoi il a besoin de la batterie, pour avoir une puissance constante. Si vous n'avez pas de batterie ou qu'elle s'épuise, elle sera effacée ... C'est ce qui arrive aux PC lorsque la batterie est épuisée, ils donnent une heure incorrecte. Si vous le configurez alors que le PC est allumé, l'heure sera conservée, puisque le RTC est sous tension, mais c'est pendant les processus pendant lesquels il est éteint lorsque cette batterie est nécessaire ...

Pour les projets de bricolage, les fabricants utilisent généralement deux puces RTC communes, qui sont les DS1307 et DS3231. Les deux sont fabriqués par Maxim (anciennement Dallas Semiconductor), et le DS3231 est le plus précis des deux, car il n'est pas aussi affecté par les variations de température que le premier. Par conséquent, il ne fluctue pas tellement en fonction de la température, et il garde l'heure plus précisément.

Parfois, avec des différences de température notables, le DS1307 pouvait être retardé de 1 ou 2 minutes par jour. Quelque chose d'intolérable pour certaines applications.

Le DS3231 n'est pas qu'il n'est pas affecté par les variations, mais qu'il dispose de systèmes intégrés de mesure et de compensation de température pour assurer une précision de 2 ppm, ce qui équivaudrait à un décalage horaire d'environ 172ms par jour, soit un peu plus d'une seconde par semaine au maximum. Et dans la pratique, ils ne varient généralement que de 1 à 1 secondes par mois.

Quant au chemin communiquer avec le RTC DS3131 pour obtenir les valeurs de date qu'il obtient, il se fait par Bus I2C. Et pour l'alimentation, vous pouvez utiliser 2.3 à 5.5 V pour le DS3231, ce qui est un peu inférieur aux 4.5 à 5.5 V pour le DS1307, ce qui permet de gagner en efficacité énergétique et de prolonger la durée de vie de la batterie.

De plus, vous devez savoir que ces modules ont généralement un EEPROM AT24C32 supplémentaire pour stocker certains enregistrements et mesures précédentes, ce qui est assez pratique.

applications

En ce qui concerne les applications, j'en ai déjà évoqué certaines, comme implémenter une horloge avec Arduino, pour créer un système qui agit sur la base l'heure Quoi qu'il en soit, pour garder l'heure sur des équipements tels que des PC et de nombreux autres appareils électroniques et appareils qui ont du temps, etc.

Peut également être utilisé dans les projets pour créer des minuteries pour l'éclairage, les systèmes d'irrigation, l'enregistreur de données, etc. Les applications peuvent être les plus nombreuses ...

Acheter un RTC DS3231

Le module DS3131 est bon marché, et vous pouvez le trouver dans certains magasins d'électronique spécialisés ou dans les grands magasins tels que eBay, AliExpress, Amazon, etc. Si vous souhaitez en avoir un, voici quelques recommandations:

Intégration Arduino DS3231

Capture d'écran Arduino IDE

Si vous voulez intégrez votre DS3231 à votre carte Arduino et commencez à créer des projets «chronométrés», vous devez d'abord établir les connexions appropriées. Pour pouvoir le connecter, c'est aussi simple que:

  • La broche SLC de la carte DS3231 doit être connectée à l'A5 de votre Arduino UNO.
  • SDA du DS3231 est connecté à A4 d'Arduino.
  • Vcc du module passera à 5V d'Arduino.
  • GND à GND.
N'oubliez pas d'installer la librairie pour utiliser le RTC DS3231 dans votre IDE Arduino sinon le code ne fonctionnera pas ...

Maintenant que le système est connecté, la prochaine chose est d'écrire le code source de l'esquisse pour le programmer. Vous pouvez modifier les codes et les adapter à vos besoins, mais vous pouvez commencer par obtenir simplement la date d'un RTC DS3231 connecté à Arduino:

#include <Wire.h>
#include "RTClib.h"
 
// RTC_DS1307 rtc;
RTC_DS3231 rtc;
 
String daysOfTheWeek[7] = { "Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado" };
String monthsNames[12] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo",  "Junio", "Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre" };
 
void setup() {
   Serial.begin(9600);
   delay(1000); 
 
   if (!rtc.begin()) {
      Serial.println(F("No se encuentra el RTC"));
      while (1);
   }
 
   // Si se ha perdido el suministro eléctrico, fijar fecha y hora
   if (rtc.lostPower()) {
      // Fijar a fecha y hora (poner la de compilación del sketch)
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      
      // Fijar a fecha y hora específica. En este ejemplo el 2021-01-01 a las 00:00:00
      // rtc.adjust(DateTime(2020, 1, 1, 0, 0, 0));
   }
}
//Imprimir completa obtenida la fecha en decimal
void printDate(DateTime date)
{
   Serial.print(date.year(), DEC);
   Serial.print('/');
   Serial.print(date.month(), DEC);
   Serial.print('/');
   Serial.print(date.day(), DEC);
   Serial.print(" (");
   Serial.print(daysOfTheWeek[date.dayOfTheWeek()]);
   Serial.print(") ");
   Serial.print(date.hour(), DEC);
   Serial.print(':');
   Serial.print(date.minute(), DEC);
   Serial.print(':');
   Serial.print(date.second(), DEC);
   Serial.println();
}
 
void loop() {
   // Obtener fecha actual y mostrar por Serial
   DateTime now = rtc.now();
   printDate(now);
 
   delay(3000);    //Espera 3 segundos
}

Et pour utiliser la date RTC pour planifier une tâche, comme pour allumer ou éteindre les lumières, pour l'arrosage automatique, ou pour qu'une alarme retentisse, etc. N'oubliez pas que pour gérer des appareils à plus haute tension, vous pouvez utiliser des transistors ou relais:

#include <Wire.h>
#include "RTClib.h"
 
const int outputPin = LED_BUILTIN;
bool state = false;
 
// RTC_DS1307 rtc;
RTC_DS3231 rtc;
 
void setup() {
   Serial.begin(9600);
   delay(1000);
 
   if (!rtc.begin()) {
      Serial.println(F("Couldn't find RTC"));
      while (1);
   }
 
   if (rtc.lostPower()) {
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   }
}
 
// Se comprueba si está programado el encendido
bool isScheduledON(DateTime date)
{
   int weekDay = date.dayOfTheWeek();
   float hours = date.hour() + date.minute() / 60.0;
 
   // Configuración de horas de 08:30 a 9:30 y de 22:00 a 23:00 (usando decimal)
   bool hourCondition = (hours > 8.50 && hours < 9.50) || (hours > 22.00 && hours < 23.00);
 
   // Configuración del día Lunes, Sábado y Domingo con números (recuerda que en inglés comienza la semana en Domingo=0, Lunes=1,...
   bool dayCondition = (weekDay == 1 || weekDay == 6 || weekDay == 0); 
   if (hourCondition && dayCondition)
   {
      return true;
   }
   return false;
}
 
void loop() {
   DateTime now = rtc.now();
 
   if (state == false && isScheduledON(now))      // Apagado
   {
      digitalWrite(outputPin, HIGH);
      state = true;
      Serial.print("Activado");
   }
   else if (state == true && !isScheduledON(now))  // Encendido
   {
      digitalWrite(outputPin, LOW);
      state = false;
      Serial.print("Desactivado");
   }
 
   delay(3000);
}


Soyez le premier à commenter

Laisser un commentaire

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

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.