Table des matières:

Utilisation des modules d'horloge temps réel DS1307 et DS3231 avec Arduino : 3 étapes
Utilisation des modules d'horloge temps réel DS1307 et DS3231 avec Arduino : 3 étapes

Vidéo: Utilisation des modules d'horloge temps réel DS1307 et DS3231 avec Arduino : 3 étapes

Vidéo: Utilisation des modules d'horloge temps réel DS1307 et DS3231 avec Arduino : 3 étapes
Vidéo: Utiliser un RTC DS3231 | Elpo 2024, Novembre
Anonim
Utilisation des modules d'horloge temps réel DS1307 et DS3231 avec Arduino
Utilisation des modules d'horloge temps réel DS1307 et DS3231 avec Arduino
Utilisation des modules d'horloge temps réel DS1307 et DS3231 avec Arduino
Utilisation des modules d'horloge temps réel DS1307 et DS3231 avec Arduino

Nous continuons à recevoir des demandes sur la façon d'utiliser les modules d'horloge en temps réel DS1307 et DS3231 avec Arduino de diverses sources - c'est donc la première d'un didacticiel en deux parties sur la façon de les utiliser. Pour ce tutoriel Arduino, nous avons deux modules d'horloge en temps réel à utiliser, l'un basé sur le Maxim DS1307 (le module carré) et le DS3231 (le module rectangulaire).

Il existe deux différences principales entre les circuits intégrés des modules d'horloge en temps réel, à savoir la précision de l'heure. Le DS1307 utilisé dans le premier module fonctionne très bien, cependant la température externe peut affecter la fréquence du circuit oscillateur qui pilote le compteur interne du DS1307.

Cela peut sembler un problème, mais il en résulte généralement que l'horloge est décalée d'environ cinq minutes par mois. Le DS3231 est beaucoup plus précis, car il possède un oscillateur interne qui n'est pas affecté par des facteurs externes - et est donc précis jusqu'à quelques minutes par an au maximum. Si vous avez un module DS1307, ne vous sentez pas mal, c'est toujours une carte de grande valeur et vous servira bien. Avec les deux modules, une batterie de secours est nécessaire.

C'est une bonne idée d'acheter une nouvelle pile CR2032 et de l'adapter au module. En plus de garder une trace de l'heure et de la date, ces modules disposent également d'une petite EEPROM, d'une fonction d'alarme (DS3231 uniquement) et de la possibilité de générer une onde carrée de différentes fréquences - tout cela fera l'objet d'un deuxième tutoriel.

Étape 1: Connecter votre module à un Arduino

Les deux modules utilisent le bus I2C, ce qui rend la connexion très facile.

Vous devrez d'abord identifier les broches de votre Arduino ou des cartes compatibles utilisées pour le bus I2C - elles seront appelées SDA (ou données) et SCL (ou horloge). Sur les cartes Arduino Uno ou compatibles, ces broches sont A4 et A5 pour les données et l'horloge; Sur l'Arduino Mega, les broches sont D20 et D21 pour les données et l'horloge; Et si vous utilisez un Pro Mini compatible, les broches sont A4 et A5 pour les données et l'horloge, qui sont parallèles aux broches principales.

module DS1307

Si vous avez le module DS1307, vous devrez souder les fils à la carte ou souder certaines broches d'en-tête en ligne afin de pouvoir utiliser des câbles de connexion. Connectez ensuite les broches SCL et SDA à votre Arduino, et la broche Vcc à la broche 5V et GND à GND.

module DS3231

La connexion de ce module est facile car les broches d'en-tête sont installées sur la carte en usine. Vous pouvez simplement exécuter à nouveau des câbles de raccordement de SCL et SDA à l'Arduino et à nouveau des broches Vcc et GND du module aux 5V ou 3,3. V et GND de votre carte. Cependant, ceux-ci sont dupliqués de l'autre côté pour souder vos propres fils. Ces deux modules ont les résistances pull-up requises, vous n'avez donc pas besoin d'ajouter les vôtres. Comme tous les appareils connectés au bus I2C, essayez de réduire au minimum la longueur des fils SDA et SCL.

Étape 2: Lecture et écriture de l'heure à partir de votre module RTC

Une fois que vous avez câblé votre module RTC. entrez et téléchargez le croquis suivant. Bien que les notes et les fonctions du croquis se réfèrent uniquement au DS3231, le code fonctionne également avec le DS1307.

