ARDUINO
Real-Time Clock Modules DS1307

ultimo aggiornamento 18 febbraio 2017


JLCPCB - 2$ per prototipi di PCB, di qualsiasi colore. Produzione in 24 ore!
L'Azienda di prototipi PCB più popolare, con oltre 700.000 clienti in tutto il mondo!
Recati presso la JLCPCB, riceverai regali e coupon gratuiti
presso Maker Faire Rome il 18-20 ottobre


Indice

Descrizione

Modulo Real Time Clock Module codice BOB12708 progettato dalla SparkFun utilizza il Chip DS1307 un Clock in Real Time prodotto dalla Dallas è un orologio in tempo reale seriale a basso consumo, i dati (orario e calendario) sono forniti in codice binario decimale (BCD).
Il modulo arriva assemblato e preprogrammato con l'ora MST.  La cella al Litio inclusa (CR1225 41mAh) assicura una durata minima di 9 anni (tipica 17 anni) senza alcuna alimentazione esterna.

DS1307 64 x 8 Serial Real-Time Clock

Piedinatura Datasheet Foto dell'integrato

OurPCB, your most reliable PCB and PCBA supplier.

Focusing on PCB Prototype and PCB Assembly Turnkey Services.

One-Stop Wire Harness & Cable Assemblies Solution

In alternativa è possibile utilizzare il modulo MH-Real-Time Clock Module - 2 che si basa sull' integrato DS1302

DS1302 Trickle-Charge Timekeeping Chip

Piedinatura Datasheet Foto dell'integrato

Caratteristiche

Alimentazione:

5 V

Tipo sensore:

 RTC Uscita digitale

Batteria backup

 3.3V tipo CR1225

Interfaccia:

 I2C

Dimensioni del modulo

 20x 20 mm

Altre caratteristiche

- Ore : Minuti : Secondi AM/PM
- Giorno : Mese : Anno
- Compensazione anno bisestile
- Accurato calendario fino all'anno 2100
- 1Hz output pin
- 56 Bytes di memoria Non-volatile memory
   disponibile per l'utente

Foto del modulo

Vista frontale del modulo

Vista posteriore - batteria di alimentazione

Il DS1307 e' accessibile tramite protocollo  I2C, il bus è composto da 2 linee chiamate SDA (dati) e SCL (clock), entrambe del tipo a collettore aperto. La linea SDA e' di tipo bidirezionale, e permette lo scambio dei dati tra i dispositivi I2C collegati, mentre la linea SCL e' unidirezionale e serve come clock per sincronizzare la comunicazione.

L'orologio/calendario fornisce secondi, minuti, ore, giorno, data, mese e informazioni anno.  La fine della data del mese è regolata automaticamente per mesi con meno di 31 giorni, comprese le correzioni per l'anno bisestile. L'orologio funziona sia nel formato 24 ore o 12 ore con indicatore AM / PM.
L'integrato DS1307 è dotato di un circuito che nel caso rilevi la mancanza di corrente e passa automaticamente all'alimentazione a batteria.

 

 

Lo schema della scheda è semplice oltre all'integrato DS1307 è presente il quarzo da 32.768 KHz, che fornisce il clock. Il condensatore C1 disaccoppia l'alimentazione.    Per il mantenimento delle informazioni interne è presente la piccola batteria a bottone da 3.3V.
Sono poi presenti i segnali verso il processore esterno

SQW/Out Square Wave  Quando è abilitata, il bit SQWE impostato a 1, il pin di uscita SQW  emette una delle quattro frequenze di onda quadra (1Hz, 4 kHz, 8 kHz, 32 kHz). Il SQW / OUT pin è open drain e richiede un resistore esterno di pull-up. SQW/OUT funziona sia con Vcc o Vbat applicata.
SCL (Serial Clock Input) - SCL viene utilizzato per sincronizzare lo spostamento dei dati
sull'interaccia seriale.
SDA (Serial DAta Input / Output) - SDA è l'input / output pin per il 2-wire interfaccia seriale. Il pin SDA è open drain e richiede una resistenza  di pullup.esterna.

 

Utilizzo con Arduino UNO e Clone - Uscita su display

In questa pagina è illustrato l'utilizzo del Modulo Real Time Clock Module progettato dalla SparkFun che utilizza il Chip DS1307 un Clock in Real Time che è un orologio in tempo reale seriale a basso consumo, i dati (orario e calendario) sono forniti in codice binario decimale (BCD).
I dati letti sono poi mostrati su un modulo display, dotato di alcuni pulsanti, che però non sono utilizzati in questo programma. Per dettagli sul modulo display vedere la pagina di presentazione del display.
Sono utilizzate in questo progetto.

Luigino 238

LCD keypad HMT LCDS01

Modulo DS1307

Nota: I componenti utilizzati in questo progetto possono essere sostituiti con altri, occorre però verificare i pin utilizzati e modificare il programma di conseguenza.

 Luigino 328 - Scheda Arduino compatibile utilizzata

Luigino328 - Fronte

Luigino328 - Retro

Modulo LCD utilizzato

Attenzione: il modulo qui utilizzato non è più commercializzato, ma può essere sostituito con o Shield per Arduino MICROBOT Codice prodotto MBT0009

Modulo LCD leypad - Fronte

Modulo LCD leypad - retro

Collegamento del modulo RTC ad Arduino  tramite il modulo LCD

Collegamento del modulo ad Arduino: +5V, GND, SDA, SCL

Dettaglio connettore

Programma utilizzato per le prove

Programma IDE Arduino 1.0.1 o succ

Programma  IDE Arduino 0023

 

 
/*
 orologio_uno.ino
 Il programma mostra il funzionamento del modulo
 Modulo Real Time Clock DS1307 della SparkFun
 mostrando ora e data sul modulo LCD KeyPad della Homotix.
 Attenzione: verificare la corrispondenza dei pin del vostro modulo display
 
 Vengono utilizzati i seguenti pin
 Pin +5V         -> +5V (LCD e DS1307)
 Pin GND         -> GND (LCD e DS1307)
 Pin Vin         -> +9V Batteria
 Pin Digital 13  -> Bus D4 dati LCD
 Pin Digital 12  -> Bus D5 dati LCD
 Pin Digital 11  -> Bus D6 dati LCD
 Pin Digital 10  -> Bus D7 dati LCD
 Pin Digital 7   -> terminale RS display LCD
 Pin Digital 8   -> terminale EN display LCD
 Pin Digital 9   -> attivazione retroilluminazione
 
 Pin Analogic 4  -> SDA DS1307 Sparkfun
 Pin Analogic 5  -> SCL DS1307 Sparkfun
 
 Creato il 07/07/2012
 Modificato il 21/3/2015
 da Adriano Gandolfo <https://www.adrirobot.it>
 This example code is in the public domain.
 */

#include <Wire.h>          // Per gestione comunicazione I2C
#include <LiquidCrystal.h> // Per gestione modulo LCD
#define DS1307_I2C_ADDRESS 0x68


// Selezione dei pin utilizzati dal display LCD
// Sintassi LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(7, 8, 13, 12, 11, 10);

int backLight = 9; // per controllo retroilluminazione LCD

// Conversione normali numeri decimali in binario decimale
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}
// Conversione decimale binario a normali numeri decimali
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}
/* 
 1) Imposta la data e l'ora del DS1307
 2) Avvia l'orologio
 3) Imposta la modalità di ora in orologio a 24 ore
 */
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.write(decToBcd(second)); // 0 to bit 7 avvia l'orologio
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(dayOfWeek));
  Wire.write(decToBcd(dayOfMonth));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(0x10); 
// invia 0x10 (hex) 00010000 (binario) al registro
// di controllo - si attiva ad onda quadra
  Wire.endTransmission();
}
// Ottiene la data e l'ora dal DS1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  // Ripristina il puntatore del registro
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
  // Alcuni di questi sono necessari, perché
  //le maschere di alcuni bit sono bit di controllo
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
// Occorre modificare questo se 12 ore am/pm
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}
void setup()
{
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH); // attiva la retroilluminazione

  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  Wire.begin();
  Serial.begin(9600);
 /*
 Modificare i successivi valori se si desidera impostare l'orologio.
 Occorre attivare la linea setDateDs1307 una volta quindi rimuovere
 la chiamata.
 */
  second = 0;
  minute = 56;
  hour = 11;
  dayOfWeek = 7;
  dayOfMonth = 21;
  month = 03;
  year = 15;

