Digitalna ura Arduino z uporabo modula RTC

Preizkusite Naš Instrument Za Odpravo Težav





V tem prispevku bomo izdelali digitalno uro z uporabo modula RTC ali ure realnega časa. Razumeli bomo, kaj je modul 'RTC', kako se povežemo z Arduinom in kaj počne.

Avtor:



RTC modul je vezje, ki natančno beleži trenutni čas. Opravlja dve funkciji, komunicira z mikrokrmilniki in mikroprocesorji, da daje trenutni čas in deluje kot rezervno vezje za vzdrževanje časa v primeru izpada električne energije, saj ima vgrajen sistem za rezervno baterijo.

RTC lahko najdemo v vseh elektronskih napravah, kjer je čas pomembna funkcija pripomočka.



Na primer, naš računalnik ali prenosnik ohranja čas tudi po izklopu napajanja ali odstranitvi baterije. Na matični plošči katerega koli računalnika najdemo baterijo CMOS, ki napaja vezje RTC.

Podobno vrsto vezja bomo uporabili v tem projektu.

RTC modul je poceni naprava, ki jo lahko najdete na vseh spletnih mestih e-trgovine in v vaših lokalnih trgovinah z elektronskimi projekti.

Prikaz tipičnega RTC modula DS1307:

Večina modulov RTC ima ob nakupu baterijo (CR2032). Obstajajo različne velikosti in modeli, zgornje ilustrirano morda ni enako za vas. Vendar se prepričajte, da je številka modela DS1307. Koda, napisana v tej objavi, je združljiva samo z DS1307.

Zdaj veste nekaj o RTC-jih. Zdaj pa pojdimo na zasnovo digitalne ure. Preden nadaljujete s tem projektom, morate knjižnico prenesti s teh povezav in jo namestiti v svoj IDE:

• DS1307RTC.h

Povezava: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Povezava: github.com/PaulStoffregen/Time

Drugi dve knjižnici bi bili vnaprej nameščeni v Arduino IDE, če uporabljate najnovejšo različico.

• LiquidCrystal.h

• Wire.h

Vezje:

Povezava vezja med arduino in LCD zaslonom je standardna, kar lahko najdemo v drugih projektih, ki temeljijo na LCD. Edina dodatna komponenta je RTC.

Da bi med prototipom zmanjšali preobremenjenost žice, lahko RTC vstavite na analogne nožice neposredno na arduino. Spajte SCl, SDA, Vcc in GND z moškimi zatiči glave in jih vstavite od A2 do A5, kot je prikazano v prototipu.

Avtorjev prototip:

Kako pravilno vstaviti RTC v Arduino:

Če ima vaš RTC različna mesta zatičev in se ne more ponoviti, kot je prikazano zgoraj, lahko za povezavo vedno uporabite žice. Zdaj je nastavitev strojne opreme končana, pojdimo na programski del projekta.

Kako nastaviti čas:

Ko je modul RTC programiran, ohrani čas, tudi ko je odstranjen iz arduina. Baterija bi morala zdržati vsaj nekaj let.

Ni gumba za nastavitev časa, ko bo naslednji program določil čas v RTC. Čas se med sestavljanjem kode samodejno sinhronizira s časom računalnika, zato pred nalaganjem programov preverite, ali je računalnik nastavljen na pravi čas.
Naložite to kodo “SetTime”, da nastavite čas z vključenim RTC:

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

Ko je ta koda naložena, odprite serijski monitor in pojavilo se bo sporočilo o uspehu z nastavljenim časom.

To pomeni, da je vaša povezava med RTC in arduino pravilna in čas nastavljen.

Zdaj naložite naslednjo kodo za prikaz ure na LCD-prikazovalniku.

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

Ko je to končano, boste videli, da se na LCD-prikazovalniku prikazujeta ura in datum.

Opomba: Koda “SetTime” je spremenjena iz primera kode DS1307RTC, da optimizira žične povezave za modul RTC, nalaganje izvirne kode ne bo določilo časa.

Digitalna budilka z uporabo Arduina

V tem zgoraj smo se naučili, kako zgraditi osnovno uro Arduino z uporabo modula RTC, v naslednjem poglavju pa preučujemo, kako jo lahko nadgradimo v vezje digitalne budilke z uporabo Arduina.

Nekateri ljudje ne potrebujejo budilke, zbudijo se naravno, nekateri pa se zbudijo, ko budilka zazvoni nekajkrat, nekateri pa velikokrat pritisnejo gumb za dremež in odidejo na kolidž / delo pozno z nekaj izgovorov.

