DS3231: orologio e calendario in tempo reale per il tuo Arduino

DS3231

In alcuni progetti è necessario avere la prova dell'ora, dell'ora o della data. O per la necessità di eseguire determinate funzioni in base all'ora, per mantenere un calendario di eventi o registrazioni, per mantenere l'ora in un sistema, o semplicemente per creare un orologio digitale conArduino. Con il DS3231 puoi ottenerlo, un altro dei componenti che aggiungiamo alla lista.

Il DS3231 è il modulo che stavi cercando, qui troverai tutto il necessario per il suo controllo e ti mostrerò anche un esempio di come integralo con Arduino con un esempio pratico ...

Cos'è il DS3231?

DS3231

Prima di tutto, dovresti sapere che cos'è un file RTC (orologio in tempo reale)o orologio in tempo reale. Questi chip sono molto frequenti in una moltitudine di applicazioni, infatti, il tuo PC ne ha uno sulla scheda madre, ed è anche alimentato da un Batteria CR2032 anche. È quello che mantiene l'ora e la configurazione nel BIOS / UEFI e da cui il sistema operativo lo prende all'avvio per essere puntuale (anche se ora, con Internet, la sincronizzazione con i server può essere utilizzata per una maggiore precisione, ma questo è un'altra storia ...).

Quello che fa l'RTC è ottenere misurazioni del tempo, così semplice. La differenza rispetto ad altri tipi di orologi elettronici è che semplicemente misurare il tempoe lo fa contando gli impulsi del segnale di clock, conoscendone la frequenza e i periodi. Oltre all'ora, un RTC consente anche di tenere una contabilità dei giorni, delle settimane, dei mesi e degli anni. Cioè, la data completa ...

Affinché ciò sia possibile, l'RTC deve essere accompagnato da un file Xtal o cristallo di quarzo che fungerà da risonatore, quello che fornisce la frequenza. Inoltre, è necessario un circuito elettronico in grado di contare e memorizzare la data in una memoria. Il circuito deve essere in grado di contare secondi, minuti, ore, giorni, settimane, mesi e anni.

che la memoria è volatileEcco perché ha bisogno della batteria, per avere una potenza costante. Se non hai una batteria o si esaurisce, verrà cancellata ... È quello che succede ai PC quando la batteria si esaurisce, danno un orario errato. Se lo configuri mentre il PC è acceso, l'ora verrà mantenuta, poiché l'RTC è alimentato, ma è durante i processi durante i quali è spento quando è necessaria quella batteria ...

Per i progetti fai-da-te, i produttori di solito usano due comuni chip RTC, che sono i DS1307 e DS3231. Entrambi sono realizzati da Maxim (ex Dallas Semiconductor) e il DS3231 è il più preciso dei due, in quanto non è influenzato dalle variazioni di temperatura come il primo. Pertanto, non oscilla così tanto a seconda della temperatura e mantiene il tempo in modo più preciso.

A volte, con notevoli differenze di temperatura, il DS1307 potrebbe essere ritardato fino a 1 o 2 minuti al giorno. Qualcosa di intollerabile per alcune applicazioni.

Il DS3231 non è che non sia influenzato dalle variazioni, ma che ha sistemi integrati di misurazione e compensazione della temperatura per garantire una precisione di 2 ppm, che sarebbe equivalente a un tempo di ritardo di circa 172 ms al giorno, cioè poco più di 1 secondo a settimana al massimo. E in pratica, di solito variano solo 1 o 2 secondi al mese.

Per quanto riguarda la strada comunicare con l'RTC DS3131 per ottenere i valori di data che ottiene, viene eseguito da Bus I2C. E per l'alimentazione, puoi usare 2.3-5.5 v per DS3231, che è leggermente inferiore a 4.5-5.5 v per DS1307, quindi può essere più efficiente dal punto di vista energetico e prolungare la durata della batteria.

Inoltre, dovresti sapere che questi moduli di solito hanno l'estensione EEPROM AT24C32 aggiuntivo per memorizzare alcuni record e misurazioni precedenti, il che è abbastanza pratico.

applicazioni

Per quanto riguarda le applicazioni, ne ho già citate alcune, come implementare un orologio con Arduino, per creare un sistema che agisca in base Il tempo Comunque, per mantenere il tempo su apparecchiature come PC e molti altri dispositivi elettronici e apparecchi che hanno tempo, ecc.

Può essere utilizzato anche in progetti per creare timer per illuminazione, impianti di irrigazione, datalogger, ecc. Le applicazioni possono essere le più numerose ...

Acquista un RTC DS3231

Il modulo DS3131 è economico, e puoi trovarlo in alcuni negozi di elettronica specializzati o in grandi negozi come eBay, AliExpress, Amazon, ecc. Se sei interessato ad averne uno, ecco alcuni consigli:

Integrazione con DS3231 Arduino

Screenshot dell'IDE di Arduino

Se desideri integra il tuo DS3231 con la tua scheda Arduino e iniziare a creare progetti "a tempo", è necessario prima effettuare i collegamenti appropriati. Per poterlo connettere, è semplice come:

  • Il pin SLC della scheda DS3231 deve essere collegato all'A5 del tuo Arduino UNO.
  • SDA del DS3231 è collegato ad A4 di Arduino.
  • Vcc dal modulo andrà a 5V da Arduino.
  • Da GND a GND.
Ricordati di installare la libreria per utilizzare l'RTC DS3231 nel tuo IDE Arduino o il codice non funzionerà ...

Ora che hai il sistema connesso, la prossima cosa è scrivere il file codice sorgente dello schizzo per programmarlo. Puoi modificare i codici e adattarli alle tue esigenze, ma potresti iniziare semplicemente ottenendo la data da un RTC DS3231 collegato ad 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
}

E per utilizzare la data RTC a pianificare un compito, ad esempio per accendere o spegnere le luci, per l'irrigazione automatica o per far suonare un allarme, ecc. Ricorda che per gestire dispositivi a tensione più elevata puoi utilizzare transistor o relé:

#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);
}


Puoi essere il primo a lasciare un commento

Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.