Real-Time Clock Module DS1302 con Arduino

Il modulo MH-Real-Time Clock Module -2   si basa sull’ integrato DS1302 al cui interno è presente un orologio in tempo reale / calendario e 31 byte di RAM statica.

Real-Time Clock Module ds1302

Vediamo le sue caratteristiche e come utilizzarlo con Arduino.

L’integrato DS1302

L’integrato DS1302 è simile al modello DS1307 dal quale si differenzia per alcune particolarità:

  • ha un’interfaccia SPI mentre il DS1307 ha un’interfaccia I2C;
  • può ricarica la batteria, mentre il DS1307 non lo fà;
  • è dotato di un’uscita ad onda quadra programmabile.

Il chip comunica con il microprocessore tramite un’interfaccia seriale. Il modulo RTC (Real Time Clock) / calendario fornisce: secondi, minuti, ore, giorno, data, informazioni Mese, e Anno.
Per l’interfaccia, oltre all’alimentazione, sono necessari solo tre fili : CE (RST), I/O (linea dati), e SCLK (serial clock).
I dati possono essere trasferiti da e verso l’orologio/RAM 1 byte alla volta o in un unico invio fino a 31 byte.
Il DS1302 è progettato per funzionare con una potenza molto bassa e per conservare dati e informazioni di clock con meno di 1μW.
Il DS1302 ha pin di alimentazione doppi, una primaria (Pin #1 #4) e un altro per la batteria di backup (Pin #8 #4), corrente 260 mAh, batteria non ricaricabili. tempo di conservazione dei dati teorica è più di 10 anni.
In questa applicazione per esempio l’alimentazione primaria è fornita da Arduino, e quella secondaria da una batteria CR2032.

Real-Time Clock Module ds1302

Circuito elettrico e PCB del modulo

Qui potete vedere lo schema elettrico del Real-Time Clock Module con DS1302.

Il pin VCC è impostato per accettare l’alimentazione primaria, questa è tipicamente 3.3V, ma può utilizzare 5V. Si raccomanda di non applicare più di 7V, in quanto ciò può danneggiare l’unità. VBAT viene utilizzata per l’alimentazione di backup, fornita dalla batteria 3.3V tipo CR2032.

Real-Time Clock Module ds1302
Il cristallo di quarzo è posto tra i pin # 2 e # 3, mentre i Pin # 5-6-7 sono utilizzati per la comunicazione dei dati tra il modulo e il microcontrollore, è inoltre collegato il pin CE indicato come RST.

Caratteristiche

Alimentazione 3.3V o 5.5V (Max 7V)
Tipo sensore: RTC Uscita digitale
Batteria backup 3.3V tipo CR2032
Temperature operativa 0-70 °C
Imballaggio: Sacchetto sigillato antistatico
Dimensioni del modulo 44 x 23 mm

Foto del modulo

Real-Time Clock Module ds1302

Real-Time Clock Module ds1302

Schema realizzato con EasyEDA: Un servizio per il disegno di circuiti e la loro simulazione, progettazione e produzione di PCB. Provalo è gratuito!

Dove trovare il modulo RTC

Il Modulo RTC per Arduino con DS1302 essere acquistato presso il sito Homotix, la versione testata ha un costo di 1,28 € al momento della pubblicazione di questo articolo.

Se lo acquisterete presso il sito potrete usufruire di uno sconto del 3% inserendo il codice di sconto ADRIROBOT_20

Installazione libreria

Prima di caricare il programma occorre installare l’apposita libreria che può essere scaricata dal sito di Henning Karlsen al seguente link DS1302.
Una volta scaricata la libreria dovrà essere aggiunta a quelle esistente, fare riferimento alle figure sotto riportate. Leggere anche l’articolo Arduino – Tutorial, come installare una libreria

Primo test

Vediamo ora di realizzare un primo progetto. Si tratta della realizzazione di un semplice orologio datario. I dati letti da modulo DS1302, saranno mostrati sul monitor seriale o su apposito display 16×2 collegato con interfaccia I2C.

Materiale occorrente

Per testare il modulo si utilizzano i seguenti componenti

Arduino UNO

Modulo RTC RT

Display LCD 16×2

Cavi colorati per collegamenti

Schema del circuito di prova

Real-Time Clock Module ds1302

Tabella dei collegamenti

Arduino UNODisplay LCDDS 1302
5VVCC
GNDGND
A4SDA
A5SCL
D3VCC
D4GND
D5CLK
D6DAT
D7RST

Real-Time Clock Module ds1302

Real-Time Clock Module ds1302

Real-Time Clock Module ds1302

Sketch applicativo

Il seguente sketch di Arduino verifica il funzionamento del modulo DS1302, mostrando sul monitor seriale o su un  display 16×2 collegato con interfaccia I2C la date e l’ora corrente.

Alla prima esecuzione si dovrà indicare al modulo la data e l’ora corrente, fatto questo si potranno commentare le linee e rieseguire la compilazione, in quanto il valore sarà conservato all’interno della memoria del modulo alimentato dalla batteria di backup.

rtc.setDOW(SATURDAY);       // Imposta il giorno della settimana a SUNDAY
rtc.setTime(16, 22, 0);     // Imposta l'ora come 11:32:00 (Formato 24hr)
rtc.setDate(7, 11, 2020);   // Imposta la data come 7 novembre 2020

Dato che nomi dei giorni sarebbero indicati nomi, è possibile sostituire il file DS1302.cpp con quello scaricabile da questo file, che provvede a scrivere i giorni in italiano.

Noterete una particolarità, l’alimentazione del modulo non è presa dai canonici pin +5V e GND ma dai pin digitali D3 (+5V) e D4 (GND).
Per questo motivo dopo averli impostati come OUTPUT, tramite il comando digitalWrite il pin D4 che è collegato a GND del sensore viene portato a livello LOW, mentre il pin D3 collegato a VCC del sensore viene portato a livello HIGH,

Download Sketch

/*
  Test_DS1302_display.ino
  Creato il 15/12/2016 da Adriano Gandolfo
  Aggiornato il 7/11/2020
   This example code is in the public domain.
*/

#include <DS1302.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define VCC 3 // +5V
#define GND 4 // GND

// Creazione oggetto RTC
DS1302 rtc(7, 6, 5);

// Creazione dell'oggetto LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{
  pinMode(VCC, OUTPUT);    // imposta 'VCC' come output
  pinMode(GND, OUTPUT);    // imposta 'GND' come output
  digitalWrite(VCC, HIGH); //Portiamo VCC a 5V
  digitalWrite(GND, LOW);  //Portimao GND a 0V
  delay (500);

  // Imposta RTC in run-mode e disabilita' la protezione da scrittura
  rtc.halt(false);
  rtc.writeProtect(false);

  // Imposta la comunicazione seriale
  Serial.begin(9600);

  // inizializza il display
  lcd.init();
  lcd.backlight();//accende la retroilluminazione

  // LImpostazione valori nella memori del DS1302
  //rtc.setDOW(SATURDAY);        // Imposta il giorno della settimana a SUNDAY
  //rtc.setTime(16, 22, 0);     // Imposta l'ora come 11:32:00 (Formato 24hr)
  //rtc.setDate(7, 11, 2020);   // Imposta la data come 7 novembre 2020
}

void loop()
{
  // Invia giorno della settimana
  Serial.print(rtc.getDOWStr());
  Serial.print(" ");

  // Invia data
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");

  // Invia ora
  Serial.println(rtc.getTimeStr());

  // Scrive i valori sul display LCD
  lcd.clear();//cancella precedenti valori
  data (); // Scrive su LCD la data
  ora (); // Scrive su LCD l'ora

  // Aspetta un secondo prima di ripetere
  delay (1000);
}

void data ()
{
  lcd.setCursor(0, 0);
  lcd.print(rtc.getDOWStr());
  lcd.print(" ");
  lcd.print(rtc.getDateStr());
}

void ora()
{
  lcd.setCursor(0, 1);
  lcd.print(rtc.getTimeStr());
}

Filmato illustrativo