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.
-
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
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.
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.
/* 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 decimalebyte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}
// Conversione decimale binario a normali numeri decimalibyte 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-59byte minute, // 0-59byte hour, // 1-23byte dayOfWeek, // 1-7byte dayOfMonth, // 1-28/29/30/31byte month, // 1-12byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second)); // 0 to bit 7 avvia l'orologioWire.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 quadraWire.endTransmission();
}
// Ottiene la data e l'ora dal DS1307void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Ripristina il puntatore del registroWire.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());
}
voidsetup()
{
pinMode(backLight, OUTPUT);
digitalWrite(backLight, HIGH); // attiva la retroilluminazionebyte 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
}
voidloop()
{
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);
}
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
#include <Wire.h>
#include <RTClib.h>
//include le librerie necessarie al funzionamento del programmachar 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 utilizzavoidsetup () {
Serial1.begin(9600);
//Imposta velocità porta comunicazione con LCD//connesso alla porta seriale 1
clearLCD();
//Cancella lo schermo del displayWire.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
}
voidloop() {
DateTimenow = 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 bufferSerial1.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 bufferSerial1.print(buffer);
//Invia il valore della variabile buffer con il formato gg/mm/aaaa //al displaydelay (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 testovoid clearLCD() {
serCommand();
Serial1.write(byte (0x01));
}
// Avvia il cursore all'inizio della prima lineavoid selectLineOne() { //sposta il cursore alla riga 0 carattere 0
serCommand(); //command flagSerial1.write(byte (128));
}
// Sposta il cursore all'inizio della seconda lineavoid selectLineTwo() { //sposta il cursore alla riga 2 carattere 0
serCommand(); //command flagSerial1.write(byte (192));
}
// Invia un comando al displayvoid serCommand() {
Serial1.write(byte (0xFE));
}
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
#include <Wire.h>
#include <RTClib.h>
//include le librerie necessarie al funzionamento del programmachar 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 utilizzavoidsetup () {
Serial.begin(9600);
//Si imposta la velocità della porta di comunicazione//con la finestra di debugSerial.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
}
voidloop() {
DateTimenow = 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 bufferSerial.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 bufferSerial.println(buffer);
//Scrive il valore della variabile buffer con il formato gg/mm/aaaa Serial.println(" ");
//Viene lasciata una linea vuotadelay (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