//  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
  
  lcd.begin(16, 2); // Imposta le dimensioni dell'LCD

}
void loop()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  lcd.clear(); // Pulisce lo schermo LCD
  lcd.setCursor(0,0);
  lcd.print(" ");
  lcd.print(hour, DEC);
  lcd.print(":");
  if (minute<10)
  {
    lcd.print("0");
  }
  lcd.print(minute, DEC);
  lcd.print(":");
  if (second<10)
  {
    lcd.print("0");
  }
  lcd.print(second, DEC);
  lcd.setCursor(0,1);
  lcd.print(" ");
  switch(dayOfWeek){
  case 1:
    lcd.print("Dom");
    break;
  case 2:
    lcd.print("Lun");
    break;
  case 3:
    lcd.print("Mar");
    break;
  case 4:
    lcd.print("Mer");
    break;
  case 5:
    lcd.print("Gio");
    break;
  case 6:
    lcd.print("Ven");
    break;
  case 7:
    lcd.print("Sab");
    break;
  }
  lcd.print(" ");
  lcd.print(dayOfMonth, DEC);
  lcd.print("/");
  lcd.print(month, DEC);
  lcd.print("/20");
  lcd.print(year, DEC);
  delay(1000);
}

Utilizzo con Arduino DUE - Uscita su display LCD

Viene qui illustrato l'utilizzo del Modulo Real Time Clock Module codice BOB12708 progettato dalla SparkFun utilizzando la scheda Arduino DUE

Arduino DUE Modulo DS1307 Display LCD

 Scheda Arduino DUE

Vista superiore della scheda

Vista inferiore della scheda

Anche se il modulo è alimentato a +5V l'uscita è compatibile con i pin I2C (Pin A4 e A5) della scheda Arduino DUE che funzionano a +3,3V, Per l'utilizzo viene utilizzata una speciale versione di libreria che può essere scaricata a questo link. Sono utilizzati i seguenti pin
 

Pin Funzione
Pin +5V +5V (LCD, DS1307)
Pin GND GND (LCD, DS1307
Pin SDA (D20) SDA DS1307
Pin SCL (D21) SCL DS1307
TX1 (D18) RX LCD

Pin per comunicazione SERIALE con il modulo LCD

La scheda Arduino DUE dispone di 4 gruppi di pin per la comunicazione seriale, diversamente dai modelli precedenti che erano TTL a 5V queste sono TTL a 3,3V. I pin N.0 e N.1 sono collegati direttamente ai corrispondenti pin del chip IC6 tipo ATmega16U2 utilizzato come convertitore USB/Seriale

Seriale

Pin RX Pin TX

Seriale N.0

0

1

Seriale N.1

19

18

Seriale N.2

17

16

Seriale N.3

15

14

Pin connessione TWI/ I2C con modulo RTC

La scheda Arduino Due  ha due gruppi di porte per connessione secondo il protocollo hardware TWI detto anche I2C  formato da due linee seriali di comunicazione.   La porta 2 dispone già di resistori di pull-up da 1,5 kΏ.  Il piedino supporta la connessione TWI utilizzando la libreria Wire. Vedere anche http://it.wikipedia.org/wiki/I%C2%B2C

SDA (Serial DAta line) per i dati
SCL (Serial Clock Line) per il clock

TWI Pin SDA Pin SCL
1 SDA -20 (PB12) SCL-21 (PB13)
2 SDA 1 (PA17) SCL 1 (PA18)

 

 

Programma IDE Arduino 1.5.2

Libreria RTClib

 

 

 
#include <Wire.h>
#include <RTClib.h>
//include le librerie necessarie al funzionamento del programma

char buffer[10];
//si definisce una variabile di tipo array char di 10 bit denominata buffer 

RTC_DS1307 rtc;
// Si definisce l’istanza RTC di tipo RTD_DS1307
// questo indica alla classse RTClib.h che tipo di chip RTC si utilizza

void setup () {
  Serial1.begin(9600);
  //Imposta velocità porta comunicazione con LCD
  //connesso alla porta seriale 1 
  clearLCD();
  //Cancella lo schermo del display
  Wire.begin();
  rtc.begin();
  //inizializza le istanze relative alle classi incluse
  //rtc.adjust(DateTime(2013,02,23,16,21,00));
  //Attivare la linea per impostare il DS1307
}

void loop() {
  DateTime now = rtc.now();
  //con il metodo now() della classe RTC si recupera l’ora dal DS1307
  clearLCD();
  //Pulisce lo schermo del display
  selectLineOne();
  //Seleziona la linea 1 del display
  sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  //i metodi hour(), minute() e second() della classe RTC recuperano 
  //recuperano ora, minuti e secondi impostati nel DS1307 dal metodo now()
  //la funzione sprintf() memorizza i 3 valori nella variabile buffer
  Serial1.print(buffer);
  //Invia il valore della variabile buffer con il formato hh:mm:ss;
  //al display
  selectLineTwo();
  //Seleziona la linea 2 del display
  sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year()); 
  //I metodi day(), month() e year() della classe RTC recuperano 
  //il giorno, mese ed anno correnti impostati nel DS1307 dal metodo now()
  //la funzione sprintf() memorizza i 3 valori nella variabile buffer
  Serial1.print(buffer);
  //Invia il valore della variabile buffer con il formato gg/mm/aaaa 
  //al display
  delay (1000);
  //attesa 1000 millisecondi (un secondo) prima di
  //eseguire un nuovo ciclo di lopp()
}

