Arduino digitalt ur ved hjælp af RTC-modul

Prøv Vores Instrument Til At Fjerne Problemer





I dette indlæg skal vi konstruere et digitalt ur ved hjælp af RTC eller Real Time Clock-modulet. Vi vil forstå, hvad “RTC” -modulet er, hvordan man bruger interface til Arduino, og hvad det gør.

Ved:



RTC-modul er et kredsløb, der holder nøjagtigt styr på den aktuelle tid. Den har to funktioner, den kommunikerer med mikrocontrollere og mikroprocessorer for at give aktuel tid og fungere som backup-kredsløb for at opretholde tid i tilfælde af strømsvigt, da den har et indbygget backup-system til batteri.

Vi kan finde RTC i ethvert elektronisk udstyr, hvor tid er en vigtig funktion af gadgeten.



For eksempel opretholder vores computer eller laptop sin tid, selv efter strømmen er slukket, eller batteriet er taget ud. På bundkortet på enhver computer kan vi finde et CMOS-batteri, der driver RTC-kredsløbet.

Lignende slags kredsløb, vi skal bruge i dette projekt.

RTC-modul er en billig enhed, som kan findes på alle e-handelswebsteder og dine lokale elektroniske projektbutikker.

Illustration af typisk RTC-modul DS1307:

De fleste af RTC-modulerne leveres med batteri (CR2032) på købstidspunktet. Der er forskellige størrelser og modeller, det illustrerede ovenfor er muligvis ikke det samme for dig. Men sørg for, at modelnummeret er DS1307. Koden skrevet i dette indlæg er kun kompatibel med DS1307.

Nu ved du noget om RTC'er. Lad os nu gå videre til det digitale urdesign. Før du fortsætter med dette projekt, skal du downloade biblioteket fra følgende links og installere på din IDE:

• DS1307RTC.h

Link: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Link: github.com/PaulStoffregen/Time

Andre to biblioteker ville være forudinstalleret på Arduino IDE, hvis du har den nyeste version.

• LiquidCrystal.h

• Wire.h

Kredsløbet:

Kredsløbsforbindelsen mellem arduino og LCD-skærm er standard, som vi kan finde lignende forbindelse på andre LCD-baserede projekter. Den eneste ekstra komponent er RTC.

For at reducere ledningsoverbelastning under prototype kan RTC indsættes i de analoge ben direkte på arduinoen. Lod SCl, SDA, Vcc og GND med hanhovedstifter, og indsæt den A2 til A5-stifter som vist i prototypen.

Forfatterens prototype:

Sådan indsættes RTC korrekt på Arduino:

Hvis din RTC har forskellige stiftplaceringer og ikke kunne replikeres som illustreret ovenfor, kan du altid bruge ledninger til forbindelse. Nu er din hardwareopsætning færdig, lad os gå til softwaredelen af ​​projektet.

Sådan indstilles tid:

Når RTC-modulet er programmeret, opretholder det den tid, selvom det fjernes fra arduinoen. Batteriet skal vare mindst et par år.

Der er ingen knap til at justere den tid, det følgende program indstiller tiden i RTC. Tiden synkroniseres automatisk med tidspunktet for din computer, mens du kompilerer koden, så sørg for at din computer er indstillet til korrekt tid, inden du uploader programmerne.
Upload denne “SetTime” -kode for at indstille tiden med RTC tilsluttet:

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

Når denne kode er uploadet, skal du åbne den serielle skærm, og en succesmeddelelse skal dukke op og sige, at tiden er indstillet.

Dette betyder, at din forbindelse mellem RTC og arduino er korrekt, og at tiden er indstillet.

Upload nu følgende kode til visning af tiden i 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-------// 

Når dette er gjort, skal du se tid og dato vises på LCD og kører.

Bemærk: 'SetTime' -koden ændres fra eksempelkode for DS1307RTC for at optimere ledningsforbindelser til RTC-modul, uploade original kode indstiller ikke tid.

Digital vækkeur ved hjælp af Arduino

I dette ovenfor lærte vi, hvordan man bygger det grundlæggende Arduino-ur ved hjælp af RTC-modul, i det følgende afsnit undersøger vi, hvordan dette kan opgraderes til et digitalt alarmurskredsløb ved hjælp af Arduino.

Der er nogle mennesker, der ikke har brug for vækkeur, de vågner naturligt op, og der er nogle mennesker, der vågner op, efter at vækkeuret har ringet nogle gange, og der er nogle mennesker, der trykker på snooze-knappen en række gange og går til deres college / arbejder sent med nogle undskyldninger.

Det foreslåede sjove lille vækkeursprojekt kan konfrontere problemet med dovenskab under morgenvågnen. De fleste vækkeure har en slumringsknap og forudbestemt afskæringstid for alarm, hvis brugeren ikke reagerede.

Vi designede dette vækkeur uden en doven knap (snooze-knap), og alarmen slukkes ikke, før brugeren trykker på en knap.

Dette ur kan vise tid i 12-timers format og dato i DD / MM / ÅÅÅÅ-format.

Tid og dato vises på 16 x 2 LCD-display. Et RTC- eller realtidsur-tidsmodul sørger for at spore tiden og kan bevare den korrekte tid, selv efter en lang strømafbrydelse.

Der er 5 knapper, hvis funktion forklares snart. Hjernen i projektet Arduino kan enhver model efter eget valg, vi vil anbefale Arduino pro mini eller Arduino nano på grund af sin kompakte størrelse.

Lad os nu dykke ned i skemaer.

Ovenstående er skematisk for Arduino at vise forbindelse, justere skærmkontrasten ved at dreje 10K potentiometeret.

Nedenfor er resten af ​​kredsløbet:

Kredsløbet kan tilføres 9V 500mA vægadapter.

Funktioner af 5 knapper:

S1 - Dette bruges til at stoppe alarmen (det er også nulstillet knap).
S2 - Bruges til indstilling af alarm. Ved langt tryk på S2 kommer du til alarmindstillingsmenuen.
S3 - Det bruges til at øge timerne.
S4 - det bruges til at øge minutter.
S5 - Bruges til at skifte alarmstatus. Hvis “*” findes på LCD-display i nederste højre hjørne, er alarmen TIL, hvis “*” ikke findes, er alarmstatistikken OFF.

Flere detaljer om, hvordan du indstiller alarm, forklares nederst i artiklen.

Download bibliotekets filer nedenfor:

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

Nu skal vi indstille tid til RTC-modul, tiden synkroniseres fra din pc til RTC-modul.

Upload nedenstående kode for at indstille tid og åbne seriel skærm:

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

Nu har du med succes indstillet tid til RTC
Dernæst skal du uploade følgende hovedkode:

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

Efter uploaden af ​​ovenstående kode skal du se korrekt tid og dato køre på skærmen.

Lad os nu se, hvordan du indstiller alarm:
• Langt tryk på S2, indtil du kan se alarmmenuen.
• Tryk på S3 og S4 for at justere henholdsvis timer og minutter.
• Efter det ønskede indstillede tidsrum skal du trykke på S2 igen. Der vil stå 'Alarmen er indstillet til xx: xx timer'.
• Hvis alarmen er TIL, kan du se “*” symbolet på displayet, hvis alarmen er FRA, vil der ikke være noget “*” symbol.
• Du kan tænde / slukke for alarmen ved at trykke på S5 i et halvt sekund. Tryk ikke længe, ​​indtil '*' forsvinder (det kommer tilbage igen), tryk blot et halvt sekund langt for at skifte alarmstatus.

VIGTIG NOTE:

Den mest almindelige fejl ved indstilling af en alarm på et hvilket som helst ur er utilsigtet at skifte AM / PM, hvilket resulterer i, at alarmen ikke ringer på vores ønske.

For at imødegå dette problem er den foreslåede alarmindstilling designet til 24-timers format.

Tiden, der vises på LCD'et, er 12 timer med AM / PM-format, men når du indstiller en alarm med dette projekt, skal du indstille i 24-timersformat fra 0 til 23 timer.

For eksempel: hvis du vil indstille alarm kl. 21:00, skal du indstille 21 timer og 0 minutter. I 5 AM: 5 timer og 0 minutter og så videre.

Forfatterens prototype:

Kan du lide dette projekt? Har du spørgsmål vedrørende dette projekt, er du velkommen til at udtrykke det i kommentaren, du kan få et hurtigt svar.

Videoklip:




Forrige: Beacon Level Indicator Circuit for Combine Harvester Grain Tanks Næste: 3 High Power SG3525 Pure Sinewave Inverter Circuits