Retour

Horloge RTC I2C avec DS1307 sur Velxio

Introduction

Vous avez toujours voulu ajouter une horloge temps réel à votre projet Arduino sans avoir le matériel sous la main ? Avec Velxio, vous pouvez simuler un RTC I2C (DS1307) directement dans votre navigateur. Dans ce tutoriel, nous allons construire un simple lecteur I2C qui récupère l’heure et la date actuelles d’un DS1307 virtuel et les affiche sur le moniteur série. Aucune bibliothèque externe nécessaire — juste la bibliothèque Wire intégrée.

Schéma du circuit i2c-rtc-read sur le canevas du simulateur Velxio

Présentation du circuit

Cet exemple est remarquablement simple car le DS1307 est déjà intégré dans la carte Arduino Uno virtuelle. Il n’y a aucun composant externe ni fil à ajouter. Le bus I2C (SDA sur A4, SCL sur A5) est connecté en interne au DS1307 à l’adresse 0x68. Le seul composant est l’Arduino Uno lui-même.

Fenêtre de sélection de composants Velxio parcourant les pièces par catégorie

Pour commencer, ouvrez l’éditeur Velxio et sélectionnez un Arduino Uno dans le sélecteur de composants. Le DS1307 est intégré à l’environnement de simulation, vous n’avez donc pas besoin de l’ajouter séparément. Le circuit est prêt à l’emploi.

Explication du code

Décortiquons le code étape par étape.

Inclusion et définition

#include <Wire.h>

#define DS1307_ADDR 0x68

Nous incluons la bibliothèque Wire pour la communication I2C et définissons l’adresse I2C du DS1307 comme 0x68.

Conversion BCD en décimal

byte bcdToDec(byte val) {
  return ((val >> 4) * 10) + (val & 0x0F);
}

Le DS1307 stocke les valeurs de temps au format BCD (Binary-Coded Decimal). Cette fonction d’aide convertit un octet BCD en un nombre décimal standard.

Configuration

void setup() {
  Wire.begin();
  Serial.begin(9600);

  Serial.println("===========================");
  Serial.println("  DS1307 RTC Reader (I2C)");
  Serial.println("===========================");
  Serial.println();
}

Nous initialisons le bus I2C et la communication série à 9600 bauds. Ensuite, nous affichons un en-tête.

Boucle principale

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

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

    // Print formatted time
    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: ");
    if (date < 10) Serial.print("0");
    Serial.print(date);
    Serial.print("/");
    if (month < 10) Serial.print("0");
    Serial.print(month);
    Serial.print("/20");
    if (year < 10) Serial.print("0");
    Serial.println(year);
  } else {
    Serial.println("Error: Could not read RTC");
  }

  delay(1000);
}

Dans la boucle, nous définissons d’abord le pointeur de registre du DS1307 à 0 (registre des secondes) en envoyant un seul octet 0x00. Ensuite, nous demandons 7 octets au RTC. Le DS1307 renvoie les secondes, minutes, heures, jour de la semaine, date, mois et année en BCD. Nous masquons le bit de poids fort des secondes (le bit 7 est le drapeau d’arrêt de l’horloge) et les deux bits de poids fort des heures (les bits 6-7 sont le mode/AM-PM). Après conversion, nous affichons l’heure et la date avec des zéros non significatifs. Si moins de 7 octets sont disponibles, nous affichons une erreur. Enfin, nous attendons 1 seconde.

Concepts clés

Pièges courants et conseils de débogage

Barre d'outils de l'éditeur Velxio avec les commandes de compilation et d'exécution

Extensions suggérées

Essayez par vous-même

Prêt à voir cela en action ? Ouvrez l’exemple en direct sur Velxio et appuyez sur le bouton Exécuter. Vous verrez l’heure se mettre à jour chaque seconde dans le moniteur série.

Lancer le lecteur RTC I2C sur Velxio

Barre d'outils du canevas Velxio au-dessus de la fenêtre de simulation

Bonne simulation !


Partager sur :
David Montero

Écrit par

David Montero

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

GitHub velxio.dev

Articles liés


Article précédent
Lecture/Écriture EEPROM I2C avec Arduino — Guide Complet
Article suivant
Scanner I2C avec Arduino : Trouver chaque périphérique sur le bus