Table des matières:

Horloge temps réel avec Arduino : 3 étapes
Horloge temps réel avec Arduino : 3 étapes

Vidéo: Horloge temps réel avec Arduino : 3 étapes

Vidéo: Horloge temps réel avec Arduino : 3 étapes
Vidéo: Arduino #55 module DS3231 horloge en temps réel RTC tuto en français. 2024, Juillet
Anonim
Horloge en temps réel avec Arduino
Horloge en temps réel avec Arduino

Dans ce projet, nous allons fabriquer une horloge à l'aide du module Arduino et RTC. Comme nous le savons, l'Arduino ne peut pas afficher l'heure réelle, nous utiliserons donc le module RTC pour afficher la bonne heure sur l'écran LCD. Lisez attentivement toutes les étapes, cela vous aidera beaucoup à faire fonctionner l'horloge.

Le code DS3231 Arduino est comme le code DS1307 et il fonctionne avec les deux puces RTC.

Le code Arduino ci-dessous n'utilise aucune bibliothèque pour le DS3231 RTC, la bibliothèque Wire est pour la correspondance entre l'Arduino et le DS3231 utilisant la convention I2C.

Oui! De nombreux ingénieurs en électronique en dépendent pour leurs projets basés sur le temps, mais RTC n'est pas complètement fiable. Il fonctionne sur batterie et doit être remplacé tôt ou tard. Pour les projets IoT, il occupe de précieuses broches SPI (Serial Peripheral Interface) et devient désordonné avec des fils emmêlés. Solution… Voici notre héros NTP (Network time protocol). NTP est si précis car il obtient le temps d'Internet. Nous allons exploiter ce protocole en mode client-serveur. le processus est si simple que notre Nodemcu agit en tant que client et demande un paquet NTP au serveur en utilisant UDP. En retour, le serveur envoie un paquet au client qui analyse les données. NTP est le protocole universel de synchronisation de l'heure. Allumons maintenant le poste de travail de nos laboratoires

Étape 1: Composants requis

  • carte Arduino
  • Carte RTC DS3231
  • Écran LCD 16x2
  • 2 x bouton poussoir
  • Résistance variable 10K ohm (ou potentiomètre)
  • Résistance de 330 ohms
  • Pile bouton 3V
  • Planche à pain
  • Fils de cavalier

Mocule RTC DS3231

Le temps est un sens essentiel requis dans ce monde trépidant d'êtres humains. Projet en temps réel

Nous utilisons RTC (A. K. A Horloge en temps réel)

RTC Real-time-clock (RTC) est un circuit intégré (IC) qui garde une trace de l'heure actuelle. RTC prend en charge le temps en mode réel. Le RTC se trouve généralement dans les cartes mères d'ordinateurs et les systèmes embarqués pour nécessiter un accès rapide.

Étape 2: connexion de l'horloge Arduino

Connexion de l'horloge Arduino
Connexion de l'horloge Arduino
  • Connectez la broche SCL au module RTC à l'Arduino A5
  • Connectez la broche SDA au module RTC à l'Arduino A4
  • Connectez VCC À 5v et GND À GND
  • Connectez un bouton poussoir à la broche 8
  • Connectez un autre bouton poussoir à la broche 9
  • Connectez RS de l'écran LCD à la broche 2 de l'Arduino
  • Connectez E de l'écran LCD à la broche 3 de l'Arduino
  • Connectez D7 de l'écran LCD à la broche 7 de l'Arduino
  • Connectez D6 de l'écran LCD à la broche 6 de l'Arduino
  • Connectez D5 de l'écran LCD à la broche 5 de l'Arduino
  • Connectez D4 de l'écran LCD à la broche 4 de l'Arduino
  • Connectez VSS & K au GND
  • Connectez VDD & A au 5v
  • Connectez vo à la broche de sortie du potentiomètre

Étape 3: Code pour l'horloge Arduino avec RTC

Code pour l'horloge Arduino avec RTC
Code pour l'horloge Arduino avec RTC

Le DS3231 fonctionne uniquement avec le format BCD et pour convertir le BCD en décimal et vice versa, j'ai utilisé les 2 lignes ci-dessous (exemple pour la minute):// Convertir BCD en décimaleminute = (minute >> 4) * 10 + (minute & 0x0F);

// Convertir la décimale en BCDminute = ((minute / 10) << 4) + (minute % 10); void DS3231_display(): affiche l'heure et le calendrier, avant d'afficher l'heure et les données du calendrier sont converties du BCD au format décimal.void blink_parameter():

// Horloge en temps réel et calendrier avec boutons de réglage utilisant DS3231 et Arduino // Inclut le code de la bibliothèque LCD #include // Inclut le code de la bibliothèque Wire (nécessaire pour les appareils à protocole I2C) #include // Connexions du module LCD (RS, E, D4, D5, D6, D7) LiquidCrystal LCD(2, 3, 4, 5, 6, 7); void setup() { pinMode(8, INPUT_PULLUP); // button1 est connecté à la broche 8 pinMode (9, INPUT_PULLUP); // button2 est connecté à la broche 9 // configure le nombre de colonnes et de lignes de l'écran LCD lcd.begin (16, 2); Fil.begin(); // Rejoindre le bus i2c } char Time = "TIME::: "; car Calendrier = "DATE: / /20 "; octet i, seconde, minute, heure, date, mois, année; void DS3231_display(){ // Convertir BCD en seconde décimale = (second >> 4) * 10 + (second & 0x0F); minute = (minute >> 4) * 10 + (minute & 0x0F); heure = (heure >> 4) * 10 + (heure & 0x0F); date = (date >> 4) * 10 + (date & 0x0F); mois = (mois >> 4) * 10 + (mois & 0x0F); année = (année >> 4) * 10 + (année & 0x0F); // Fin de la conversion Heure[12] = seconde % 10 + 48; Temps[11] = seconde / 10 + 48; Temps[9] = minutes % 10 + 48; Heure[8] = minute / 10 + 48; Heure[6] = heure % 10 + 48; Heure[5] = heure / 10 + 48; Calendrier[14] = année % 10 + 48; Calendrier[13] = année / 10 + 48; Calendrier[9] = mois % 10 + 48; Calendrier[8] = mois / 10 + 48; Calendrier[6] = date % 10 + 48; Calendrier[5] = date / 10 + 48; lcd.setCursor(0, 0); lcd.print(Heure); // Affichage de l'heure lcd.setCursor(0, 1); lcd.print(Calendrier); // Afficher le calendrier } void blink_parameter(){ byte j = 0; while(j 23) // Si heures > 23 ==> heures = 0 paramètre = 0; if(i == 1 && paramètre > 59) // Si minutes > 59 ==> minutes = 0 paramètre = 0; if(i == 2 && paramètre > 31) // Si date > 31 ==> date = 1 paramètre = 1; if(i == 3 && paramètre > 12) // Si mois > 12 ==> mois = 1 paramètre = 1; if(i == 4 && paramètre > 99) // Si année > 99 ==> année = 0 paramètre = 0; sprintf(texte, "%02u", paramètre); lcd.setCursor(x, y); lcd.print(texte); retard (200); // Attendre 200ms } lcd.setCursor(x, y); lcd.print(" "); // Affiche deux espaces blink_parameter(); sprintf(texte, "%02u", paramètre); lcd.setCursor(x, y); lcd.print(texte); blink_parameter(); if(!digitalRead(8)){ // Si le bouton (broche #8) est enfoncé i++; // Incrémente 'i' pour le prochain paramètre paramètre de retour; // Renvoie la valeur du paramètre et quitte } } } void loop() { if(!digitalRead(8)){ // Si le bouton (broche n°8) est enfoncé i = 0; heure = éditer (5, 0, heure); minute = éditer (8, 0, minute); date = modifier (5, 1, date); mois = modifier(8, 1, mois); année = modifier (13, 1, année); // Convertir la décimale en BCD minute = ((minute / 10) << 4) + (minute % 10); heure = ((heure / 10) << 4) + (heure % 10); date = ((date / 10) << 4) + (date % 10); mois = ((mois / 10) << 4) + (mois % 10); année = ((année / 10) << 4) + (année % 10); // Terminer la conversion // Ecrire les données dans DS3231 RTC Wire.beginTransmission(0x68); // Démarrer le protocole I2C avec l'adresse DS3231 Wire.write(0); // Envoi de l'adresse du registre Wire.write(0); // Réinitialiser les sessions et démarrer l'oscillateur Wire.write(minute); // Écrire la minute Wire.write(hour); // Ecrit l'heure Wire.write(1); // Jour d'écriture (non utilisé) Wire.write(date); // Écrire la date Wire.write(month); // Ecrit le mois Wire.write(year); // Écrivez l'année Wire.endTransmission(); // Arrête la transmission et libère le délai de bus I2C (200); // Attendre 200ms } Wire.beginTransmission(0x68); // Démarrer le protocole I2C avec l'adresse DS3231 Wire.write(0); // Envoyer l'adresse du registre Wire.endTransmission(false); // Redémarrage I2C Wire.requestFrom (0x68, 7); // Demande 7 octets à DS3231 et libère le bus I2C à la fin de la lecture second = Wire.read(); // Lecture des secondes à partir du registre 0 minute = Wire.read(); // Lecture des minutes du registre 1 heure = Wire.read(); // Lecture de l'heure à partir du registre 2 Wire.read(); // Lecture du jour à partir du registre 3 (non utilisé) date = Wire.read(); // Lecture de la date du registre 4 mois = Wire.read(); // Lecture du mois à partir du registre 5 year = Wire.read(); // Lecture de l'année à partir du registre 6 DS3231_display(); // Temps d'affichage et délai calendaire (50); // Attendre 50ms }

Conseillé: