Arduino Digitaluhr mit RTC-Modul

Versuchen Sie Unser Instrument, Um Probleme Zu Beseitigen





In diesem Beitrag werden wir eine Digitaluhr mit RTC oder Real Time Clock-Modul erstellen. Wir werden verstehen, was 'RTC' -Modul ist, wie man mit Arduino zusammenarbeitet und was es tut.

Durch:



Das RTC-Modul ist eine Schaltung, die die aktuelle Zeit genau verfolgt. Es hat zwei Funktionen, kommuniziert mit Mikrocontrollern und Mikroprozessoren, um die aktuelle Zeit anzugeben, und fungiert als Backup-Schaltung zur Aufrechterhaltung der Zeit bei Stromausfall, da es über ein eingebautes Batterie-Backup-System verfügt.

Wir können RTC in allen elektronischen Geräten finden, bei denen die Zeit eine wichtige Funktion des Gadgets ist.



Zum Beispiel behält unser Computer oder Laptop seine Zeit auch nach dem Abschalten der Stromversorgung oder dem Entfernen des Akkus bei. Auf der Hauptplatine eines jeden Computers befindet sich eine CMOS-Batterie, die die RTC-Schaltung mit Strom versorgt.

Eine ähnliche Schaltung werden wir in diesem Projekt verwenden.

Das RTC-Modul ist ein kostengünstiges Gerät, das auf allen E-Commerce-Websites und in Ihren lokalen elektronischen Projektgeschäften zu finden ist.

Abbildung eines typischen RTC-Moduls DS1307:

Die meisten RTC-Module werden zum Zeitpunkt des Kaufs mit einer Batterie (CR2032) geliefert. Es gibt unterschiedliche Größen und Modelle. Die oben abgebildeten Modelle sind für Sie möglicherweise nicht identisch. Stellen Sie jedoch sicher, dass die Modellnummer DS1307 lautet. Der in diesem Beitrag geschriebene Code ist nur mit DS1307 kompatibel.

Jetzt wissen Sie etwas über RTCs. Kommen wir nun zum Design der Digitaluhr. Bevor Sie mit diesem Projekt fortfahren können, müssen Sie die Bibliothek über die folgenden Links herunterladen und auf Ihrer IDE installieren:

• DS1307RTC.h

Link: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Link: github.com/PaulStoffregen/Time

Weitere zwei Bibliotheken wären in Arduino IDE vorinstalliert, wenn Sie die neueste Version verwenden.

• LiquidCrystal.h

• Wire.h

Die Rennbahn:

Die Schaltungsverbindung zwischen Arduino und LCD-Display ist Standard, die wir bei anderen LCD-basierten Projekten ähnlich finden können. Die einzige zusätzliche Komponente ist die RTC.

Um die Überlastung des Kabels während des Prototyps zu verringern, kann die RTC direkt am Arduino in die analogen Pins eingesetzt werden. Löten Sie SCl, SDA, Vcc und GND mit männlichen Header-Pins und setzen Sie die A2- bis A5-Pins wie im Prototyp gezeigt ein.

Prototyp des Autors:

So fügen Sie RTC richtig in Arduino ein:

Wenn Ihre RTC unterschiedliche Pin-Positionen hat und nicht wie oben dargestellt repliziert werden kann, können Sie immer Drähte für den Anschluss verwenden. Nachdem Ihr Hardware-Setup abgeschlossen ist, wechseln wir zum Software-Teil des Projekts.

So stellen Sie die Zeit ein:

Sobald das RTC-Modul programmiert ist, behält es die Zeit bei, auch wenn es vom Arduino entfernt wird. Die Batterie sollte mindestens ein paar Jahre halten.

Es gibt keine Taste zum Einstellen der Zeit, zu der das folgende Programm die Zeit in RTC einstellt. Die Zeit wird beim Kompilieren des Codes automatisch mit der Zeit Ihres Computers synchronisiert. Stellen Sie daher sicher, dass Ihr Computer auf die richtige Zeit eingestellt ist, bevor Sie die Programme hochladen.
Laden Sie diesen „SetTime“ -Code hoch, um die Zeit mit eingestecktem RTC einzustellen:

#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 } 

Sobald dieser Code hochgeladen ist, öffnen Sie den seriellen Monitor und es sollte eine Erfolgsmeldung angezeigt werden, die besagt, dass die Zeit eingestellt wurde.

Dies bedeutet, dass Ihre Verbindung zwischen RTC und Arduino korrekt ist und die Zeit eingestellt ist.

Laden Sie nun den folgenden Code hoch, um die Uhrzeit auf dem LCD anzuzeigen.

//------------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-------// 

Sobald dies erledigt ist, sollten Sie sehen, dass Uhrzeit und Datum auf dem LCD angezeigt werden und ausgeführt werden.

Hinweis: Der 'SetTime' -Code wurde gegenüber dem Beispielcode von DS1307RTC geändert, um die Kabelverbindungen für das RTC-Modul zu optimieren. Beim Hochladen des Originalcodes wird die Zeit nicht festgelegt.

Digitaler Wecker mit Arduino

Oben haben wir gelernt, wie man die grundlegende Arduino-Uhr mit dem RTC-Modul baut. Im folgenden Abschnitt untersuchen wir, wie diese mit Arduino zu einer digitalen Weckerschaltung aufgerüstet werden kann.

Es gibt einige Leute, die keinen Wecker brauchen, sie wachen auf natürliche Weise auf und es gibt einige Leute, die aufwachen, nachdem der Wecker einige Male geklingelt hat, und es gibt einige Leute, die ein paar Mal den Schlummerknopf drücken und spät zum College / zur Arbeit gehen einige Ausreden.

Das vorgeschlagene lustige kleine Weckerprojekt kann das Problem mit Faulheit während des morgendlichen Aufwachens konfrontieren. Die meisten Wecker verfügen über eine Schlummertaste und eine festgelegte Abschaltzeit für den Alarm, wenn der Benutzer nicht reagiert hat.

Wir haben diesen Wecker ohne Lazy-Taste (Schlummertaste) entwickelt und der Wecker wird erst ausgeschaltet, wenn der Benutzer einen Knopf drückt.

Diese Uhr kann die Uhrzeit im 12-Stunden-Format und das Datum im TT / MM / JJJJ-Format anzeigen.

Uhrzeit und Datum werden auf einem 16 x 2 LCD-Display angezeigt. Ein RTC- oder Echtzeituhr-Zeitmodul sorgt für die Verfolgung der Zeit und kann die korrekte Zeit auch nach einem langen Stromausfall beibehalten.

Es stehen 5 Schaltflächen zur Verfügung, deren Funktion in Kürze erläutert wird. Das Gehirn des Projekts Arduino kann jedes Modell Ihrer Wahl, wir würden Arduino Pro Mini oder Arduino Nano wegen seiner kompakten Größe empfehlen.

Lassen Sie uns nun in die Schaltpläne eintauchen.

Das obige Schema zeigt, dass Arduino die Verbindung anzeigt und den Kontrast der Anzeige durch Drehen des 10K-Potentiometers einstellt.

Das Folgende ist der Rest der Schaltung:

Die Schaltung kann mit 9V 500mA Wandadapter betrieben werden.

Funktionen von 5 Tasten:

S1 - Hiermit wird der Alarm gestoppt (es wird auch die Reset-Taste verwendet).
S2 - Dient zum Einstellen des Alarms. Durch langes Drücken von S2 gelangen Sie zum Alarmeinstellungsmenü.
S3 - Es wird verwendet, um Stunden zu erhöhen.
S4 - wird verwendet, um Minuten zu erhöhen.
S5 - Dient zum Umschalten des Alarmstatus. Wenn auf dem LCD-Display in der rechten unteren Ecke „*“ vorhanden ist, ist der Alarm eingeschaltet. Wenn das „*“ nicht vorhanden ist, ist die Alarmstatistik AUS.

Weitere Informationen zum Einstellen des Alarms finden Sie am Ende des Artikels.

Laden Sie die folgenden Bibliotheksdateien herunter:

Link1: github.com/PaulStoffregen/DS1307RTC
Link2: github.com/PaulStoffregen/Time

Jetzt müssen wir die Zeit auf das RTC-Modul einstellen, die Zeit wird von Ihrem PC zum RTC-Modul synchronisiert.

Laden Sie den folgenden Code hoch, um die Zeit einzustellen und den seriellen Monitor zu öffnen:

//------------------------------------------------// #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 } //----------------------------------------// 

Jetzt haben Sie die Zeit erfolgreich auf RTC eingestellt
Als nächstes müssen Sie den folgenden Hauptcode hochladen:

//------------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-------// 

Nach dem Hochladen des obigen Codes müssen Sie die korrekte Uhrzeit und das korrekte Datum auf dem Display sehen.

Nun wollen wir sehen, wie Sie den Alarm einstellen:
• Drücken Sie lange S2, bis das Alarmmenü angezeigt wird.
• Drücken Sie S3 und S4, um Stunden und Minuten einzustellen.
• Drücken Sie nach der gewünschten Zeit erneut S2. Es wird angezeigt, dass der Alarm auf xx: xx Stunden eingestellt ist.
• Wenn der Alarm eingeschaltet ist, wird auf dem Display das Symbol „*“ angezeigt. Wenn der Alarm ausgeschaltet ist, wird kein Symbol „*“ angezeigt.
• Sie können den Alarm ein- und ausschalten, indem Sie eine halbe Sekunde lang S5 drücken. Drücken Sie nicht lange, bis '*' verschwindet (es wird wieder angezeigt). Drücken Sie einfach eine halbe Sekunde lang, um den Alarmstatus umzuschalten.

WICHTIGER HINWEIS:

Der häufigste Fehler beim Einstellen eines Alarms auf einer Uhr ist das unbeabsichtigte Umschalten von AM / PM, was dazu führt, dass zu unserer gewünschten Zeit kein Alarm ertönt.

Um diesem Problem entgegenzuwirken, ist die vorgeschlagene Weckereinstellung im 24-Stunden-Format ausgelegt.

Die auf dem LCD angezeigte Zeit beträgt 12 Stunden im AM / PM-Format. Wenn Sie jedoch mit diesem Projekt einen Alarm einstellen, müssen Sie im 24-Stunden-Format 0 bis 23 Stunden einstellen.

Beispiel: Wenn Sie den Alarm um 21:00 Uhr einstellen möchten, müssen Sie 21 Stunden und 0 Minuten einstellen. Für 5 Uhr morgens: 5 Stunden und 0 Minuten und so weiter.

Prototyp des Autors:

Gefällt dir dieses projekt Wenn Sie Fragen zu diesem Projekt haben, können Sie diese gerne im Kommentar ausdrücken. Möglicherweise erhalten Sie eine schnelle Antwort.

Videoclip:




Zurück: Beacon Level Indicator Circuit für Mähdreschertanks Weiter: 3 Hochleistungs-Wechselrichterschaltungen SG3525 mit reinem Sinus