Horloge numérique Arduino utilisant le module RTC

Essayez Notre Instrument Pour Éliminer Les Problèmes





Dans cet article, nous allons construire une horloge numérique en utilisant le module RTC ou Real Time Clock. Nous comprendrons ce qu'est le module «RTC», comment s'interfacer avec Arduino et ce qu'il fait.

Par:



Le module RTC est un circuit qui garde une trace précise de l'heure actuelle. Il remplit deux fonctions, il communique avec les microcontrôleurs et les microprocesseurs pour donner l'heure actuelle et agir comme circuit de sauvegarde pour maintenir l'heure en cas de panne de courant, car il dispose d'un système de batterie de secours intégré.

Nous pouvons trouver du RTC dans tous les appareils électroniques où le temps est une fonction importante du gadget.



Par exemple, notre ordinateur ou ordinateur portable conserve son heure même après la mise hors tension ou le retrait de la batterie. Sur la carte mère de n'importe quel ordinateur, nous pouvons trouver une batterie CMOS, qui alimente le circuit RTC.

Un type de circuit similaire que nous allons utiliser dans ce projet.

Le module RTC est un appareil peu coûteux qui peut être trouvé sur tous les sites de commerce électronique et vos magasins de projets électroniques locaux.

Illustration du module RTC DS1307 typique:

La plupart des modules RTC sont livrés avec une pile (CR2032) au moment de l'achat. Il existe différentes tailles et modèles, l'illustration ci-dessus peut ne pas être la même pour vous. Mais assurez-vous que le numéro de modèle est DS1307. Le code écrit dans cet article est uniquement compatible avec DS1307.

Vous savez maintenant quelque chose sur les RTC. Passons maintenant à la conception de l’horloge numérique. Avant de poursuivre ce projet, vous devez télécharger la bibliothèque à partir des liens suivants et l'installer sur votre IDE:

• DS1307RTC.h

Lien: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Lien: github.com/PaulStoffregen/Time

Deux autres bibliothèques auraient été préinstallées sur l'IDE Arduino, si vous utilisez la dernière version.

• LiquidCrystal.h

• Wire.h

Le circuit:

La connexion de circuit entre arduino et écran LCD est standard, que nous pouvons trouver une connexion similaire sur d'autres projets basés sur LCD. Le seul composant supplémentaire est le RTC.

Pour réduire la congestion des fils pendant le prototype, le RTC peut être inséré dans les broches analogiques directement de l'arduino. Soudez les broches SCl, SDA, Vcc et GND avec des broches mâles et insérez-les entre les broches A2 et A5 comme indiqué dans le prototype.

Prototype de l'auteur:

Comment insérer correctement RTC sur Arduino:

Si votre RTC a des emplacements de broches différents et ne peut pas se répliquer comme illustré ci-dessus, vous pouvez toujours utiliser des fils pour la connexion. Maintenant que votre configuration matérielle est terminée, passons à la partie logicielle du projet.

Comment régler l'heure:

Une fois le module RTC programmé, il maintient l'heure même s'il est retiré de l'arduino. La batterie devrait durer au moins deux ans.

Il n'y a pas de bouton pour régler l'heure le programme suivant réglera l'heure en RTC. L'heure est automatiquement synchronisée avec l'heure de votre ordinateur, lors de la compilation du code, assurez-vous donc que votre ordinateur est réglé sur l'heure correcte avant de télécharger les programmes.
Téléchargez ce code «SetTime» pour régler l'heure avec RTC branché:

#include  #include  #include  int P=A3 //Assign power pins for RTC int N=A2 const char *monthName[12] = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' } tmElements_t tm void setup() { pinMode(P,OUTPUT) pinMode(N,OUTPUT) digitalWrite(P,HIGH) digitalWrite(N,LOW) bool parse=false bool config=false // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true // and configure the RTC with this info if (RTC.write(tm)) { config = true } } Serial.begin(9600) while (!Serial)  // wait for Arduino Serial Monitor delay(200) if (parse && config) { Serial.print('DS1307 configured Time=') Serial.print(__TIME__) Serial.print(', Date=') Serial.println(__DATE__) } else if (parse) { Serial.println('DS1307 Communication Error :-{') Serial.println('Please check your circuitry') } else { Serial.print('Could not parse info from the compiler, Time='') Serial.print(__TIME__) Serial.print('', Date='') Serial.print(__DATE__) Serial.println(''') } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec if (sscanf(str, '%d:%d:%d', &Hour, &Min, &Sec) != 3) return false tm.Hour = Hour tm.Minute = Min tm.Second = Sec return true } bool getDate(const char *str) { char Month[12] int Day, Year uint8_t monthIndex if (sscanf(str, '%s %d %d', Month, &Day, &Year) != 3) return false for (monthIndex = 0 monthIndex < 12 monthIndex++) { if (strcmp(Month, monthName[monthIndex]) == 0) break } if (monthIndex >= 12) return false tm.Day = Day tm.Month = monthIndex + 1 tm.Year = CalendarYrToTm(Year) return true } 

Une fois ce code téléchargé, ouvrez le moniteur série et un message de réussite devrait apparaître indiquant que l'heure a été définie.

Cela signifie que votre connexion entre le RTC et arduino est correcte et que l'heure est réglée.

Téléchargez maintenant le code suivant pour afficher l'heure sur l'écran LCD.

//------------Program Developed by R.Girish-------// #include  #include  #include  #include  LiquidCrystal lcd(12, 11, 5, 4, 3, 2) int P=A3 int N=A2 void setup() { lcd.begin(16,2) pinMode(P,OUTPUT) pinMode(N,OUTPUT) digitalWrite(P,HIGH) digitalWrite(N,LOW) } void loop() { tmElements_t tm lcd.clear() if (RTC.read(tm)) { if(tm.Hour>=12) { lcd.setCursor(14,0) lcd.print('PM') } if(tm.Hour<12) { lcd.setCursor(14,0) lcd.print('AM') } lcd.setCursor(0,0) lcd.print('TIME:') if(tm.Hour>12) //24Hrs to 12 Hrs conversion// { if(tm.Hour==13) lcd.print('01') if(tm.Hour==14) lcd.print('02') if(tm.Hour==15) lcd.print('03') if(tm.Hour==16) lcd.print('04') if(tm.Hour==17) lcd.print('05') if(tm.Hour==18) lcd.print('06') if(tm.Hour==19) lcd.print('07') if(tm.Hour==20) lcd.print('08') if(tm.Hour==21) lcd.print('09') if(tm.Hour==22) lcd.print('10') if(tm.Hour==23) lcd.print('11') } else { lcd.print(tm.Hour) } lcd.print(':') lcd.print(tm.Minute) lcd.print(':') lcd.print(tm.Second) lcd.setCursor(0,1) lcd.print('DATE:') lcd.print(tm.Day) lcd.print('/') lcd.print(tm.Month) lcd.print('/') lcd.print(tmYearToCalendar(tm.Year)) } else { if (RTC.chipPresent()) { lcd.setCursor(0,0) lcd.print('RTC stopped!!!') lcd.setCursor(0,1) lcd.print('Run SetTime code') } else { lcd.clear() lcd.setCursor(0,0) lcd.print('Read error!') lcd.setCursor(0,1) lcd.print('Check circuitry!') } delay(500) } delay(500) } //------------Program Developed by R.Girish-------// 

Une fois que cela est fait, vous devriez voir l'heure et la date affichées sur l'écran LCD et en cours d'exécution.

Noter: Le code 'SetTime' est modifié à partir de l'exemple de code du DS1307RTC pour optimiser les connexions de fils pour le module RTC, le téléchargement du code d'origine ne définira pas l'heure.

Réveil numérique utilisant Arduino

Dans ce ci-dessus, nous avons appris comment construire l'horloge Arduino de base à l'aide du module RTC, dans la section suivante, nous étudions comment cela peut être mis à niveau en un circuit de réveil numérique à l'aide d'Arduino.

Il y a des gens qui n'ont pas besoin de réveil, ils se réveillent naturellement et il y a des gens qui se réveillent après que le réveil sonne plusieurs fois et il y a des gens qui appuient sur le bouton de répétition plusieurs fois et vont à l'université / travaillent tard avec quelques excuses.

Le projet de petit réveil amusant proposé peut confronter le problème à la paresse pendant le réveil du matin. La plupart des réveils ont un bouton de répétition et une heure limite prédéterminée pour l'alarme si l'utilisateur n'a pas répondu.

Nous avons conçu ce réveil sans bouton paresseux (bouton de répétition) et l'alarme ne s'éteint pas tant que l'utilisateur n'appuie pas sur un bouton.

Cette horloge peut afficher l'heure au format 12 heures et la date au format JJ / MM / AAAA.

L'heure et la date seront affichées sur l'écran LCD 16 x 2. Un module d'horloge RTC ou temps réel s'occupera du suivi de l'heure et pourra conserver l'heure correcte même après une longue coupure de courant.

Il y a 5 boutons fournis dont la fonction sera expliquée sous peu. Le cerveau du projet Arduino peut s'adapter à n'importe quel modèle de votre choix, nous vous recommandons Arduino pro mini ou Arduino nano en raison de sa taille compacte.

Passons maintenant aux schémas.

Ce qui précède est le schéma pour Arduino pour afficher la connexion, régler le contraste de l'écran en tournant le potentiomètre 10K.

Voici le reste du circuit:

Le circuit peut être alimenté par un adaptateur mural 9V 500mA.

Fonctions de 5 boutons:

S1 - Ceci est utilisé pour arrêter l'alarme (c'est aussi le bouton de réinitialisation).
S2 - Est utilisé pour régler l'alarme. En appuyant longuement sur S2, vous accéderez au menu de réglage de l'alarme.
S3 - Il est utilisé pour incrémenter les heures.
S4 - il est utilisé pour incrémenter les minutes.
S5 - Est utilisé pour basculer l'état d'alarme. Si «*» existe sur l'écran LCD dans le coin inférieur droit, l'alarme est activée, si «*» n'existe pas, les statistiques d'alarme sont désactivées.

Plus de détails sur la façon de régler l'alarme sont expliqués au bas de l'article.

Téléchargez les fichiers de bibliothèque ci-dessous:

Lien1: github.com/PaulStoffregen/DS1307RTC
Lien2: github.com/PaulStoffregen/Time

Maintenant, nous devons régler l'heure sur le module RTC, l'heure sera synchronisée de votre PC vers le module RTC.

Téléchargez le code ci-dessous pour régler l'heure et ouvrir le moniteur série:

//------------------------------------------------// #include  #include  #include  const char *monthName[12] = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' } tmElements_t tm void setup() { bool parse=false bool config=false // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true // and configure the RTC with this info if (RTC.write(tm)) { config = true } } Serial.begin(9600) while (!Serial)  // wait for Arduino Serial Monitor delay(200) if (parse && config) { Serial.print('DS1307 configured Time=') Serial.print(__TIME__) Serial.print(', Date=') Serial.println(__DATE__) } else if (parse) { Serial.println('DS1307 Communication Error :-{') Serial.println('Please check your circuitry') } else { Serial.print('Could not parse info from the compiler, Time='') Serial.print(__TIME__) Serial.print('', Date='') Serial.print(__DATE__) Serial.println(''') } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec if (sscanf(str, '%d:%d:%d', &Hour, &Min, &Sec) != 3) return false tm.Hour = Hour tm.Minute = Min tm.Second = Sec return true } bool getDate(const char *str) { char Month[12] int Day, Year uint8_t monthIndex if (sscanf(str, '%s %d %d', Month, &Day, &Year) != 3) return false for (monthIndex = 0 monthIndex < 12 monthIndex++) { if (strcmp(Month, monthName[monthIndex]) == 0) break } if (monthIndex >= 12) return false tm.Day = Day tm.Month = monthIndex + 1 tm.Year = CalendarYrToTm(Year) return true } //----------------------------------------// 

