Introduzione
Hai mai desiderato aggiungere un orologio in tempo reale al tuo progetto Arduino senza avere l’hardware a portata di mano? Con Velxio puoi simulare un RTC I2C (DS1307) direttamente nel tuo browser. In questo tutorial costruiremo un semplice lettore I2C che recupera l’ora e la data correnti da un DS1307 virtuale e le stampa sul Monitor Seriale. Nessuna libreria esterna necessaria—solo la libreria Wire integrata.

Panoramica del Circuito
Questo esempio è estremamente semplice perché il DS1307 è già integrato nella scheda Arduino Uno virtuale. Non ci sono componenti esterni o cavi da aggiungere. Il bus I2C (SDA su A4, SCL su A5) è collegato internamente al DS1307 all’indirizzo 0x68. L’unico componente è l’Arduino Uno stesso.

Per iniziare, apri l’editor di Velxio e seleziona un Arduino Uno dal selettore componenti. Il DS1307 è integrato nell’ambiente di simulazione, quindi non è necessario aggiungerlo separatamente. Il circuito è pronto per l’uso.
Spiegazione del Codice
Analizziamo il codice passo dopo passo.
Inclusione e Definizione
#include <Wire.h>
#define DS1307_ADDR 0x68
Includiamo la libreria Wire per la comunicazione I2C e definiamo l’indirizzo I2C del DS1307 come 0x68.
Conversione da BCD a Decimale
byte bcdToDec(byte val) {
return ((val >> 4) * 10) + (val & 0x0F);
}
Il DS1307 memorizza i valori temporali in formato BCD (Binary-Coded Decimal). Questa funzione di supporto converte un byte BCD in un numero decimale normale.
Setup
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("===========================");
Serial.println(" Lettore RTC DS1307 (I2C)");
Serial.println("===========================");
Serial.println();
}
Inizializziamo il bus I2C e la comunicazione Seriale a 9600 baud. Poi stampiamo un’intestazione.
Loop
void loop() {
// Imposta il puntatore del registro a 0 (secondi)
Wire.beginTransmission(DS1307_ADDR);
Wire.write(0x00);
Wire.endTransmission();
// Richiedi 7 byte: sec, min, hr, gs, data, mese, anno
Wire.requestFrom(DS1307_ADDR, 7);
if (Wire.available() >= 7) {
byte sec = bcdToDec(Wire.read() & 0x7F);
byte min = bcdToDec(Wire.read());
byte hr = bcdToDec(Wire.read() & 0x3F);
byte gs = bcdToDec(Wire.read());
byte data = bcdToDec(Wire.read());
byte mese = bcdToDec(Wire.read());
byte anno = bcdToDec(Wire.read());
// Stampa l'ora formattata
Serial.print("Ora: ");
if (hr < 10) Serial.print("0");
Serial.print(hr);
Serial.print(":");
if (min < 10) Serial.print("0");
Serial.print(min);
Serial.print(":");
if (sec < 10) Serial.print("0");
Serial.print(sec);
Serial.print(" Data: ");
if (data < 10) Serial.print("0");
Serial.print(data);
Serial.print("/");
if (mese < 10) Serial.print("0");
Serial.print(mese);
Serial.print("/20");
if (anno < 10) Serial.print("0");
Serial.println(anno);
} else {
Serial.println("Errore: Impossibile leggere l'RTC");
}
delay(1000);
}
Nel loop, impostiamo prima il puntatore del registro del DS1307 a 0 (registro dei secondi) inviando un singolo byte 0x00. Poi richiediamo 7 byte dall’RTC. Il DS1307 restituisce secondi, minuti, ore, giorno della settimana, data, mese e anno in BCD. Maschera il bit più alto dei secondi (il bit 7 è il flag di arresto dell’orologio) e i due bit più alti delle ore (i bit 6-7 sono la modalità 12/24 ore). Dopo la conversione, stampiamo l’ora e la data con zeri iniziali. Se sono disponibili meno di 7 byte, stampiamo un errore. Infine, attendiamo 1 secondo.
Concetti Chiave
- Comunicazione I2C: La libreria Wire gestisce il protocollo I2C.
beginTransmission()avvia una scrittura,write()accoda i dati,endTransmission()li invia.requestFrom()legge byte da un dispositivo slave. - Formato BCD: Il DS1307 memorizza l’ora in BCD, dove ogni nibble rappresenta una cifra decimale. La funzione
bcdToDec()lo converte. - Indirizzamento dei Registri: I registri interni del DS1307 vengono accessi scrivendo prima l’indirizzo del registro, poi leggendo o scrivendo i dati.
- Mascheramento dei Bit: Il bit più alto del registro dei secondi (CH) indica l’arresto dell’orologio; lo mascheriamo con
& 0x7F. I bit più alti del registro delle ore indicano la modalità 12/24 ore; li mascheriamo con& 0x3F.
Errori Comuni e Suggerimenti per il Debug
- Indirizzo I2C Errato: Assicurati che l’indirizzo sia 0x68 (7 bit). Se usi un indirizzo a 8 bit, sposta a sinistra di 1.
- Resistenze di Pull-up Mancanti: Nell’hardware reale, le linee I2C necessitano di pull-up. In Velxio, sono simulate internamente.
- Monitor Seriale Non Visibile: Verifica che la velocità di trasmissione corrisponda (9600). Fai clic sull’icona del Monitor Seriale nella barra degli strumenti dell’editor.

- Errori di Compilazione: Controlla di aver incluso
Wire.h. Il codice non utilizza librerie esterne. - RTC Non Risponde: Se vedi “Errore: Impossibile leggere l’RTC”, la comunicazione I2C potrebbe essere fallita. Verifica l’indirizzo e i collegamenti.
Estensioni Suggerite
- Imposta l’Ora: Aggiungi codice per impostare l’ora del DS1307 tramite input Seriale.
- Visualizza su LCD: Usa un LCD I2C per mostrare l’ora.
- Funzione Sveglia: Implementa una sveglia utilizzando i registri di allarme del DS1307.
- Registrazione Dati: Registra timestamp su EEPROM o una scheda SD.
Provalo Tu Stesso
Pronto a vederlo in azione? Apri l’esempio live su Velxio e premi il pulsante Esegui. Vedrai l’ora aggiornarsi ogni secondo nel Monitor Seriale.
Avvia il Lettore RTC I2C su Velxio

Buona simulazione!