Indietro

Leggere un RTC DS1307 Virtuale con Raspberry Pi Pico I2C

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:

Diagramma del circuito di pico-i2c-rtc-read sulla tela del simulatore Velxio

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.

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:

Finestra modale del selettore componenti Velxio che sfoglia parti per categoria

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

Barra degli strumenti della tela Velxio sopra il viewport di simulazione

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

  1. Setup: Avviamo la comunicazione seriale a 115200 baud e inizializziamo il bus I2C con Wire.begin(). Il DS1307 si trova all’indirizzo 0x68.

  2. Loop: Ogni secondo, eseguiamo:

    • Inviamo un beginTransmission all’indirizzo 0x68, scriviamo 0x00 (il puntatore del registro al registro dei secondi), e endTransmission.
    • 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.
  3. Conversione BCD: Il DS1307 memorizza i valori temporali in formato BCD. Ad esempio, il byte 0x45 rappresenta 45 in BCD (4*10 + 5 = 45). La funzione bcdToDec estrae la cifra delle decine (nibble alto) e la cifra delle unità (nibble basso) e le combina.

  4. Mascheramento: Applichiamo maschere a certi registri:

    • Secondi: & 0x7F cancella il bit CH (clock halt).
    • Ore: & 0x3F cancella il bit della modalità 12/24 ore (assumendo modalità 24 ore).

Concetti Chiave

Errori Comuni e Suggerimenti per il Debug

Estensioni Suggerite

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!


Condividi su:
David Montero

Scritto da

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

Articoli correlati


Articolo precedente
Lettura/Scrittura EEPROM I2C su Pico: Simula Memoria Non Volatile nel Tuo Browser
Articolo successivo
Scanner I2C per Pico: Trova Dispositivi sul Bus