Medindo o tempo 2: RTC

Descrición:

Un módulo RTC (Real Time Clock) ou “Reloxo de tempo real” consiste nun circuíto integrado alimentado por unha batería que rexistra en todo momento a data, o día da semana e o tempo, así como un reloxo dixital convencional. Resulta interesante utilizalo cando queremos que a data, día da semana, e a hora estean sempre dispoñibles independentemente da alimentación da tarxeta arduino.

Hai moitos modelos. O que temos no taller é o reloxo DS1302.

O chip DS1302 contén un reloxo/calendario en tempo real con 31 bytes de RAM estática. O RTC DS1302 proporciona información sobre segundos, minutos, horas, día, data, mes e ano. A data de fin de mes axústase automaticamente para meses con menos de 31 días, incluídas as correccións do ano bisesto. O reloxo funciona en formato 24 ou 12 horas cun indicador AM/PM. 

Conexión:

O módulo RTC DS1302 comunícase co microprocesador a través dunha interface serie. Temos 5 pins, os dous de alimentación (VCC 5V e GND 0V) e os tres de envío de datos (CLK, DAT, RST) que imos conectar nos seguintes pins:

  • CLK: D6
  • DAT: D7
  • RST: D8

Programa:

Necesitamos instalar a librería que controla o módulo RTC. Podes descargala aquí: DS1302.zip.

Para programar podes utilizar as seguintes variables:

  • t.sec (segundos)
  • t.min (minutos)
  • t.hour (hora)
  • t.date (día)
  • t.mon (mes)
  • t.dow (día da semana)
  • t.year (ano)

1. Mostrar o tempo

1. Mostrar o tempo: Imos mostrar a data, a hora e o día da semana na consola serie.
// Librarías:

#include <DS1302.h>

// Declaración de variables:

DS1302 rtc(8,7,6);  // DS1302 rtc(RST_PIN, IO_PIN, CLK_PIN);

Time t;   // Inicia unha variable t con estrutura de datos de tempo

// Configuración:

void setup() {

  Serial.begin(9600);  // inicia a comunicación serie.

  /* Estas ordes soamente se usan a primeira vez para poñer en hora o reloxo
  Introduce a data e horas actuais, quita os comentarios e carga o programa 
  Comenta estas instrucións e volve cargar o programa */
  // rtc.setTime(14, 50, 00);  // Configurar hora en formato 24hs con min y seg: 13:28:00 HORAS.
  // rtc.setDate(26, 4, 2021);  // Configurar fecha en formato dia/mes/año: 28/6/2018.
  // rtc.setDOW(MONDAY);

}

// Programa:

void loop() {

  t = rtc.getTime();  // Colle os datos de tempo do reloxo DS1302 e dalle ese valor á variable t

  Serial.print("Data:");
  Serial.print(rtc.getDOWStr()); // Imprime o día da semana
  Serial.print(" ");
  Serial.print(rtc.getDateStr());    //imprime a data 
  Serial.print("  -  Hora:");
  Serial.println(rtc.getTimeStr());   //imprime a hora

  delay(2000);   //lectura  cada 2 segundos

  /* Tamén podemos chamar ás variables por separado. Por exemplo:
  Serial.print("hora:");
  Serial.println(t.hour);
  */
  
}

2. programar acendido/apagado

2. programar acendido/apagado: Agora imos facer que un led se acenda e se apague en períodos de tempo determinados por nós. Por exemplo, neste programa, acendemos un LED cando o minuteiro marca desde 50 ata 55 minutos. Se non estará apagado.
// Librarías:

#include <DS1302.h>


// Declaración de variables:

DS1302 rtc(8,7,6);  // DS1302 rtc(RST_PIN, IO_PIN, CLK_PIN);
Time t;   // Inicia unha variable t con estrutura de datos de tempo

int led = 13; // LED no pin 13

// Configuración:

void setup() {

  pinMode(led, OUTPUT);   // Configura o LED como saída
  Serial.begin(9600);  // inicia a comunicación serie.

  /* Estas ordes soamente se usan a primeira vez para poñer en hora o reloxo
  Introduce a data e horas actuais, quita os comentarios e carga o programa 
  Comenta estas instrucións e volve cargar o programa */
  // rtc.setTime(14, 50, 00);  // Configurar hora en formato 24hs con min y seg: 13:28:00 HORAS.
  // rtc.setDate(26, 4, 2021);  // Configurar fecha en formato dia/mes/año: 28/6/2018.
  // rtc.setDOW(MONDAY);  // Configurar o sía da semana
}


// Programa:

void loop() {

  t = rtc.getTime();  // Colle os datos de tempo do reloxo DS1302 e dalle ese valor á variable t

  Serial.print("Hora:");
  Serial.println(rtc.getTimeStr());   //imprime a hora
  
  delay(2000);   //lectura  cada 2 segundos

  if (t.min >= 50 && t.min<=55){
    digitalWrite(led, HIGH);
  }
  else{
    digitalWrite(led, LOW);
  }
}

Propostas:

  1. Proba o segundo programa do led, pero nun período de minutos que se achegue ao deste momento. Por exemplo, se agora son as 9:20 prográmao para que se acenda de 9:25 a 9:27.
  2. Fai que un led se acenda cada día desde as 10h e 30 min ata as 11h en punto.
  3. Fai que un led se acenda cada luns desde as 16 ata as 19h.