// Resetta il display, annullando qualsiasi scorrimento
// e la rimozione di tutto il testo
void clearLCD() {
  serCommand();
  Serial1.write(byte (0x01));
}

// Avvia il cursore all'inizio della prima linea
void selectLineOne() {  //sposta il cursore alla riga 0 carattere 0
  serCommand();   //command flag
  Serial1.write(byte (128));
}

// Sposta il cursore all'inizio della seconda linea
void selectLineTwo() {  //sposta il cursore alla riga 2 carattere 0
  serCommand();   //command flag
  Serial1.write(byte (192));
}

// Invia un comando al display
void serCommand() {
  Serial1.write(byte (0xFE));
}

Utilizzo con Arduino DUE - Uscita su monitor seriale

Se non si possiede il display LCD è possibile visualizzare ora e data nella finestra del monitor seriale. Si utilizza sempre il Modulo Real Time Clock Module codice BOB-00099. Sono utilizzati in questo progetto.

Arduino DUE Modulo DS1307

Anche se il modulo è alimentato a +5V l'uscita è compatibile con i pin I2C (Pin D20 e D21) della scheda Arduino DUE che funzionano a +3,3V
Per l'utilizzo viene utilizzata una speciale versione di libreria che può essere scaricata a questo link
Sono utilizzati i seguenti pin

Pin Funzione
Pin +5V +5V DS1307
Pin GND GND DS1307
Pin SDA (D20) SDA DS1307
Pin SCL (D21) SCL DS1307

 

 


Programma IDE Arduino 1.5.2

Libreria RTClib

 

 
#include <Wire.h>
#include <RTClib.h>
//include le librerie necessarie al funzionamento del programma

char buffer[10];
//si definisce una variabile di tipo array char di 10 bit denominata buffer 

RTC_DS1307 rtc;
// Si definisce l’istanza RTC di tipo RTD_DS1307
// questo indica alla classse RTClib.h che tipo di chip RTC si utilizza

void setup () {
  Serial.begin(9600);
  //Si imposta la velocità della porta di comunicazione
  //con la finestra di debug
  Serial.println("Orologio con DS1307");
  Serial.println("Uso con Arduino DUE");
  Serial.println(" ");
  Wire.begin();
  rtc.begin();
  //inizializza le istanze relative alle classi incluse
  //rtc.adjust(DateTime(2013,02,23,16,21,00));
   //Attivare la linea per impostare il DS1307
}

void loop() {
  DateTime now = rtc.now();
  //Con il metodo now() della classe RTC si recupera l’ora dal DS1307
  sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  //I metodi hour(), minute() e second() della classe RTC recuperano 
  //recuperano ora, minuti e secondi impostati nel DS1307 dal metodo now()
  //la funzione sprintf() memorizza i 3 valori nella variabile buffer
  Serial.println(buffer);
  //Scrive il valore della variabile buffer con il formato hh:mm:ss;
  sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year()); 
  //I metodi day(), month() e year() della classe RTC recuperano 
  //il giorno, mese ed anno correnti impostati nel DS1307 dal metodo now()
  //la funzione sprintf() memorizza i 3 valori nella variabile buffer
  Serial.println(buffer);
  //Scrive il valore della variabile buffer con il formato gg/mm/aaaa 
  Serial.println(" ");
  //Viene lasciata una linea vuota
  delay (1000);
  //attesa 1000 millisecondi (un secondo) prima di
  //eseguire un nuovo ciclo di lopp()
}

 

Elenco revisioni
18/02/2017 Aggiornato pagina
25/02/2013 Inseriti filmati illustrativi
17/02/2013 Aggiornato pagina, inserito l'utilizzo con Arduino in apposita pagina
08/07/2012 Inserito programma di gestione
27/08/2011 Emissione preliminare