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.

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.

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
- Communication I2C : La bibliothèque Wire gère le protocole I2C.
beginTransmission()démarre une écriture,write()met en file d’attente les données,endTransmission()les envoie.requestFrom()lit les octets d’un esclave. - Format BCD : Le DS1307 stocke l’heure en BCD, où chaque quartet représente un chiffre décimal. La fonction
bcdToDec()le convertit. - Adressage des registres : Les registres internes du DS1307 sont accessibles en écrivant d’abord l’adresse du registre, puis en lisant ou écrivant les données.
- Masquage des bits : Le bit de poids fort du registre des secondes (CH) indique l’arrêt de l’horloge ; nous le masquons avec
& 0x7F. Les bits de poids fort du registre des heures indiquent le mode 12/24 heures ; nous les masquons avec& 0x3F.
Pièges courants et conseils de débogage
- Mauvaise adresse I2C : Assurez-vous que l’adresse est 0x68 (7 bits). Si vous utilisez une adresse 8 bits, décalez-la de 1 vers la gauche.
- Résistances de tirage manquantes : Sur du matériel réel, les lignes I2C nécessitent des résistances de tirage. Dans Velxio, elles sont simulées en interne.
- Moniteur série qui ne s’affiche pas : Vérifiez que le débit en bauds correspond (9600). Cliquez sur l’icône du moniteur série dans la barre d’outils de l’éditeur.

- Erreurs de compilation : Vérifiez que vous avez inclus
Wire.h. Le code n’utilise aucune bibliothèque externe. - RTC qui ne répond pas : Si vous voyez “Error: Could not read RTC”, la communication I2C a peut-être échoué. Vérifiez l’adresse et le câblage.
Extensions suggérées
- Régler l’heure : Ajoutez du code pour régler l’heure du DS1307 via l’entrée série.
- Afficher sur un écran LCD : Utilisez un écran LCD I2C pour afficher l’heure.
- Fonction d’alarme : Implémentez une alarme en utilisant les registres d’alarme du DS1307.
- Enregistrement de données : Enregistrez les horodatages dans l’EEPROM ou sur une carte SD.
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

Bonne simulation !