Module Real Time clock RTC DS1307 Tutoriel Arduino

Utilisation de capteurs et composants électroniques avec Arduino.
Une fiche de tutoriel pour chaque.

Module Real Time clock RTC DS1307 Tutoriel Arduino

Messagepar tiptop » Sam 17 Aoû 2013 17:02

Module Real Time clock RTC DS1307 - Tutoriel Arduino

Composants

Principe de fonctionnement
La carte Arduino mesure le temps écoulé depuis sa mise sous tension (en ms). Elle peut ainsi calculer des intervalles relatifs avec précision, mais pas des heures absolues.
En cas de coupure de courant le compteur de temps se ré initialise.

Le petit module d'horloge temps réel RCT DS1307 comporte une puce d'horloge et une pile bouton qui permet d'actualiser et de sauvegarder l'heure en cas de coupure de courant.
La carte Arduino connaît ainsi toujours la date et l'heure exacte.

Le module DS1307
Il est livré monté prêt à l'emploi, avec pile (fournie)
Il fonctionne en I2C donc avec la librairie Wire.h (bus bi-directionel pour mise à l'heure et lecture de l'heure).
Une première zone de mémoire permet de stocker l'heure et la date, mises à jour automatiquement.
Image
Une seconde zone de mémoire RAM est libre, donc disponible pour l'utilisateur (56 octets). On pourra y stocker ses données non volatiles (infos de configuration par exemple). .
Image
Le stockage de l'heure et de la date est en format BCD (on code les chiffres décimaux séparément en binaire, ça simplifie ensuite leur affichage).

Une pile bouton lithium assure la sauvegarde (10 ans) en l'absence d'alimentation externe de 5V.
Image

Fonctionnalités
  • Heure/Minutes/Secondes AM/PM
  • Jour Mois Année
  • Ajustement d'année bissextiles
  • Calendrier jusque 2100

Branchements 4 fils
Image
  • DS1307 --> Arduino
  • VCC --> +5v
  • GND --> GND
  • SDA --> pin A4 Data (pin 20 sur Mega)
  • SCL -->pin A5 Clock (pin 21 sur Mega)

Image
Image

Brochage P1 du RTC DS1307 :
Image
Image
On lui soude une barrette de connexion de 6 broches.
  • SQ
  • DS
  • SCL -->A5
  • SDA -->A4
  • VCC -->+5V
  • GND --> GND
  • BAT --> Permet de mesurer la tension restant dans la pile.

Remarque : Je n'ai pas mis de résistances de pull up, avec ici un seul i2C connecté sur le bus

Programmation du module

Protocole de lecture de l'heure
  • Ouvrir en mode écriture l'I2C
  • Mettre le pointeur de registre à (0x00) , ce reset permet de lire l'heure et la date
  • Sortir du mode d'écriture
  • Ouvrir en mode lecture l'I2C et lire les 7 octets de données date/heure

Code: Tout sélectionner
Wire.beginTransmission(DS1307_I2C_ADDRESS);   // Open I2C line in write mode
  Wire.write((byte)0x00);                              // Set the register pointer to (0x00)
  Wire.endTransmission();                       // End Write Transmission
 
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);      // Open the I2C line in send mode
 
  second     = bcdToDec(Wire.read() & 0x7f); // Read seven bytes of data
  minute     = bcdToDec(Wire.read());
  hour       = bcdToDec(Wire.read() & 0x3f); 
  dayOfWeek  = bcdToDec(Wire.read());
  dayOfMonth = bcdToDec(Wire.read());
  month      = bcdToDec(Wire.read());
  year       = bcdToDec(Wire.read());



Protocole d'écriture de l'heure et de la date
  • Ouvrir en mode écriture l'I2C
  • Mettre le pointeur de registre à (0x00) , ce reset permet de modifier l'heure et la date
  • Ecrire les 7 octets de données date/heure
  • Sortir du mode d'écriture

Code: Tout sélectionner
Wire.beginTransmission(DS1307_I2C_ADDRESS);  // Open I2C line in write mode
 
   Wire.write((byte)0x00);                           // Set the register pointer to (0x00)
   Wire.write(decToBcd(second));               // Write seven bytes
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));     
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();                    // End write mode


A ne faire qu'une seule fois, après avoir ajusté les variables.
Mise à l'heure (sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year)
au format T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99)

Lire dans la mémoire de la zone utilisateur
C'est le même principe, mais il faut mettre le pointeur de registre sur la zone de mémoire qu'on veut lire, puis indiquer combien d'octets on veut lire

Code: Tout sélectionner
Wire.beginTransmission(DS1307_I2C_ADDRESS); 
  Wire.send(0x08);                             // Set the register pointer to (0x08) to read first memory byte
  Wire.endTransmission();                     
 
  Wire.requestFrom(DS1307_I2C_ADDRESS, 1);     // In this case only read one byte
 
  temp_byte     = Wire.read();              // Read the desired byte


Ecrire dans la mémoire réservée à l'utilisateur
C'est le même principe mais il faut mettre le pointeur de registre là où on veut écrire en mémoire.
Puis écrire les octets de données à stocker dans l'emplacement mémoire sélectionné, un octet à la fois.

Code: Tout sélectionner
Wire.beginTransmission(DS1307_I2C_ADDRESS); 
  Wire.write(0xf3);                             // Set the register pointer to (0xf3) to write the 11th memory byte
  Wire.write(0xa6);                             // Write the desired byte value
  Wire.endTransmission();



Applications
  • Enregistreur de données horodatées
  • suivi de consommation d'appareils électriques
  • station météo enregistreuse
  • caisse enregistreuse
  • Horloges
  • Calendriers
  • Réveils
  • Mémorisation de paramètres en cas de coupure d'alimentation
Références
La librairie time de l'Arduino
http://playground.arduino.cc/Code/time

Exmple sur Skyduino
http://skyduino.wordpress.com/2012/01/0 ... idcrystal/

Datasheet de Dallas Semiconductor du DS1307
https://www.sparkfun.com/datasheets/Com ... DS1307.pdf

Exemple de câblage et de programmation par ligne de commande (tb) en anglais
http://wiring.org.co/learning/libraries ... clock.html

http://combustory.com/wiki/index.php/RT ... Time_Clock
Le code de Maurice Ribble http://www.glacialwanderer.com/hobbyrobotics/?p=12

Code de lecture et de mise à l'heure
http://bildr.org/2011/03/ds1307-arduino/
tiptopboards - admin
Avatar de l’utilisateur
tiptop
Administrateur du site
 
Messages: 88
Inscription: Mar 13 Aoû 2013 20:38
Localisation: 38

Retourner vers Capteurs et composants

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité