Bonjour
Il est possible d'utiliser le DS3231 (horloge RTC) beaucoup plus efficacement sans librairie, juste avec <wire.h>
Datasheet ici : https://www.digikey.fr/fr/datasheets...ds3231-ds3231s
Le code :
Quelques fonctions et variables globales :
Pour lire l'heure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #define CLOCK_ADDRESS 0x68 // Adresse du DS3231 ; elle peut être changée si besoin à coup de fer à souder sur les pads A0, A1 et A2 uint8_t Clock_ss; uint8_t Clock_mm; uint8_t Clock_hh; uint8_t Clock_d; uint8_t Clock_m; uint8_t Clock_y; void I2C_Write_BCD(uint8_t val) { Wire.write(val + 6 * (val / 10)); } uint8_t I2C_Read_BCD() { uint8_t val = Wire.read(); return val - 6 * (val >> 4); }
Pour régler l'heure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void get_RTC_time() { Wire.beginTransmission(CLOCK_ADDRESS); Wire.write(0x00); // 1st register Wire.endTransmission(); Wire.requestFrom(CLOCK_ADDRESS, 7); // 7 bytes to read Clock_ss = I2C_Read_BCD(); Clock_mm = I2C_Read_BCD(); Clock_hh = I2C_Read_BCD(); I2C_Read_BCD(); // Day of week not used Clock_d = I2C_Read_BCD(); Clock_m = I2C_Read_BCD() & 0b00001111; // Do not need century Clock_y = I2C_Read_BCD(); }
Pour info, le bit "Century" du DS3231 doit être laissé à 0 pour le millénaire actuel (la datasheet n'est pas très explicite à ce sujet)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Wire.beginTransmission(CLOCK_ADDRESS); Wire.write(0x00); // 1st register I2C_Write_BCD(Clock_ss); // Seconds I2C_Write_BCD(Clock_mm); // Minutes I2C_Write_BCD(Clock_hh & 0b10111111); // Hour - bit 6 is set to 0 for 24h format I2C_Write_BCD(0); // Day of week - not used I2C_Write_BCD(Clock_d); // Date I2C_Write_BCD(Clock_m); // Month - bit 7 is century not used I2C_Write_BCD(Clock_y ); // Year Wire.endTransmission();
J'ai testé ça marche, l'an 2000 est bien une année bissextile (passage du 28/02/2000 au 29/02/2000 à 23h59:59)
(l'an 2000 est bissextile mais pas 1900 : https://fr.wikipedia.org/wiki/Ann%C3...gr%C3%A9gorien.)
Le DS3231 utilise du BCD ce qui facilite l'utilisation directe pour affichage (afficheurs 7 segments, LCD) mais quand on utilise la date pour des calculs ou avec sprintf_P() c'est inutile.
Je n'utilise pas le mode 12h AM/PM car c'est pénible pour les calculs et ça demande d'être plus vigilant pour lire et écrire le DS3231.
Si vous voulez un affichage en mode 12h autant le faire vous même dans votre code d'affichage ça ne prendra pas plus de ressources et ça sera certainement plus fiable.
Je vais m'attaquer au AHT20 d'Adafruit (capteur humidité et température) de la même façon, directement en I2C, car la bibliothèque d'Adafruit est inutilement très consommatrice d'octets de code et de RAM
Moralité : il vaut mieux piloter les périphériques I2C directement en I2C...
A la base, I2C a été conçu sur mesure pour la programmation sur microcontrôleurs, <wire.h> est suffisante.
Dommage la documentation des vendeurs propose toujours d'utiliser de lourdes bibliothèques, qu'il faut éplucher pour retrouver les commandes I2C...
A bientôt
Partager