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 :

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 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
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 régler l'heure :

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();
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)

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