Arduino digital klokke ved bruk av RTC-modul

Prøv Instrumentet Vårt For Å Eliminere Problemer





I dette innlegget skal vi konstruere en digital klokke ved hjelp av RTC eller Real Time Clock-modulen. Vi vil forstå hva “RTC” -modulen er, hvordan man kan grensesnitt med Arduino og hva den gjør.

Av:



RTC-modul er en krets som holder nøye oversikt over gjeldende tid. Den har to funksjoner, den kommuniserer med mikrokontrollere og mikroprosessorer for å gi nåværende tid og fungere som reservekrets for å opprettholde tid i tilfelle strømbrudd, siden den har innebygd batteribackup-system.

Vi kan finne RTC i alle elektroniske enheter der tid er en viktig funksjon av gadgeten.



For eksempel holder datamaskinen eller den bærbare datamaskinen sin tid selv etter at strømmen er koblet til eller batteriet er fjernet. På hovedkortet til hvilken som helst datamaskin kan vi finne et CMOS-batteri som driver RTC-kretsen.

Lignende kretsløp vi skal bruke i dette prosjektet.

RTC-modulen er en billig enhet som finnes på alle e-handelsnettsteder og lokale elektroniske prosjektbutikker.

Illustrasjon av typisk RTC-modul DS1307:

De fleste av RTC-modulene leveres med batteri (CR2032) på kjøpstidspunktet. Det er forskjellige størrelser og modeller. Illustrasjonen ovenfor er kanskje ikke den samme for deg. Men sørg for at modellnummeret er DS1307. Koden skrevet i dette innlegget er bare kompatibel med DS1307.

Nå vet du noe om RTC. La oss nå gå videre til den digitale klokkeutformingen. Før du fortsetter med dette prosjektet, må du laste ned biblioteket fra følgende lenker og installere på IDE:

• DS1307RTC.h

Lenke: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Lenke: github.com/PaulStoffregen/Time

Andre to biblioteker ville vært forhåndsinstallert på Arduino IDE, hvis du har den nyeste versjonen.

• LiquidCrystal.h

• Wire.h

Kretsen:

Kretsforbindelsen mellom arduino og LCD-skjerm er standard, som vi kan finne lignende tilkobling på andre LCD-baserte prosjekter. Den eneste tilleggskomponenten er RTC.

For å redusere ledningsbelastning under prototypen, kan RTC settes inn i de analoge pinnene direkte på arduinoen. Lodd SCl, SDA, Vcc og GND med mannlige toppstifter, og sett den inn i A2 til A5-stifter som vist i prototypen.

Forfatterens prototype:

Slik setter du riktig inn RTC på Arduino:

Hvis RTC-en din har forskjellige plasseringer og ikke kunne replikere som illustrert ovenfor, kan du alltid bruke ledninger for tilkobling. Nå er maskinvareoppsettet ditt fullført, la oss gå til programvaredelen av prosjektet.

Hvordan stille inn tid:

Når RTC-modulen er programmert, opprettholder den tiden selv den fjernes fra arduinoen. Batteriet skal vare i minst et par år.

Det er ingen knapp for å justere tiden følgende program vil stille inn tiden i RTC. Tiden synkroniseres automatisk med datamaskinens tid mens du kompilerer koden, så sørg for at datamaskinen er satt til riktig tid før du laster opp programmene.
Last opp denne 'SetTime' -koden for å stille inn tiden med RTC koblet til:

#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 koden er lastet opp, åpner du den serielle skjermen, og det skal dukke opp en suksessmelding om at tiden er satt.

Dette betyr at forbindelsen din mellom RTC og arduino er riktig og at tiden er satt.

Last nå opp følgende kode for å vise 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, bør du se klokkeslett og dato vises på LCD-skjermen og går.

Merk: 'SetTime' -koden er modifisert fra eksempelkoden til DS1307RTC for å optimalisere ledningstilkoblinger for RTC-modulen. Opplasting av original kode vil ikke angi tid.

Digital vekkerklokke ved hjelp av Arduino

I dette ovenfor lærte vi hvordan du bygger den grunnleggende Arduino-klokken ved hjelp av RTC-modulen, i det følgende avsnittet undersøker vi hvordan dette kan oppgraderes til en digital vekkerklokke med Arduino.

Det er noen mennesker som ikke trenger noen vekkerklokke, de våkner naturlig og det er noen som våkner etter at vekkerklokken har ringt noen ganger, og det er noen som trykker på snooze-knappen en rekke ganger og går på college / jobber sent med noen unnskyldninger.

Det foreslåtte morsomme lille vekkerprosjektet kan konfrontere problemet med latskap om morgenen. De fleste alarmklokker har en slumringsknapp og forhåndsbestemt avskjæringstid for alarm hvis brukeren ikke svarte.

Vi designet denne vekkerklokken uten en lat knapp (snooze-knapp), og alarmen slås ikke av før brukeren trykker på en knapp.

Denne klokken kan vise tid i 12-timers format og dato i DD / MM / ÅÅÅÅ-format.

Tid og dato vises på 16 x 2 LCD-skjerm. En RTC- eller sanntidsklokkemodul vil ta seg av å spore tiden og kan beholde riktig tid selv etter et langt strømbrudd.

Det er fem knapper som får beskjed om funksjonen. Hjernen til prosjektet Arduino kan hvilken som helst modell du ønsker, vi vil anbefale Arduino pro mini eller Arduino nano på grunn av sin kompakte størrelse.

La oss nå dykke ned i skjemaer.

Ovenstående er skjematisk for Arduino å vise tilkobling, juster skjermkontrasten ved å rotere 10K potensiometeret.

Nedenfor er resten av kretsen:

Kretsen kan drives av 9V 500mA veggadapter.

Funksjoner til 5 knapper:

S1 - Dette brukes til å stoppe alarmen (den er også reset-knapp).
S2 - brukes til å stille inn alarm. Ved å trykke lenge på S2 kommer du til alarminnstillingsmenyen.
S3 - Den brukes til å øke antall timer.
S4 - den brukes til å øke minutter.
S5 - brukes til å veksle alarmstatus. Hvis '*' finnes på LCD-skjermen i nederste høyre hjørne, er alarmen PÅ. Hvis '*' ikke eksisterer, er alarmstatistikken AV.

Mer detaljer om hvordan du stiller alarm er forklart nederst i artikkelen.

Last ned bibliotekfilene nedenfor:

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

Nå må vi stille tid til RTC-modulen, tiden blir synkronisert fra din PC til RTC-modulen.

Last opp koden nedenfor for å stille inn tid og åpne seriell skjerm:

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

Nå har du vellykket satt tid til RTC
Deretter må du laste opp 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-------// 

Etter at du har lastet opp koden ovenfor, må du se riktig tid og dato på skjermen.

La oss nå se hvordan du setter alarm:
• Trykk lenge på S2 til du kan se Alarm-menyen.
• Trykk på S3 og S4 for å justere henholdsvis timer og minutter.
• Etter ønsket tidsinnstilling, trykk S2 en gang til. Det vil si 'Alarmen er satt til xx: xx timer'.
• Hvis alarmen er PÅ, kan du se “*” -symbolet på skjermen. Hvis alarmen er AV, vil det ikke være noe “*” -symbol.
• Du kan slå på / av alarmen ved å trykke S5 i et halvt sekund. Ikke trykk lenge til “*” forsvinner (det kommer tilbake igjen), bare trykk et halvt sekund langt for å slå alarmstatus.

VIKTIG NOTAT:

Den vanligste feilen når du stiller en alarm på en hvilken som helst klokke, er utilsiktet å veksle mellom AM / PM, noe som resulterer i at alarmen ikke ringer når vi ønsker det.

For å motvirke dette problemet er den foreslåtte innstillingen for vekkerklokke designet på 24-timers klokkeformat.

Tiden som vises på LCD-skjermen vil være 12 timer med AM / PM-format, men når du setter en alarm med dette prosjektet, må du stille det i 24-timersformat fra 0 til 23 timer.

For eksempel: hvis du vil stille alarm klokken 21.00, må du stille 21 timer og 0 minutter. I 5 AM: 5 timer og 0 minutter og så videre.

Forfatterens prototype:

Liker du dette prosjektet? Har du spørsmål angående dette prosjektet, uttrykk gjerne i kommentaren, du kan få et raskt svar.

Videoklipp:




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