#include "Wire.h"#define DS3231_I2C_ADDRESS 0x68 // Convertir les nombres décimaux normaux en octet décimal codé binaire decToBcd(byte val) { return((val/10*16) + (val%10)); } // Convertir les nombres décimaux codés binaires en nombres décimaux normaux byte bcdToDec(byte val) { return((val/16*10) + (val%16)); } void setup() { Wire.begin(); Serial.begin(9600); // définissez l'heure initiale ici: // DS3231 seconds, minutes, hours, day, date, month, year // setDS3231time(30, 42, 21, 4, 26, 11, 14); } void setDS3231time(octet seconde, octet minute, octet heure, octet dayOfWeek, octet dayOfMonth, octet mois, octet année) { // définit les données d'heure et de date sur DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // définit l'entrée suivante pour qu'elle commence au registre des secondes Wire.write(decToBcd(second)); // définit les secondes Wire.write(decToBcd(minute)); // définit les minutes Wire.write(decToBcd(hour)); // définir les heures Wire.write(decToBcd(dayOfWeek)); // définir le jour de la semaine (1=dimanche, 7=samedi) Wire.write(decToBcd(dayOfMonth)); // fixe la date (1 à 31) Wire.write(decToBcd(month)); // définir le mois Wire.write(decToBcd(year)); // définir l'année (0 à 99) Wire.endTransmission(); } void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // définit le pointeur de registre DS3231 sur 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // demande sept octets de données de DS3231 à partir du registre 00h *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *heure = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *mois = bcdToDec(Wire.read()); *année = bcdToDec(Wire.read()); } void displayTime() { octet seconde, minute, heure, dayOfWeek, dayOfMonth, mois, année; // récupérer les données du DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // l'envoie au moniteur série Serial.print(hour, DEC); // convertit la variable d'octet en nombre décimal lorsqu'elle est affichée Serial.print(":"); if (minute<10) { Serial.print("0"); } Serial.print(minute, DEC); Serial.print(":"); if (second<10) { Serial.print("0"); } Serial.print(second, DEC); Serial.print(" "); Serial.print(dayOfMonth, DEC); Serial.print("/"); Serial.print(mois, DEC); Serial.print("/"); Serial.print(année, DEC); Serial.print(" Jour de la semaine: "); switch(dayOfWeek){ case 1: Serial.println("Dimanche"); Pause; cas 2: Serial.println("lundi"); Pause; cas 3: Serial.println("mardi"); Pause; cas 4: Serial.println("Mercredi"); Pause; case 5: Serial.println("Jeudi"); Pause; cas 6: Serial.println("Vendredi"); Pause; cas 7: Serial.println("samedi"); Pause; } } boucle vide() { displayTime(); // affiche les données de l'horloge en temps réel sur le moniteur série, delay(1000); // chaque seconde }

Il peut y avoir beaucoup de code, mais il se décompose bien en parties gérables.

Il inclut d'abord la bibliothèque Wire, qui est utilisée pour la communication par bus I2C, suivie de la définition de l'adresse de bus pour le RTC en tant que 0x68. Celles-ci sont suivies de deux fonctions qui convertissent les nombres décimaux en BCD (décimal codé binaire) et vice versa. Ceux-ci sont nécessaires car les circuits intégrés RTC fonctionnent en BCD et non en décimal.

La fonction setDS3231time() est utilisée pour régler l'horloge. Son utilisation est très simple, insérez simplement les valeurs de l'année jusqu'à la seconde, et le RTC démarrera à partir de ce moment. Par exemple, si vous souhaitez régler la date et l'heure suivantes - mercredi 26 novembre 2014 et 21 h 42 et 30 secondes - vous utiliserez:

setDS3231time(30, 42, 21, 4, 26, 11, 14);

Étape 3:

Notez que l'heure est réglée sur 24 heures et que le quatrième paramètre est le « jour de la semaine ». Cela se situe entre 1 et 7 qui est du dimanche au samedi respectivement. Ces paramètres sont des valeurs d'octet si vous remplacez vos propres variables.

Une fois que vous avez exécuté la fonction une fois, il est sage de la préfixer avec // et de télécharger à nouveau votre code, afin qu'il ne réinitialise pas l'heure une fois l'alimentation redémarrée ou la réinitialisation du microcontrôleur. Lire l'heure de votre RTC est tout aussi simple, en fait le processus peut être suivi proprement à l'intérieur de la fonction displayTime(). Vous devrez définir des variables de sept octets pour stocker les données du RTC, et celles-ci seront ensuite insérées dans la fonction readDS3231time(). Par exemple si vos variables sont:

octet seconde, minute, heure, dayOfWeek, dayOfMonth, mois, année;

… vous les rafraîchiriez avec les données actuelles du RTC en utilisant:

readDS3232time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

Ensuite, vous pouvez utiliser les variables comme bon vous semble, de l'envoi de l'heure et de la date au moniteur série comme le fait l'exemple d'esquisse - à la conversion des données sous une forme appropriée pour toutes sortes de périphériques de sortie.

Juste pour vérifier que tout fonctionne, entrez l'heure et la date appropriées dans le croquis de démonstration, téléchargez-le, commentez la fonction setDS3231time() et téléchargez-le à nouveau. Ensuite, ouvrez le moniteur série et vous devriez obtenir un affichage en cours de l'heure et de la date actuelles.

À partir de ce point, vous disposez maintenant des outils logiciels pour définir les données et les récupérer à partir de votre module d'horloge en temps réel, et nous espérons que vous comprenez comment utiliser ces modules peu coûteux.

Vous pouvez en savoir plus sur les circuits intégrés d'horloge en temps réel particuliers sur le site Web du fabricant - DS1307 et DS3231.

Cet article vous est présenté par pmdway.com - tout pour les fabricants et les passionnés d'électronique, avec une livraison gratuite dans le monde entier.

Conseillé: