Académique Documents
Professionnel Documents
Culture Documents
Nous savons tous que la plupart des microcontrôleurs que nous utilisons pour nos
projets sont indépendants du temps; en termes simples, ils ne sont pas conscients du
temps qui les entoure. C'est OK pour la plupart de nos projets, mais de temps en temps,
lorsque vous rencontrez une idée où le respect du temps est une préoccupation majeure,
le module DS3231 Precision RTC est un sauveur. Il est parfait pour les projets contenant
l'enregistrement de données, la création d'horloge, l'horodatage, les minuteries et les
alarmes.
La puce conserve les informations sur les secondes, les minutes, les heures, le jour, la
date, le mois et l'année. La date de fin de mois est automatiquement ajustée pour les
mois de moins de 31 jours, y compris les corrections pour l'année bissextile (valable
jusqu'à 2100).
L'autre fonctionnalité intéressante de cette carte est fournie avec la broche SQW, qui
produit une belle onde carrée à 1 Hz, 4 kHz, 8 kHz ou 32 kHz et peut être gérée par
programme. Cela peut en outre être utilisé comme une interruption en raison d'une
condition d'alarme dans de nombreuses applications basées sur le temps.
Pour éviter ces légères dérives dans le cristal, le DS3231 est entraîné par un oscillateur à
cristal compensé en température de 32 kHz (TCXO) . Il est hautement immunisé contre
les changements de température externes.
TCXO est emballé à l'intérieur de la puce RTC, ce qui rend l'ensemble du paquet
volumineux. Juste à côté du cristal intégré se trouve un capteur de température.
C'est la raison pour laquelle TCXO fournit une horloge de référence stable et précise et
maintient le RTC avec une précision de ± 2 minutes par an.
Le DS1307 est livré avec un cristal externe de 32 kHz pour le chronométrage dont la
fréquence d'oscillation est facilement affectée par la température externe. Cela se traduit
généralement par un décalage d'environ cinq minutes par mois.
Cependant, le DS3231 est beaucoup plus précis, car il est livré avec un oscillateur à
cristal compensé en température (TCXO) interne qui n'est pas affecté par la température,
ce qui le rend précis jusqu'à quelques minutes par an au maximum.
DS1307 est toujours un RTC de grande valeur et vous sert bien, mais pour les projets qui
nécessitent un chronométrage plus précis, DS3231 est recommandé.
Batterie de secours
Le DS3231 intègre une entrée de batterie et maintient un chronométrage précis lorsque
l'alimentation principale de l'appareil est interrompue.
En supposant qu'une batterie CR2032 complètement chargée d'une capacité de 220 mAh
est utilisée et que la puce consomme au minimum 3µA, la batterie peut maintenir le RTC
en fonctionnement pendant au moins 8 ans sans alimentation externe 5V.
L'adresse I2C de l'EEPROM peut être facilement modifiée grâce aux trois cavaliers à
souder A0, A1 et A2 à l'arrière. Chacun de ceux-ci est utilisé pour coder en dur
l'adresse. Si un cavalier est court-circuité avec de la soudure, cela définit l'adresse.
Selon la fiche technique du 24C32, ces 3 bits sont placés à la fin de l'adresse I2C 7 bits,
juste avant le bit de lecture / écriture.
Comme il y a 3 entrées d'adresse, qui peuvent prendre 2 états, soit HIGH / LOW, on peut
3
donc créer 8 (2 ) combinaisons (adresses) différentes.
ASTUCE
Par défaut, toutes les 3 entrées d'adresse sont tirées HAUT à l'aide de pullups intégrés,
donnant à 24C32 une adresse I2C par défaut de 1010111 binaire ou 0x57 hexadécimal .
En court-circuitant les cavaliers de soudure, les entrées d'adresse sont réduites à l'état
bas. Il vous permet de définir l'adresse I2C selon le tableau ci-dessous.
Le code de lecture / écriture à bord de l'EEPROM 24C32 est donné à la fin du tutoriel .
Les connexions sont assez simples. Commencez par connecter la broche VCC à la sortie
5V de l'Arduino et connectez GND à la terre.
Maintenant, nous restons avec les broches qui sont utilisées pour la communication
I2C. Notez que chaque carte Arduino a différentes broches I2C qui doivent être
connectées en conséquence. Sur les cartes Arduino avec la disposition R3, le SDA (ligne
de données) et SCL (ligne d'horloge) sont sur les en-têtes de broches proches de la
broche AREF. Ils sont également appelés A5 (SCL) et A4 (SDA).
Si vous avez un Mega, les broches sont différentes! Vous voudrez utiliser le numérique
21 (SCL) et 20 (SDA). Reportez-vous au tableau ci-dessous pour une compréhension
rapide.
SCL SDA
Arduino Uno A5 A4
Arduino Nano A5 A4
Arduino Mega 21 20
Léonard / Micro 3 2
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
void setup ()
{
Serial.begin(9600);
delay(3000); // wait for console opening
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
// Comment out below lines once you set the date & time.
// Following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Following line sets the RTC with an explicit date & time
// for example to set January 27 2017 at 12:56 you would call:
// rtc.adjust(DateTime(2017, 1, 27, 12, 56, 0));
}
}
void loop ()
{
DateTime now = rtc.now();
Serial.println();
delay(1000);
}
Explication du code:
L'esquisse commence par inclure les bibliothèques wire.h et RTClib.h pour communiquer
avec le module. Nous créons ensuite un objet de la bibliothèque RTClib et
définissons daysOfTheWeekun tableau de caractères 2D pour stocker les informations sur
les jours.
Dans les sections setup et loop du code, nous utilisons les fonctions suivantes pour
interagir avec le module RTC.
La fonction lostPower () lit les registres I2C internes du DS3231 pour vérifier si la puce a
perdu la notion du temps. Si la fonction renvoie true, nous pouvons alors définir la date et
l'heure.
#include <Wire.h>
void setup()
{
char somedata[] = "lastminuteengineers.com"; // data to write
Wire.begin(); // initialise the connection
Serial.begin(9600);
Serial.println("Writing into memory...");
// write to EEPROM
i2c_eeprom_write_page(0x57, 0, (byte *)somedata, sizeof(somedata));
delay(100); //add a small delay
Serial.println("Memory written");
}
void loop()
{
Serial.print("Reading memory: ");
int addr=0; //first address
while (b!=0)
{
Serial.print((char)b); //print content to serial port
addr++; //increase address
b = i2c_eeprom_read_byte(0x57, addr); //access an address from the
memory
}
Serial.println(" ");
delay(2000);
}