Indietro

Orologio RTC I2C con DS1307 su Velxio

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.

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

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.

Finestra modale del selettore componenti di Velxio che sfoglia le parti per categoria

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

Errori Comuni e Suggerimenti per il Debug

Barra degli strumenti dell'editor Velxio con i controlli di compilazione ed esecuzione

Estensioni Suggerite

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

Barra degli strumenti della tela Velxio sopra la finestra di simulazione

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 con Arduino: Guida Completa
Articolo successivo
Scanner I2C con Arduino: Trova Ogni Dispositivo sul Bus