Descrizione
[vc_row][vc_column][vc_column_text]
Modulo DS1302 RTC (Real Time Clock) con Memoria, Batteria e Calendario – Descrizione Completa e Guida per l’Uso con Arduino
🕒 Descrizione del Modulo DS1302 RTC
Il DS1302 è un modulo orologio in tempo reale (RTC) che consente di tenere traccia precisa dell’orario e del calendario anche in assenza di alimentazione, grazie a una batteria tampone (di solito tipo CR2032). È molto usato in progetti con Arduino, ESP8266, ESP32, Raspberry Pi e altri microcontrollori.
Caratteristiche Tecniche
| Specifica | Dettaglio |
|---|---|
| Chip RTC | DS1302 |
| Alimentazione | 3.3V – 5.5V (compatibile con Arduino) |
| Comunicazione | Serializzata a 3 fili (SCLK, I/O, CE) |
| Batteria tampone | Supporto CR2032 (non sempre inclusa) |
| Memoria RAM | 31 byte di RAM statica per uso generale |
| Precisione | ±1 minuto/mese tipica (senza calibrazione) |
| Intervallo di date | 01/01/1900 – 31/12/2099 |
| Funzioni | Orologio, calendario, RAM, backup batteria |
🔌 Collegamento DS1302 con Arduino
| Pin DS1302 | Collegamento ad Arduino |
|---|---|
| VCC | 5V (oppure 3.3V) |
| GND | GND |
| CLK (SCLK) | D6 |
| I/O | D7 |
| CE (RST) | D8 |
📦 Libreria consigliata per Arduino
Per usare il modulo DS1302 con Arduino, puoi installare la libreria “DS1302RTC” scritta da Paul Stoffregen, che semplifica la lettura/scrittura dell’orologio.
🔧 Installazione della Libreria
- Apri l’IDE di Arduino
- Vai su Sketch > Include Library > Manage Libraries
- Cerca DS1302RTC e installa la libreria di Paul Stoffregen
🧪 Esempio di Codice per Impostare e Leggere Data/Ora
#include <DS1302RTC.h>
#include <TimeLib.h>
#include <Wire.h>
#include <Streaming.h>
// Pin collegati al modulo DS1302: CE, I/O, CLK
DS1302RTC rtc(8, 7, 6);
void setup() {
Serial.begin(9600);
// Imposta l’orario solo la prima volta
// Imposta: Anno, Mese, Giorno, Ora, Minuti, Secondi
tmElements_t tm;
tm.Year = CalendarYrToTm(2025); // Anno - 1970
tm.Month = 7;
tm.Day = 28;
tm.Hour = 15;
tm.Minute = 45;
tm.Second = 0;
rtc.write(tm);
Serial.println("Ora impostata!");
}
void loop() {
tmElements_t tm;
if (rtc.read(tm)) {
Serial << "Data: " << tm.Day << "/" << tm.Month << "/" << tmYearToCalendar(tm.Year);
Serial << " - Ora: " << tm.Hour << ":" << tm.Minute << ":" << tm.Second << endl;
} else {
Serial.println("Errore lettura RTC");
}
delay(1000);
}
📘 Funzioni Utili della Libreria
| Funzione | Descrizione |
|---|---|
rtc.read(tm) |
Legge la data e ora dal modulo |
rtc.write(tm) |
Imposta la data e ora |
tm.Year, tm.Month |
Accesso ai singoli elementi della data e ora |
tmHour, tmMinute |
Accesso diretto a ora/minuti |
CalendarYrToTm(anno) |
Conversione da anno calendario ad anno base 1970 |
tmYearToCalendar(tm) |
Conversione inversa (utile per stampa) |
⚠️ Consigli pratici
- Non impostare l’orario a ogni avvio: il codice per impostare l’ora va eseguito solo una volta. Dopo, commentalo.
- Controlla la batteria: se l’orario si azzera, la batteria CR2032 è scarica o assente.
- Non invertire i pin: collegamenti errati causano letture errate o mancate comunicazioni.
- La precisione del DS1302 è buona per uso generale, ma per applicazioni critiche è meglio usare il DS3231 (che ha un oscillatore compensato in temperatura).
🎯 Applicazioni Tipiche
- Orologi digitali con display (LCD, OLED, 7 segmenti)
- Log dati con timestamp (ad esempio su schede SD)
- Sveglie e temporizzatori automatici
- Progetti domotici con eventi programmati
- Timer per impianti di irrigazione
🔄 Alternative
| Modulo RTC | Precisione | Batteria | Comunicazione | Note |
|---|---|---|---|---|
| DS1302 | Media | CR2032 | 3 fili (Seriale) | Economico, base |
| DS1307 | Buona | CR2032 | I2C | Più diffuso |
| DS3231 | Alta | Inclusa | I2C | Alta precisione, compensato temperatura |
📌 Conclusione
Il modulo DS1302 RTC è un’ottima scelta per progetti Arduino in cui è necessario tenere traccia del tempo anche quando il microcontrollore è spento. È economico, facile da usare e ben documentato, anche se oggi viene spesso sostituito dal più preciso DS3231.
Perfetto! Ti fornisco due estensioni pratiche per il modulo DS1302 RTC con Arduino:
🔹 1. Visualizzare Data/Ora su Display OLED I2C (128×64)
🧰 Componenti necessari:
- Arduino UNO / Nano
- Modulo RTC DS1302
- Display OLED 128×64 (driver SSD1306, interfaccia I2C)
- Cavi jumper
🔧 Schema dei Collegamenti
| Componente | Pin | Arduino |
|---|---|---|
| DS1302 | VCC, GND | 5V, GND |
| CLK | D6 | |
| I/O | D7 | |
| CE (RST) | D8 | |
| OLED | VCC, GND | 5V, GND |
| SDA | A4 | |
| SCL | A5 |
📦 Librerie da installare:
- DS1302RTC – Paul Stoffregen
- Adafruit GFX Library
- Adafruit SSD1306
Apri l’IDE di Arduino → Library Manager → Cerca e installa tutte e tre.
💡 Codice esempio con OLED:
#include <DS1302RTC.h>
#include <TimeLib.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
DS1302RTC rtc(8, 7, 6); // CE, IO, SCLK
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
}
void loop() {
tmElements_t tm;
if (rtc.read(tm)) {
display.clearDisplay();
display.setCursor(0, 0);
display.printf("%02d:%02d:%02dn", tm.Hour, tm.Minute, tm.Second);
display.setTextSize(1);
display.setCursor(0, 40);
display.printf("%02d/%02d/%04d", tm.Day, tm.Month, tmYearToCalendar(tm.Year));
display.display();
} else {
display.clearDisplay();
display.setCursor(0, 0);
display.println("RTC ERROR");
display.display();
}
delay(1000);
}
🔹 2. Logger su SD Card con Timestamp da DS1302
🧰 Componenti:
- Arduino UNO / Nano
- RTC DS1302
- Lettore SD card (con adattatore logico se serve)
- MicroSD formattata FAT32
🔧 Collegamento SD Card
| Lettore SD | Arduino |
|---|---|
| CS | D10 |
| MOSI | D11 |
| MISO | D12 |
| SCK | D13 |
| VCC, GND | 5V, GND |
📦 Librerie da usare:
- SD
- DS1302RTC
- TimeLib
💡 Codice esempio per Data Logging:
#include <SPI.h>
#include <SD.h>
#include <DS1302RTC.h>
#include <TimeLib.h>
const int chipSelect = 10;
DS1302RTC rtc(8, 7, 6); // CE, IO, SCLK
void setup() {
Serial.begin(9600);
SD.begin(chipSelect);
if (!SD.begin(chipSelect)) {
Serial.println("SD init failed!");
return;
}
Serial.println("SD OK");
}
void loop() {
tmElements_t tm;
if (rtc.read(tm)) {
File logFile = SD.open("log.txt", FILE_WRITE);
if (logFile) {
logFile.print(tmYearToCalendar(tm.Year));
logFile.print("/");
logFile.print(tm.Month);
logFile.print("/");
logFile.print(tm.Day);
logFile.print(" ");
logFile.print(tm.Hour);
logFile.print(":");
logFile.print(tm.Minute);
logFile.print(":");
logFile.println(tm.Second);
logFile.close();
Serial.println("Dati scritti su SD.");
} else {
Serial.println("Errore apertura log.txt");
}
}
delay(5000); // Log ogni 5 secondi
}
✅ Suggerimenti aggiuntivi:
- Puoi combinare OLED + SD + DS1302 nello stesso progetto se non ci sono conflitti di pin.
- Puoi loggare anche dati da sensori (es. temperatura, umidità) aggiungendoli alla stringa
logFile.print(). - Ricorda di formattare la SD in FAT32 e usare file
.txtsemplici.
[/vc_column_text][/vc_column][/vc_row]








