DS3231: reloxo e calendario en tempo real para o teu Arduino

DS3231

Nalgúns proxectos é necesario ter unha proba da hora, a hora ou a data. Ou ben debido á necesidade de realizar certas funcións en función do tempo, manter un calendario de eventos ou rexistro, gardar a hora nun sistema ou simplemente crear un reloxo dixital con Arduino. Con o DS3231 podes conseguilo, outro dos compoñentes que engadimos á lista.

O DS3231 é o módulo que buscabas e aquí atoparás todo o que necesitas para o seu control e tamén che amosarei un exemplo de como intégralo con Arduino cun exemplo práctico ...

Que é o DS3231?

DS3231

Primeiro de todo, debes saber que RTC (reloxo en tempo real), ou reloxo en tempo real. Estes chips son moi frecuentes en multitude de aplicacións, de feito, o seu PC ten un deles na súa placa base e tamén funciona cunha Batería CR2032 tamén. É o que mantén o tempo e a configuración no BIOS / UEFI e do que o sistema operativo o leva ao arrincar para que sexa puntual (aínda que agora, con Internet, a sincronización cos servidores pode usarse para unha maior precisión, pero isto é outra historia ...).

O que fai o RTC é obter medicións de tempo, tan sinxelo. A diferenza doutros tipos de reloxos electrónicos é que simplemente mide o tempo, e faino contando os impulsos do sinal do reloxo, coñecendo a súa frecuencia e períodos. Ademais do tempo, un RTC tamén lle permite manter unha contabilidade de días, semanas, meses e anos. É dicir, a data completa ...

Para que isto sexa posible, o RTC debe ir acompañado dun Xtal ou cristal de cuarzo que actuará como resonador, o que proporciona a frecuencia. Ademais, necesitas circuítos electrónicos capaces de contar e almacenar a data nunha memoria. Os circuítos deben ser capaces de contar segundos, minutos, horas, días, semanas, meses e anos.

ESA a memoria é volátilÉ por iso que precisa a batería para ter unha potencia constante. Se non tes unha batería ou se esgota, borrarase ... Iso é o que lles pasa aos ordenadores cando se esgota a batería, dan un tempo incorrecto. Se o configuras mentres o PC está acendido, manterase o tempo, xa que o RTC está a ser alimentado, pero é durante os procesos durante os cales está apagado cando se precisa esa batería ...

Para proxectos de bricolaxe, os fabricantes adoitan empregar dous chips RTC comúns, que son os DS1307 e DS3231. Os dous son fabricados por Maxim (antigo Dallas Semiconductor) e o DS3231 é o máis preciso dos dous, xa que non está tan afectado polas variacións de temperatura como o fai o primeiro. Polo tanto, non fluctúa tanto dependendo da temperatura e mantén o tempo con máis precisión.

Ás veces, con notables diferenzas de temperatura, o DS1307 pode quedar atrasado como 1 ou 2 minutos ao día. Algo intolerable para algunhas aplicacións.

O DS3231 non é que non se vexa afectado por variacións, senón que ten sistemas de medición e compensación de temperatura incorporados para garantir unha precisión de 2 ppm, que igualaría atraso de aproximadamente 172 ms ao día, é dicir, algo máis de 1 segundo por semana como máximo. E na práctica, normalmente varían só 1 ou 2 segundos ao mes.

En canto ao camiño comunicarse co RTC DS3131 para obter os valores de data que obtén, faise por Autobús I2C. E para o consumo de enerxía, pode usar de 2.3 a 5.5 v para o DS3231, que é algo inferior ao de 4.5 a 5.5 v para o DS1307, polo que pode ser máis eficiente enerxeticamente e facer que a batería dure máis.

Ademais, debes saber que estes módulos normalmente teñen un EEPROM AT24C32 adicional para almacenar algúns rexistros e medicións anteriores, o que é bastante práctico.

aplicacións

En canto ás aplicacións, xa mencionei algunhas, como a implementación dun reloxo con Arduino, para crear un sistema que actúe en base a Tempo Sexa o que sexa, para manter o tempo en equipos como PCs e moitos outros dispositivos e dispositivos electrónicos que teñen tempo, etc.

Tamén se pode usar en proxectos para crear temporizadores para iluminación, sistemas de rega, rexistro de datos, etc. As aplicacións poden ser as máis numerosas ...

Compra un RTC DS3231

O módulo DS3131 é barato, e podes atopalo nalgunhas tendas de electrónica especializadas ou en grandes tendas como eBay, AliExpress, Amazon, etc. Se estás interesado en telo, aquí tes algunhas recomendacións:

Integración con Arduino DS3231

Captura de pantalla IDE Arduino

Se queres integra o teu DS3231 coa túa placa Arduino e comeza a crear proxectos "cronometrados", primeiro debes facer as conexións adecuadas. Para poder conectalo é tan sinxelo como:

  • O pin SLC da placa DS3231 debe estar conectado ao A5 do seu Arduino UNO.
  • A SDA do DS3231 está conectada ao A4 de Arduino.
  • Vcc do módulo irá a 5V de Arduino.
  • GND para GND.
Lembre instalar a biblioteca para usar o RTC DS3231 no seu IDE Arduino ou o código non funcionará ...

Agora tes o sistema conectado, o seguinte é escribir o esbozar o código fonte para programalo. Pode modificar os códigos e adaptalos ás súas necesidades, pero pode comezar simplemente obtendo a data dun RTC DS3231 conectado 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
}

E para usar a data RTC para programa algunha tarefa, como para acender ou apagar luces, para regar automáticamente ou para que soe unha alarma, etc. Lembre que para manipular dispositivos de alta tensión pode empregar transistores ou relevo:

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


O contido do artigo adhírese aos nosos principios de ética editorial. Para informar dun erro faga clic en aquí.

Sexa o primeiro en opinar sobre

Deixa o teu comentario

Enderezo de correo electrónico non será publicado.

*

*

  1. Responsable dos datos: Miguel Ángel Gatón
  2. Finalidade dos datos: controlar SPAM, xestión de comentarios.
  3. Lexitimación: o seu consentimento
  4. Comunicación dos datos: os datos non serán comunicados a terceiros salvo obrigación legal.
  5. Almacenamento de datos: base de datos aloxada por Occentus Networks (UE)
  6. Dereitos: en calquera momento pode limitar, recuperar e eliminar a súa información.

Proba de inglésProba de cataláncuestionario español