DS1302 REAL TIME CLOCK (RTC) com Arduino

O DS1302 é um circuito integrado que realiza um trabalho de contagem do tempo em tempo real (RTC) de forma independente do microcontrolador e com apenas uma bateria de 3v usado em balanças pode realizar esse trabalho por anos.

Aplicações

  • Datalogger;
  • Estações meteorológicas;
  • Relógio;
  • Alarmes.

Especificações

  • Voltagem de Trabalho: 2v ~ 5v5;
  • Corrente de Trabalho: 300nA;
  • Encapsulamento: PID e SO;
  • Interfaces de comunicação: 3 Fios.

Faixa de contagem

  • Segundos;
  • Minutos;
  • Horas;
  • Data do mês;
  • Mês;
  • Dia da semana e ano com ano bissexto;
  • Compensação válida até 2100.

DS1302 Peculiaridades

O DS1302 é vendido como módulo em diversas lojas e até mesmo em nossa loja na shopee mas caso tenha os componentes, pode ser montado de forma muito fácil pois o circuito é composto pelo CI, cristal de 32,768kHz e um slote para bateria de 3v.

Fonte: acoptex

DS1302 e Arduino Diagrama

Como não foi encontrado uma biblioteca para ilustrar o módulo RTC no programa Fritzing, foi recriado na protoboad, e os fios Amarelo, Verde e laranja representam respectivamente: CE, IO/DATA e SCLK.

Código do DS1302 com Arduino

Existem diversas bibliotecas para usar o DS1302 com Arduinos e ESP32, mas em diversos testes realizado houve alguns problemas ao decorrer do tempo como os agilizar muito o tempo e dias. No entanto, a biblioteca que deu a maior mobilidade e não apresentou problemas foi a do Matt Sparks.

#include <stdio.h>
#include <DS1302.h>

namespace {
  const int kCePin   = 8;  // Chip Enable
  const int kIoPin   = 7;  // Input/Output
  const int kSclkPin = 6;  // Serial Clock
  
  DS1302 rtc(kCePin, kIoPin, kSclkPin);
  
  String dayAsString(const Time::Day day) {
    switch (day) {
      case Time::kSunday: return "Sunday";
      case Time::kMonday: return "Monday";
      case Time::kTuesday: return "Tuesday";
      case Time::kWednesday: return "Wednesday";
      case Time::kThursday: return "Thursday";
      case Time::kFriday: return "Friday";
      case Time::kSaturday: return "Saturday";
    }
    return "(unknown day)";
  }
  
  void printTime() {
    Time t = rtc.time();
  
    const String day = dayAsString(t.day);
  
    char buf[50];
    snprintf(buf, sizeof(buf), "%04d/%02d/%02d %02d:%02d:%02d",
             t.yr, t.mon, t.date,
             t.hr, t.min, t.sec);
  
    Serial.println(buf);
  }
}

void setup() {
  Serial.begin(9600);

  rtc.writeProtect(false);
  rtc.halt(false);

  Time t(2021, 6, 27, 22, 14, 00, Time::kSunday);

  rtc.time(t);
}

void loop() {
  printTime();
  delay(1000);
}


Funcionamento

No vídeo abaixo é a saída serial do Arduino e durante alguns momentos foi resetado o nano para mostrar que o DS1302 continua contando o tempo, o mesmo acontece caso desligue o RTC e esteja com bateria.

Considerações

O DS1302 é um componente muito simples de ser usado para implementação de RTC em projetos com Arduino, usando apenas 3 componentes.


Deixe uma resposta