Zurück

Virtuelle DS1307 Echtzeituhr mit Raspberry Pi Pico I2C auslesen

Einleitung

Schon einmal eine Echtzeituhr (RTC) zu deinem Projekt hinzufügen wollen, aber die Hardware nicht zur Hand gehabt? Mit Velxio kannst du einen kompletten I2C-RTC-Auslesevorgang mit einem Raspberry Pi Pico und einer virtuellen DS1307 simulieren – alles in deinem Browser. In diesem Tutorial gehen wir die Schaltung, den Code und die wichtigsten Konzepte durch, damit du I2C-Kommunikation sicher in deinen eigenen Projekten einsetzen kannst.

Schaltungsaufbau

Beginnen wir mit einem Blick auf die Schaltung. Öffne das Beispiel in Velxio und du siehst die folgenden Komponenten:

Schaltplan von pico-i2c-rtc-read auf der Velxio-Simulator-Leinwand

Die Schaltung ist einfach: Ein Raspberry Pi Pico (nano-rp2040) ist mit zwei LEDs und einer virtuellen DS1307 RTC verbunden (nicht als separates Bauteil dargestellt – die RTC ist in die Simulation integriert). Die LEDs dienen als visuelle Indikatoren für die I2C-Aktivität.

Beide LEDs teilen sich die gleiche Masse (GND.1). Der I2C-Bus besteht aus den Leitungen SDA (Daten) und SCL (Takt). Die DS1307 RTC ist intern mit diesen Leitungen unter der Adresse 0x68 verbunden. Die LEDs sind für die I2C-Kommunikation nicht zwingend erforderlich, geben aber einen visuellen Hinweis darauf, dass die Leitungen umschalten.

Um diese Schaltung selbst aufzubauen, kannst du die Velxio-Komponentenauswahl verwenden:

Velxio Komponentenauswahl-Modal zum Durchsuchen von Teilen nach Kategorie

Suche nach “Raspberry Pi Pico” und “LED” und verdrahte sie wie beschrieben. Die Leinwand-Symbolleiste hilft dir beim Zoomen und Anordnen der Komponenten:

Velxio Leinwand-Symbolleiste über dem Simulations-Viewport

Code-Erklärung

Jetzt tauchen wir in den Code ein. Der Sketch verwendet die Wire-Bibliothek (vorinstalliert), um mit der DS1307 über I2C zu kommunizieren. Hier ist der vollständige Code:

// Raspberry Pi Pico — I2C DS1307 RTC Read
// Reads time from virtual RTC at address 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("Reading DS1307 at 0x68 (system time)");
  Serial.println();
}

void loop() {
  // Set register pointer to 0
  Wire.beginTransmission(0x68);
  Wire.write(0x00);
  Wire.endTransmission();

  // Read 7 bytes: sec, min, hr, dow, date, month, year
  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 dow   = bcdToDec(Wire.read());
    byte date  = bcdToDec(Wire.read());
    byte month = bcdToDec(Wire.read());
    byte year  = bcdToDec(Wire.read());

    const char* days[] = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

    Serial.print("Time: ");
    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("  Date: ");
    Serial.print(days[dow]); Serial.print(' ');
    if (date < 10) Serial.print('0'); Serial.print(date); Serial.print('/');
    if (month < 10) Serial.print('0'); Serial.print(month); Serial.print('/');
    Serial.print("20"); if (year < 10) Serial.print('0'); Serial.println(year);
  } else {
    Serial.println("RTC not responding!");
  }

  delay(1000);
}

Wie es funktioniert

  1. Setup: Wir starten die serielle Kommunikation mit 115200 Baud und initialisieren den I2C-Bus mit Wire.begin(). Die DS1307 hat die Adresse 0x68.

  2. Loop: Jede Sekunde führen wir folgende Schritte aus:

    • Sende einen beginTransmission an Adresse 0x68, schreibe 0x00 (den Registerzeiger auf das Sekundenregister) und führe endTransmission aus.
    • Fordere 7 Bytes von der RTC an mit Wire.requestFrom(0x68, 7).
    • Lese jedes Byte und konvertiere es mit der Hilfsfunktion bcdToDec von BCD (Binary-Coded Decimal) in Dezimal.
    • Formatiere und gib die Uhrzeit und das Datum im seriellen Monitor aus.
  3. BCD-Konvertierung: Die DS1307 speichert Zeitwerte im BCD-Format. Zum Beispiel repräsentiert das Byte 0x45 die 45 in BCD (4*10 + 5 = 45). Die Funktion bcdToDec extrahiert die Zehnerstelle (hohes Nibble) und die Einerstelle (niedriges Nibble) und kombiniert sie.

  4. Maskierung: Wir wenden Masken auf bestimmte Register an:

    • Sekunden: & 0x7F löscht das CH-Bit (Clock Halt).
    • Stunden: & 0x3F löscht das Bit für den 12/24-Stunden-Modus (unter Annahme des 24-Stunden-Modus).

Wichtige Konzepte

Häufige Fehler & Debugging-Tipps

Vorschläge für Erweiterungen

Probier es selbst aus!

Bereit zum Experimentieren? Öffne das Live-Beispiel in Velxio und starte die Simulation. Du siehst die Zeit jede Sekunde im seriellen Monitor ausgegeben. Ändere den Code, um das Aktualisierungsintervall anzupassen oder neue Funktionen hinzuzufügen.

Starte das Pico I2C RTC Read Beispiel

Viel Spaß beim Simulieren!


Teilen auf:
David Montero

Geschrieben von

David Montero

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

GitHub velxio.dev

Ähnliche Artikel


Vorheriger Artikel
Pico I2C EEPROM Lesen/Schreiben: Nichtflüchtigen Speicher im Browser simulieren
Nächster Artikel
Pico I2C Scanner: Geräte auf dem Bus finden