DS3231: rellotge en temps real i calendari per a la teva Arduino

DS3231

En alguns projectes es necessita tenir constància de el temps, de l'hora, o la data. Ja sigui per la necessitat de realitzar certes funcions en funció de el temps, per mantenir un calendari d'esdeveniments o registre, per mantenir l'hora en un sistema, o simplement per crear un rellotge digital amb Arduino. Amb el DS3231 podràs aconseguir-ho, un altre dels components que afegim a la llista.

El DS3231 és el mòdul que estaves buscant, i aquí trobaràs tot el que necessites per al seu control i també et mostraré un exemple de com integrar-lo amb Arduino amb un exemple pràctic ...

Què és el DS3231?

DS3231

Abans de res, hauries de saber què és un RTC (Real Time Clock), O rellotge de temps real. Aquests xips són molt freqüents en multitud d'aplicacions, de fet, el teu PC té un d'ells en la teva placa base, i està alimentat també per una pila CR2032 també. És la que manté l'hora i la configuració al BIOS / UEFI i de què l'agafa el sistema operatiu a l'arrencar per estar en hora (tot i que ara, amb Internet, es pot usar la sincronització amb servidors per a més precisió, però això és una altra història ...).

El RTC el que fa és obtenir mesuraments de temps, així de simple. La diferència amb altres tipus de rellotges electrònics és que simplement mesura el temps, I ho fa comptabilitzant polsos de senyal de rellotge, sabent la freqüència i períodes de la mateixa. A més de l'hora, XNUMX RTC també permet portar una comptabilitat dels dies, setmanes, mesos i anys. És a dir, la data completa ...

Perquè això sigui possible, el RTC ha d'anar acompanyat d'un Xtal o cristall de quars que actuarà com ressonador, el que aporta la freqüència. Addicionalment, necessita una circuiteria electrònica capaç de portar el recompte i emmagatzemar la data en una memòria. La circuiteria ha de ser capaç de comptabilitzar segons, minuts, hores, dies, setmanes, mesos i anys.

aquesta memòria és volàtil, Per això necessita de la pila, per tenir alimentació constant. Si no té pila o s'esgota, s'esborrarà ... Això és el que li passa als PCs quan se li esgota la pila, donen una hora incorrecta. Si la configures mentre el PC està encès, l'hora es mantindrà, ja que el RTC s'està alimentant, però és durant els processos durant els quals està apagat quan es necessita d'aquesta bateria ...

Per a projectes DIY, els makers solen usar dos xips RTC habituals, que són el DS1307 i el DS3231. Tots dos es fabriquen per Maxim (abans Dallas Semiconductor), i és el DS3231 el més precís dels dos, ja que no es veu tan afectat per variacions de temperatura com ho fa el primer. Per això, no fluctua tant depenent de la temperatura, i manté l'hora de forma més precisa.

De vegades, amb diferències de temperatura notables, el DS1307 podria tenir un desfasament de fins a 1 o 2 min a el dia. Una cosa intolerable per a algunes aplicacions.

El DS3231 no és que no es vegi afectat per les variacions, sinó que té sistemes de mesurament i compensació de la temperatura predefinit per garantir una precisió de 2ppm, el que equivaldria a un desfasament de temps d'uns 172ms a el dia, és a dir, una mica més d'1 segon a la setmana com a màxima. I en la pràctica, solen variar només 1 o 2 segons a el mes.

Pel que fa a la forma d' comunicar-se amb el RTC DS3131 per obtenir els valors de data que aconsegueix, es fa mitjançant bus I2C. I per a l'alimentació, pots usar 2.3 a 5.5V per al DS3231, el que és una mica més baix que els 4.5 a 5.5V de l'DS1307, pel que pot ser més eficient energèticament i fer que la pila duri més.

A més, has de saber que aquests mòduls solen tenir una EEPROM addicional AT24C32 per emmagatzemar alguns registres i mesuraments prèvies, el que és bastant pràctic.

aplicacions

Pel que fa a les aplicacions, ja he citat algunes, com per implementar un rellotge amb Arduino, per crear un sistema que actuï en funció de l'hora que sigui, per mantenir l hora en equips com PC i molts altres dispositius electrònics i electrodomèstics que tenen hora, etc.

També es pot usar en projectes per crear temporitzadors per a il·luminació, sistemes de reg, datalogger, etc. Les aplicacions poden ser d'allò més nombroses ...

Comprar un RTC DS3231

el mòdul DS3131 és barat, I el pots trobar en algunes botigues especialitzades d'electrònica o en grans superfícies com eBay, AliExpress, Amazon, etc. Si t'interessa tenir un, aquí tens algunes recomanacions:

Integració amb Arduino de l'DS3231

Captura d'Arduino IDE

Si vols integrar el teu DS3231 amb la teva placa Arduino i començar a crear projectes «temporitzats», primer has de fer les connexions oportunes. Per poder-ho connectar, és tan simple com:

  • El pin SLC de la placa DS3231 has connectar-lo a l'A5 del teu Arduino UNO.
  • SDA de l'DS3231 va connectat a A4 d'Arduino.
  • Vcc de la lliçó anirà a 5V d'Arduino.
  • GND a GND.
Recorda instal·lar la biblioteca per utilitzar el RTC DS3231 al teu Arduino IDE o no funcionarà el codi ...

Ara ja tens connectat el sistema, el següent és escriure el codi font de l'esquetx per programar-lo. Pots modificar els codis i adaptar-los a les teves necessitats, però podries començar per simplement obtenir la data d'un RTC DS3231 connectat a 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
}

I per poder usar la data de l'RTC per programar alguna tasca, Com per exemple pel enendido o apagat d'unes llums, per un reg automàtic, o perquè soni una alarma, etc. Recorda que per a manejar dispositius de major voltatge pots utilitzar transistors 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);
}


El contingut d'l'article s'adhereix als nostres principis de ètica editorial. Per notificar un error punxa aquí.

Sigues el primer a comentar

Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.