Vous avez maintenant correctement réglé l'heure sur RTC
Ensuite, vous devez télécharger le code principal suivant:

//------------Program Developed by R.Girish-------// #include  #include  #include  #include  #include  const int rs = 7 const int en = 6 const int d4 = 5 const int d5 = 4 const int d6 = 3 const int d7 = 2 const int buzzer = 8 boolean alarm = false boolean outloop = true const int setAlarm = A0 const int Hrs = A1 const int Min = A2 const int ok = A3 const int HrsADD = 0 const int MinADD = 1 const int ALsave = 2 int HrsVal = 0 int MinVal = 0 int H = 0 int M = 0 int S = 0 int i = 0 int j = 0 int k = 0 LiquidCrystal lcd(rs, en, d4, d5, d6, d7) void setup() { Serial.begin(9600) lcd.begin(16, 2) pinMode(buzzer, OUTPUT) pinMode(setAlarm, INPUT) pinMode(Hrs, INPUT) pinMode(Min, INPUT) pinMode(ok, INPUT) digitalWrite(setAlarm, HIGH) digitalWrite(Hrs, HIGH) digitalWrite(Min, HIGH) digitalWrite(ok, HIGH) } void loop() { tmElements_t tm lcd.clear() if (EEPROM.read(ALsave) == false) { lcd.setCursor(15, 1) lcd.print('') } if (EEPROM.read(ALsave) == true) { lcd.setCursor(15, 1) lcd.print(F('*')) } if (RTC.read(tm)) { if (tm.Hour >= 12) { lcd.setCursor(14, 0) lcd.print('PM') } if (tm.Hour < 12) { lcd.setCursor(14, 0) lcd.print('AM') } lcd.setCursor(0, 0) lcd.print('TIME:') H = tm.Hour if (tm.Hour > 12) { if (tm.Hour == 13) { lcd.print('01') } if (tm.Hour == 14) { lcd.print('02') } if (tm.Hour == 15) { lcd.print('03') } if (tm.Hour == 16) { lcd.print('04') } if (tm.Hour == 17) { lcd.print('05') } if (tm.Hour == 18) { lcd.print('06') } if (tm.Hour == 19) { lcd.print('07') } if (tm.Hour == 20) { lcd.print('08') } if (tm.Hour == 21) { lcd.print('09') } if (tm.Hour == 22) { lcd.print('10') } if (tm.Hour == 23) { lcd.print('11') } } else { lcd.print(tm.Hour) } M = tm.Minute S = tm.Second lcd.print(':') lcd.print(tm.Minute) lcd.print(':') lcd.print(tm.Second) lcd.setCursor(0, 1) lcd.print('DATE:') lcd.print(tm.Day) lcd.print('/') lcd.print(tm.Month) lcd.print('/') lcd.print(tmYearToCalendar(tm.Year)) } else { if (RTC.chipPresent()) { lcd.setCursor(0, 0) lcd.print('RTC stopped!!!') lcd.setCursor(0, 1) lcd.print('Run SetTime code') } else { lcd.clear() lcd.setCursor(0, 0) lcd.print('Read error!') lcd.setCursor(0, 1) lcd.print('Check circuitry!') } } if (digitalRead(setAlarm) == LOW) { setALARM() } if (H == EEPROM.read(HrsADD) && M == EEPROM.read(MinADD) && S == 0) { if (EEPROM.read(ALsave) == true) { sound() } } if (digitalRead(ok) == LOW) { if (EEPROM.read(ALsave) == true) { EEPROM.write(ALsave, 0) alarm = false delay(1000) return } if (EEPROM.read(ALsave) == false) { EEPROM.write(ALsave, 1) alarm = true delay(1000) return } } delay(1000) } void setALARM() { HrsVal = EEPROM.read(HrsADD) MinVal = EEPROM.read(MinADD) lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(EEPROM.read(HrsADD)) lcd.print(F(' Min:')) lcd.print(EEPROM.read(MinADD)) delay(600) while (outloop) { if (HrsVal > 23) { HrsVal = 0 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) } if (MinVal > 59) { MinVal = 0 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) } if (digitalRead(Hrs) == LOW) { HrsVal = HrsVal + 1 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) delay(250) } if (digitalRead(Min) == LOW) { MinVal = MinVal + 1 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) delay(250) } if (digitalRead(setAlarm) == LOW) { EEPROM.write(HrsADD, HrsVal) EEPROM.write(MinADD, MinVal) lcd.clear() lcd.setCursor(0, 0) lcd.print(F('Alarm is Set for')) lcd.setCursor(0, 1) lcd.print(EEPROM.read(HrsADD)) lcd.print(F(':')) lcd.print(EEPROM.read(MinADD)) lcd.print(F(' Hrs')) delay(1000) outloop = false } } outloop = true } void sound() { lcd.clear() lcd.setCursor(0, 0) lcd.print('Wakey Wakey !!!') lcd.setCursor(0, 1) lcd.print('Its Time now.....') for (j = 0 j < 10 j++) { for (i = 0 i < 2  i++) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } delay(400) } for (k = 0 k < 10 k++) { for (i = 0 i < 4  i++) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } delay(250) } while (true) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } } //------------Program Developed by R.Girish-------// 

Après avoir téléchargé le code ci-dessus, vous devez voir l'heure et la date correctes s'afficher sur l'écran.

Voyons maintenant comment régler l'alarme:
• Appuyez longuement sur S2 jusqu'à ce que vous puissiez voir le menu Alarme.
• Appuyez sur S3 et S4 pour régler respectivement les heures et les minutes.
• Une fois le temps défini, appuyez à nouveau sur S2. Il dira «L'alarme est réglée pour xx: xx heures».
• Si l'alarme est activée, vous pouvez voir le symbole «*» sur l'écran, si l'alarme est désactivée, il n'y aura pas de symbole «*».
• Vous pouvez activer / désactiver l'alarme en appuyant sur S5 pendant une demi-seconde. N'appuyez pas longtemps jusqu'à ce que '*' disparaisse (il revient), appuyez simplement une demi-seconde pour basculer l'état de l'alarme.

NOTE IMPORTANTE:

L'erreur la plus courante lors du réglage d'une alarme sur n'importe quelle horloge est le basculement involontaire AM / PM, qui se traduit par le fait que l'alarme ne sonne pas à l'heure souhaitée.

Pour contrer ce problème, le réglage du réveil proposé est conçu au format 24 heures.

L'heure affichée sur l'écran LCD sera de 12 heures avec le format AM / PM mais, lorsque vous réglez une alarme avec ce projet, vous devez régler au format 24 heures de 0 à 23 heures.

Par exemple: si vous souhaitez régler l'alarme à 21h00, vous devez définir 21 heures et 0 minutes. Pour, 5 heures du matin: 5 heures et 0 minutes et ainsi de suite.

Prototype de l'auteur:

Aimez-vous ce projet? Si vous avez des questions concernant ce projet, n'hésitez pas à exprimer dans le commentaire, vous pouvez recevoir une réponse rapide.

Clip vidéo:




Une paire de: Circuit d'indicateur de niveau de balise pour les réservoirs de grain de moissonneuse-batteuse Un article: 3 circuits d'inverseur à onde sinusoïdale pure SG3525 haute puissance