Composants
- 1 module RCT DS1307 (Real Time Clock)
- 1 barrette de connexion
- 1 Carte Arduino Uno R3
- 1 Breadboard et quelques fils de câblage
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.
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). .
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.
Fonctionnalités
- Heure/Minutes/Secondes AM/PM
- Jour Mois Année
- Ajustement d'année bissextiles
- Calendrier jusque 2100
Branchements 4 fils
- DS1307 --> Arduino
- VCC --> +5v
- GND --> GND
- SDA --> pin A4 Data (pin 20 sur Mega)
- SCL -->pin A5 Clock (pin 21 sur Mega)
Brochage P1 du RTC DS1307 :
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
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/