Predlagani projekt male budilke se lahko sooči s težavo z lenobo med jutranjo budnostjo. Večina budilk ima gumb za dremež in vnaprej določen čas za izklop alarma, če se uporabnik ne odzove.

To budilko smo zasnovali brez leni gumba (gumb za dremež) in alarm se ne bo izklopil, dokler uporabnik ne pritisne gumba.

Ta ura lahko prikazuje čas v 12-urni obliki in datum v obliki DD / MM / LLLL.

Ura in datum bosta prikazana na 16 x 2 LCD zaslonu. RTC ali časovni modul realnega časa bo poskrbel za sledenje času in lahko ohrani pravilen čas tudi po daljšem izpadu električne energije.

Na voljo je 5 gumbov, katere funkcije bodo v kratkem razložene. Možgani projekta Arduino so lahko kateri koli model po vaši izbiri, zaradi kompaktne velikosti priporočamo Arduino pro mini ali Arduino nano.

Zdaj pa se poglobimo v sheme.

Zgoraj je shematično, da Arduino prikaže povezavo, prilagodi kontrast zaslona tako, da zasuče 10K potenciometer.

Spodaj je preostali del vezja:

Vezje lahko napaja 9V 500mA stenski adapter.

Funkcije 5 gumbov:

S1 - Uporablja se za zaustavitev alarma (to je tudi gumb za ponastavitev).
S2 - Uporablja se za nastavitev alarma. Z dolgim ​​pritiskom na S2 pridete do menija za nastavitev alarma.
S3 - Uporablja se za povečanje ur.
S4 - uporablja se za povečanje minut.
S5 - Uporablja se za preklop stanja alarma. Če na LCD zaslonu v desnem spodnjem kotu obstaja '*', je alarm vklopljen, če '*' ne obstaja, je statistika alarma izklopljena.

Podrobnejše informacije o nastavitvi alarma so razložene na dnu članka.

Prenesite spodnje datoteke knjižnice:

Povezava1: github.com/PaulStoffregen/DS1307RTC
Povezava2: github.com/PaulStoffregen/Time

Zdaj moramo nastaviti čas za modul RTC, čas bo sinhroniziran od vašega osebnega računalnika do modula RTC.

Naložite spodnjo kodo, da nastavite čas in odprete serijski monitor:

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

Zdaj ste uspešno nastavili čas na RTC
Nato morate naložiti naslednjo glavno kodo:

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

Po nalaganju zgornje kode morate na zaslonu videti pravilni čas in datum.

Zdaj pa poglejmo, kako nastaviti alarm:
• Dolgo pritiskajte S2, dokler ne vidite menija Alarm.
• Pritisnite S3 in S4, da prilagodite ure in minute.
• Po nastavljenem želenem času še enkrat pritisnite S2. Na zaslonu bo pisalo 'Alarm je nastavljen na xx: xx ur'.
• Če je alarm vklopljen, lahko na zaslonu vidite simbol »*«, če je alarm izklopljen, simbola »*« ne bo.
• Alarm lahko vklopite / izklopite s pritiskom na S5 za pol sekunde. Ne pritiskajte dolgo, dokler »*« ne izgine (spet se vrne), samo pritisnite pol sekunde, da preklopite stanje alarma.

POMEMBNO:

Najpogostejša napaka pri nastavitvi alarma na kateri koli uri je nenamerno preklapljanje AM / PM, kar povzroči, da alarm ne zazvoni ob našem času.

Za odpravljanje te težave je predlagana nastavitev budilke zasnovana na 24-urni obliki ure.

Čas, prikazan na LCD-prikazovalniku, bo 12-urni z AM / PM formatom, toda ko s tem projektom nastavite alarm, morate v 24-urnem formatu nastaviti od 0 do 23 ur.

Na primer: če želite nastaviti alarm ob 21:00, morate nastaviti 21 ur in 0 minut. Za 5. uro zjutraj: 5 ur in 0 minut itd.

Avtorjev prototip:

Vam je ta projekt všeč? Če imate kakršno koli vprašanje v zvezi s tem projektom, vas prosimo, da ga izrazite v komentarju, lahko prejmete hiter odgovor.

Video posnetek:




Prejšnja: Vezje indikatorja ravni svetilnika za rezervoarje za žito kombajna Naprej: 3 močna pretvorniška vezja SG3525 iz čistega sinusnega vala