Yahoo refuse tous les emails du site. Si vous avez une adresse chez un autre prestataire, c'est le moment de l'utiliser
En cas de soucis, n'hésitez pas à aller faire un tour sur la page de contact en bas de page.
Exemple de code de lecture et d'ajustement de l'heure pour un module RTC DS1307
par skywodd | | Langue : C++ | Licence : GPLv3
Description :
Exemple de code de lecture et d'ajustement de l'heure pour un module RTC DS1307.
Compatible Arduino 0023 et Arduino 1.x (et supérieur).
Code source :
Voir le code source brut | Télécharger ds1307_rtc.ino | Télécharger ds1307_rtc.ino.zip
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | /**
* Exemple de code de lecture et d'ajustement de l'heure avec un module RTC DS1307.
* Compatible Arduino 0023 et Arduino 1.x (et supérieur).
*/
/* Dépendances */
#include <Wire.h>
#include "DS1307.h"
/* Rétro-compatibilité avec Arduino 1.x et antérieur */
#if ARDUINO >= 100
#define Wire_write(x) Wire.write(x)
#define Wire_read() Wire.read()
#else
#define Wire_write(x) Wire.send(x)
#define Wire_read() Wire.receive()
#endif
/** Fonction de conversion BCD -> decimal */
byte bcd_to_decimal(byte bcd) {
return (bcd / 16 * 10) + (bcd % 16);
}
/** Fonction de conversion decimal -> BCD */
byte decimal_to_bcd(byte decimal) {
return (decimal / 10 * 16) + (decimal % 10);
}
/**
* Fonction récupérant l'heure et la date courante à partir du module RTC.
* Place les valeurs lues dans la structure passée en argument (par pointeur).
* N.B. Retourne 1 si le module RTC est arrêté (plus de batterie, horloge arrêtée manuellement, etc.), 0 le reste du temps.
*/
byte read_current_datetime(DateTime_t *datetime) {
/* Début de la transaction I2C */
Wire.beginTransmission(DS1307_ADDRESS);
Wire_write((byte) 0); // Lecture mémoire à l'adresse 0x00
Wire.endTransmission(); // Fin de la transaction I2C
/* Lit 7 octets depuis la mémoire du module RTC */
Wire.requestFrom(DS1307_ADDRESS, (byte) 7);
byte raw_seconds = Wire_read();
datetime->seconds = bcd_to_decimal(raw_seconds);
datetime->minutes = bcd_to_decimal(Wire_read());
byte raw_hours = Wire_read();
if (raw_hours & 64) { // Format 12h
datetime->hours = bcd_to_decimal(raw_hours & 31);
datetime->is_pm = raw_hours & 32;
} else { // Format 24h
datetime->hours = bcd_to_decimal(raw_hours & 63);
datetime->is_pm = 0;
}
datetime->day_of_week = bcd_to_decimal(Wire_read());
datetime->days = bcd_to_decimal(Wire_read());
datetime->months = bcd_to_decimal(Wire_read());
datetime->year = bcd_to_decimal(Wire_read());
/* Si le bit 7 des secondes == 1 : le module RTC est arrêté */
return raw_seconds & 128;
}
/**
* Fonction ajustant l'heure et la date courante du module RTC à partir des informations fournies.
* N.B. Redémarre l'horloge du module RTC si nécessaire.
*/
void adjust_current_datetime(DateTime_t *datetime) {
/* Début de la transaction I2C */
Wire.beginTransmission(DS1307_ADDRESS);
Wire_write((byte) 0); // Ecriture mémoire à l'adresse 0x00
Wire_write(decimal_to_bcd(datetime->seconds) & 127); // CH = 0
Wire_write(decimal_to_bcd(datetime->minutes));
Wire_write(decimal_to_bcd(datetime->hours) & 63); // Mode 24h
Wire_write(decimal_to_bcd(datetime->day_of_week));
Wire_write(decimal_to_bcd(datetime->days));
Wire_write(decimal_to_bcd(datetime->months));
Wire_write(decimal_to_bcd(datetime->year));
Wire.endTransmission(); // Fin de transaction I2C
}
/** Fonction setup() */
void setup() {
/* Initialise le port série */
Serial.begin(115200);
/* Initialise le port I2C */
Wire.begin();
/* Vérifie si le module RTC est initialisé */
DateTime_t now;
if (read_current_datetime(&now)) {
Serial.println(F("L'horloge du module RTC n'est pas active !"));
// Reconfiguration avec une date et heure en dure (pour l'exemple)
now.seconds = 0;
now.minutes = 0;
now.hours = 12; // 12h 0min 0sec
now.is_pm = 0;
now.day_of_week = 4;
now.days = 1;
now.months = 12;
now.year = 16; // 1 dec 2016
adjust_current_datetime(&now);
}
}
/** Fonction loop() */
void loop() {
/* Lit la date et heure courante */
DateTime_t now;
if (read_current_datetime(&now)) {
Serial.println(F("L'horloge du module RTC n'est pas active !"));
}
/* Affiche la date et heure courante */
Serial.print(F("Date : "));
Serial.print(now.days);
Serial.print(F("/"));
Serial.print(now.months);
Serial.print(F("/"));
Serial.print(now.year + 2000);
Serial.print(F(" Heure : "));
Serial.print(now.hours);
Serial.print(F(":"));
Serial.print(now.minutes);
Serial.print(F(":"));
Serial.println(now.seconds);
/* Rafraichissement une fois par seconde */
delay(1000);
}
|