Introduzione
Hai mai desiderato aggiungere un orologio in tempo reale (RTC) al tuo progetto ma non avevi l’hardware a portata di mano? Con Velxio puoi simulare una lettura completa di un RTC I2C usando un Raspberry Pi Pico e un DS1307 virtuale, tutto nel tuo browser. In questo tutorial, esamineremo il circuito, il codice e i concetti chiave in modo che tu possa utilizzare con sicurezza la comunicazione I2C nei tuoi progetti.
Analisi del Circuito
Iniziamo osservando il circuito. Apri l’esempio in Velxio e vedrai i seguenti componenti:

Il circuito è semplice: un Raspberry Pi Pico (nano-rp2040) è collegato a due LED e a un RTC DS1307 virtuale (non mostrato come componente separato — l’RTC è integrato nella simulazione). I LED sono usati come indicatori visivi per l’attività I2C.
- LED (blu): Collegato al pin D12 (linea SDA) tramite un filo blu. Il suo anodo (A) si collega a D12, e il catodo (C) va a GND.1 attraverso un filo nero.
- LED (giallo): Collegato al pin D10 (linea SCL) tramite un filo arancione. Il suo anodo (A) si collega a D10, e il catodo (C) va a GND.1 attraverso un filo nero.
Entrambi i LED condividono la stessa massa (GND.1). Il bus I2C è costituito dalle linee SDA (dati) e SCL (clock). L’RTC DS1307 è collegato internamente a queste linee all’indirizzo 0x68. I LED non sono strettamente necessari per la comunicazione I2C, ma forniscono un’indicazione visiva che le linee stanno commutando.
Per costruire questo circuito da solo, puoi usare il selettore di componenti di Velxio:

Cerca “Raspberry Pi Pico” e “LED”, poi collegali come descritto. La barra degli strumenti della tela ti aiuta a zoomare e disporre i componenti:

Analisi del Codice
Ora immergiamoci nel codice. Lo sketch utilizza la libreria Wire (integrata) per comunicare con il DS1307 tramite I2C. Ecco il codice completo:
// Raspberry Pi Pico — I2C DS1307 RTC Read
// Legge l'ora dall'RTC virtuale all'indirizzo 0x68
#include <Wire.h>
byte bcdToDec(byte val) {
return ((val >> 4) * 10) + (val & 0x0F);
}
void setup() {
Serial.begin(115200);
delay(500);
Wire.begin();
Serial.println("=== Pico I2C RTC Read ===");
Serial.println("Lettura DS1307 a 0x68 (ora di sistema)");
Serial.println();
}
void loop() {
// Imposta il puntatore del registro a 0
Wire.beginTransmission(0x68);
Wire.write(0x00);
Wire.endTransmission();
// Legge 7 byte: sec, min, hr, gs, data, mese, anno
Wire.requestFrom(0x68, 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());
const char* giorni[] = {"", "Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"};
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: ");
Serial.print(giorni[gs]); Serial.print(' ');
if (data < 10) Serial.print('0'); Serial.print(data); Serial.print('/');
if (mese < 10) Serial.print('0'); Serial.print(mese); Serial.print('/');
Serial.print("20"); if (anno < 10) Serial.print('0'); Serial.println(anno);
} else {
Serial.println("RTC non risponde!");
}
delay(1000);
}
Come Funziona
-
Setup: Avviamo la comunicazione seriale a 115200 baud e inizializziamo il bus I2C con
Wire.begin(). Il DS1307 si trova all’indirizzo 0x68. -
Loop: Ogni secondo, eseguiamo:
- Inviamo un
beginTransmissionall’indirizzo 0x68, scriviamo 0x00 (il puntatore del registro al registro dei secondi), eendTransmission. - Richiediamo 7 byte dall’RTC usando
Wire.requestFrom(0x68, 7). - Leggiamo ogni byte e lo convertiamo da BCD (Binary-Coded Decimal) a decimale usando la funzione di supporto
bcdToDec. - Formattiamo e stampiamo l’ora e la data sul Monitor Seriale.
- Inviamo un
-
Conversione BCD: Il DS1307 memorizza i valori temporali in formato BCD. Ad esempio, il byte
0x45rappresenta 45 in BCD (4*10 + 5 = 45). La funzionebcdToDecestrae la cifra delle decine (nibble alto) e la cifra delle unità (nibble basso) e le combina. -
Mascheramento: Applichiamo maschere a certi registri:
- Secondi:
& 0x7Fcancella il bit CH (clock halt). - Ore:
& 0x3Fcancella il bit della modalità 12/24 ore (assumendo modalità 24 ore).
- Secondi:
Concetti Chiave
- Protocollo I2C: Un bus seriale a due fili (SDA, SCL) per la comunicazione tra microcontrollori e periferiche. Ogni dispositivo ha un indirizzo univoco.
- Libreria Wire: La libreria I2C integrata di Arduino. Usa
Wire.begin()per unirti al bus,Wire.beginTransmission(addr)per iniziare a parlare con un dispositivo,Wire.write()per inviare dati,Wire.endTransmission()per terminare, eWire.requestFrom(addr, count)per leggere byte. - Formato BCD: Molti RTC usano BCD per semplificare la visualizzazione. Devi convertire in decimale per un output leggibile dall’uomo.
- Mappatura dei Registri: Il DS1307 ha una mappa di registri specifica: secondi (0x00), minuti (0x01), ore (0x02), giorno della settimana (0x03), data (0x04), mese (0x05), anno (0x06).
Errori Comuni e Suggerimenti per il Debug
- Indirizzo I2C Errato: Ricontrolla l’indirizzo del dispositivo. Il DS1307 è tipicamente 0x68 (7 bit). Se ottieni “RTC non risponde!”, verifica l’indirizzo.
- Resistenze di Pull-up Mancanti: Nell’hardware reale, le linee I2C necessitano di resistenze di pull-up. In Velxio, sono simulate internamente, quindi non devi aggiungerle.
- Disallineamento del Baud Rate: Assicurati che il baud rate del Monitor Seriale corrisponda a 115200.
- Puntatore del Registro Non Impostato: Imposta sempre il puntatore del registro prima di leggere. Il codice scrive 0x00 per puntare al registro dei secondi.
- Errori di Mascheramento: Dimenticare di mascherare il bit CH (secondi) o il bit della modalità 12/24 ore (ore) può dare valori errati.
Estensioni Suggerite
- Imposta l’Ora: Aggiungi codice per scrivere l’ora corrente nell’RTC. Usa
Wire.write()per impostare ogni registro. - Funzione Sveglia: Implementa una sveglia che attiva un LED quando viene raggiunta una certa ora.
- Visualizzazione su LCD: Usa un LCD I2C per mostrare l’ora invece del Monitor Seriale.
- RTC Multipli: Prova a leggere da due diversi dispositivi I2C sullo stesso bus.
Provalo Tu Stesso!
Pronto per sperimentare? Apri l’esempio live in Velxio ed esegui la simulazione. Vedrai l’ora stampata nel Monitor Seriale ogni secondo. Modifica il codice per cambiare l’intervallo di aggiornamento o aggiungere nuove funzionalità.
Avvia l’Esempio di Lettura RTC I2C per Pico
Buona simulazione!