DS3231: relógio e calendário em tempo real para seu Arduino

DS3231

Em alguns projetos é necessário comprovar a hora, a hora ou a data. Seja pela necessidade de realizar determinadas funções com base no tempo, para manter um calendário de eventos ou registro, para manter a hora em um sistema, ou simplesmente para criar um relógio digital com Arduino. com o DS3231 você pode pegá-lo, outro dos componentes que adicionamos à lista.

O DS3231 é o módulo que você procurava, e aqui você encontrará tudo o que precisa para seu controle e também mostrarei um exemplo de como integrá-lo com o Arduino com um exemplo prático ...

O que é o DS3231?

DS3231

Em primeiro lugar, você deve saber o que RTC (Relógio em tempo real), ou relógio em tempo real. Esses chips são muito freqüentes em uma infinidade de aplicações, na verdade, seu PC possui um deles na placa-mãe, e também é alimentado por um Bateria CR2032 tb. É aquele que mantém o tempo e a configuração na BIOS / UEFI e de onde o sistema operacional o tira ao inicializar para estar no horário (embora agora, com a Internet, a sincronização com servidores possa ser usada para maior precisão, mas esta é outra história ...).

O que o RTC faz é obter medições de tempo, tão simples. A diferença de outros tipos de relógios eletrônicos é que eles simplesmente medir o tempo, e faz isso contando os pulsos do sinal do relógio, sabendo sua frequência e períodos. Além do tempo, um RTC também permite que você mantenha uma contabilidade de dias, semanas, meses e anos. Ou seja, a data completa ...

Para que isso seja possível, o RTC deve vir acompanhado de um Cristal xtal ou quartzo que atuará como um ressonador, aquele que fornece a frequência. Além disso, você precisa de um circuito eletrônico capaz de contar e armazenar a data na memória. O circuito deve ser capaz de contar segundos, minutos, horas, dias, semanas, meses e anos.

Que memória é volátilÉ por isso que precisa da bateria, para ter energia constante. Se você não tem bateria ou ela acaba, vai se apagar ... É o que acontece com os PCs quando a bateria acaba, dão um horário incorreto. Se configurá-lo com o PC ligado, a hora será mantida, já que o RTC está sendo alimentado, mas é durante os processos em que está desligado que essa bateria é necessária ...

Para projetos DIY, os fabricantes costumam usar dois chips RTC comuns, que são os DS1307 e DS3231. Ambos são fabricados pela Maxim (anteriormente Dallas Semiconductor), e o DS3231 é o mais preciso dos dois, pois não é tão afetado pelas variações de temperatura quanto o anterior. Portanto, não oscila muito dependendo da temperatura e mantém o tempo com mais precisão.

Às vezes, com diferenças de temperatura perceptíveis, o DS1307 pode demorar até 1 ou 2 minutos por dia. Algo intolerável para algumas aplicações.

O DS3231 não é que não seja afetado por variações, mas que tem sistemas de medição e compensação de temperatura embutidos para garantir uma precisão de 2 ppm, o que seria equivalente a um atraso de cerca de 172ms por dia, ou seja, um pouco mais de 1 segundo por semana, no máximo. E, na prática, geralmente variam apenas 1 ou 2 segundos por mês.

Quanto ao caminho comunicar com o RTC DS3131 para obter os valores de data que obtém, é feito por Barramento I2C. E para energia, você pode usar 2.3 a 5.5 V para o DS3231, que é um pouco menor do que 4.5 a 5.5 V para o DS1307, então pode ser mais eficiente em termos de energia e fazer a bateria durar mais.

Além disso, você deve saber que esses módulos geralmente têm um EEPROM AT24C32 adicional para armazenar alguns registros e medições anteriores, o que é bastante prático.

Aplicações

Em relação às aplicações, já mencionei algumas, como implementar um relógio com Arduino, criar um sistema que atue baseado em a hora Seja como for, para manter o tempo em equipamentos como PCs e muitos outros dispositivos eletrônicos e aparelhos que têm tempo, etc.

Também pode ser usado em projetos para criar temporizadores para iluminação, sistemas de irrigação, datalogger, etc. As aplicações podem ser as mais numerosas ...

Compre um RTC DS3231

O módulo DS3131 é barato, e você pode encontrá-lo em algumas lojas especializadas de eletrônicos ou em grandes lojas como eBay, AliExpress, Amazon, etc. Se você estiver interessado em ter um, aqui estão algumas recomendações:

Integração com DS3231 Arduino

Captura de tela do Arduino IDE

Se você quiser integre seu DS3231 com sua placa Arduino e começar a criar projetos "cronometrados", você deve primeiro fazer as conexões apropriadas. Para poder conectá-lo, é tão simples como:

  • O pino SLC da placa DS3231 deve ser conectado ao A5 do seu Arduino UNO.
  • O SDA do DS3231 está conectado ao A4 do Arduino.
  • O Vcc do módulo irá para 5V do Arduino.
  • GND para GND.
Lembre-se de instalar a biblioteca para usar o RTC DS3231 em seu Arduino IDE ou o código não funcionará ...

Agora que você tem o sistema conectado, a próxima coisa é escrever o esboço do código fonte para programá-lo. Você pode modificar os códigos e adaptá-los às suas necessidades, mas pode começar simplesmente obtendo a data de um RTC DS3231 conectado ao 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 agende alguma tarefa, como para ligar ou desligar luzes, para rega automática ou para soar um alarme, etc. Lembre-se de que para lidar com dispositivos de alta tensão, você pode usar transistores ou confiou:

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


Seja o primeiro a comentar

Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.