Arduino digitalni sat pomoću RTC modula

Isprobajte Naš Instrument Za Uklanjanje Problema





U ovom ćemo postu konstruirati digitalni sat pomoću RTC ili modula sata u stvarnom vremenu. Razumjet ćemo što je 'RTC' modul, kako se povezati s Arduinom i što on radi.

Po:



RTC modul je sklop koji precizno prati trenutno vrijeme. Obavlja dvije funkcije, komunicira s mikrokontrolerima i mikroprocesorima dajući trenutno vrijeme i djelujući kao sigurnosni krug za održavanje vremena u slučaju nestanka struje, budući da ima ugrađeni sustav za rezervnu bateriju.

RTC možemo pronaći u bilo kojim elektroničkim uređajima u kojima je vrijeme važna funkcija uređaja.



Na primjer, naše računalo ili prijenosno računalo održava svoje vrijeme čak i nakon isključivanja napajanja ili uklanjanja baterije. Na matičnoj ploči bilo kojeg računala možemo pronaći CMOS bateriju koja napaja RTC krug.

Sličnu vrstu sklopa koristit ćemo u ovom projektu.

RTC modul je jeftin uređaj koji se može naći na bilo kojoj web lokaciji e-trgovine i vašim lokalnim trgovinama elektroničkim projektima.

Ilustracija tipičnog RTC modula DS1307:

Većina RTC modula dolazi s baterijom (CR2032) u trenutku kupnje. Postoje različite veličine i modeli, gore ilustrirano možda nije isto za vas. No, pripazite da je broj modela DS1307. Kôd napisan u ovom postu kompatibilan je samo s DS1307.

Sada znate nešto o RTC-ima. Krenimo sada na dizajn digitalnog sata. Prije nastavka ovog projekta morate preuzeti knjižnicu sa sljedećih poveznica i instalirati na svoj IDE:

• DS1307RTC.h

Veza: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Link: github.com/PaulStoffregen/Time

Druge dvije knjižnice bile bi unaprijed instalirane na Arduino IDE, ako imate najnoviju verziju.

• LiquidCrystal.h

• Žica.h

Krug:

Kružna veza između arduina i LCD zaslona standardna je, a sličnu vezu možemo pronaći i na drugim LCD projektima. Jedina dodatna komponenta je RTC.

Da bi se smanjilo zagušenje žice tijekom prototipa, RTC se može umetnuti u analogne pinove izravno na arduino. Zalemite SCl, SDA, Vcc i GND muškim zaglavljem i umetnite ih A2 do A5, kako je prikazano u prototipu.

Autorski prototip:

Kako pravilno umetnuti RTC na Arduino:

Ako vaš RTC ima različita mjesta pinova i ne može se replicirati kao što je gore prikazano, uvijek možete koristiti žice za povezivanje. Sad je vaše postavljanje hardvera završeno, prijeđimo na softverski dio projekta.

Kako postaviti vrijeme:

Jednom kada je RTC modul programiran, zadržava vrijeme čak i kada je uklonjen iz arduina. Baterija bi trebala trajati najmanje nekoliko godina.

Nema gumba za podešavanje vremena koje će sljedeći program postaviti u RTC-u. Vrijeme se automatski usklađuje s vremenom vašeg računala, dok sastavlja kôd, zato prije postavljanja programa provjerite je li vaše računalo postavljeno na točno vrijeme.
Prenesite ovaj “SetTime” kod da biste postavili vrijeme s uključenim RTC-om:

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

Nakon što se ovaj kôd prenese, otvorite serijski monitor i trebala bi se pojaviti poruka o uspjehu s porukom da je vrijeme postavljeno.

To znači da je vaša veza između RTC-a i arduina točna i da je vrijeme postavljeno.

Sada prenesite sljedeći kod za prikaz vremena na LCD-u.

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

Nakon što to učinite, trebali biste vidjeti kako se vrijeme i datum prikazuju na LCD-u i rade.

Bilješka: Kôd 'SetTime' izmijenjen je iz primjera koda DS1307RTC kako bi se optimizirale žičane veze za RTC modul, prijenos originalnog koda neće postaviti vrijeme.

Digitalni budilnik koji koristi Arduino

U ovome smo gore naučili kako izraditi osnovni Arduino sat pomoću RTC modula, u sljedećem dijelu istražujemo kako se to može nadograditi u krug digitalne budilice pomoću Arduina.

Neki ljudi trebaju budilicu, probude se prirodno, a neki se probude nakon što nekoliko puta zazvoni budilica, a neki ljudi gomilu puta pritisnu tipku za odgodu i kasno odu na fakultet / posao neki izgovori.

Predloženi zabavni projekt male budilice može se suočiti s problemom lijenosti tijekom jutarnjeg buđenja. Većina budilnika ima gumb za odgodu i unaprijed određeno vrijeme isključenja alarma ako korisnik ne odgovori.

Dizajnirali smo ovu budilicu bez lijenog gumba (gumb za odgodu) i alarm se neće isključiti dok korisnik ne pritisne gumb.

Ovaj sat može prikazivati ​​vrijeme u 12-satnom formatu i datum u formatu DD / MM / GGGG.

Vrijeme i datum bit će prikazani na LCD zaslonu 16 x 2. RTC ili sat vremena u stvarnom vremenu pobrinut će se za praćenje vremena i može zadržati točno vrijeme čak i nakon dugog prekida napajanja.

Dostupno je 5 gumba čija će funkcija uskoro biti objašnjena. Mozak projekta Arduino može bilo koji model po vašem izboru, mi bismo preporučili Arduino pro mini ili Arduino nano zbog njegove kompaktne veličine.

Sada zaronimo u sheme.

Iznad je shematski prikaz da Arduino prikazuje vezu, prilagodite kontrast zaslona okretanjem 10K potenciometra.

Dolje je ostatak sklopa:

Krug se može napajati 9V 500mA zidnim adapterom.

Funkcije 5 gumba:

S1 - Koristi se za zaustavljanje alarma (ujedno je i gumb za resetiranje).
S2 - Koristi se za postavljanje alarma. Dugim pritiskom na S2 doći ćete do izbornika za podešavanje alarma.
S3 - Koristi se za povećanje sati.
S4 - koristi se za povećanje minuta.
S5 - Koristi se za prebacivanje statusa alarma. Ako na LCD zaslonu u donjem desnom uglu donjeg kuta postoji '*', alarm je UKLJUČEN, ako '*' ne postoji, statistika alarma je ISKLJUČENA.

Više detalja o postavljanju alarma objašnjeno je na dnu članka.

Preuzmite datoteke knjižnice u nastavku:

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

Sada moramo postaviti vrijeme na RTC modul, vrijeme će se sinkronizirati s vašeg računala na RTC modul.

Prenesite donji kod da biste postavili vrijeme i otvorili 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 } //----------------------------------------// 

Sada ste uspješno postavili vrijeme na RTC
Dalje, trebate prenijeti sljedeći glavni kôd:

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

Nakon prijenosa gornjeg koda na zaslonu morate vidjeti točno vrijeme i datum.

Sada da vidimo kako postaviti alarm:
• Dugo pritisnite S2 dok ne vidite izbornik Alarm.
• Pritisnite S3 i S4 za podešavanje sati i minuta.
• Nakon željenog vremena još jednom pritisnite S2. Reći će 'Alarm je postavljen na xx: xx sati'.
• Ako je alarm UKLJUČEN, na zaslonu možete vidjeti simbol '*', ako je alarm ISKLJUČEN, simbol '*' neće biti.
• Alarm možete uključiti / isključiti pritiskom na S5 pola sekunde. Nemojte dugo pritiskati dok '*' ne nestane (vraća se ponovno), samo pritisnite pola sekunde da biste promijenili status alarma.

VAŽNA NOTA:

Najčešća pogreška prilikom postavljanja alarma na bilo kojem satu je nenamjerno prebacivanje AM / PM, što rezultira time da alarm ne zazvoni u vrijeme kada želimo.

Da bi se suprotstavio ovom problemu, predložena postavka budilice dizajnirana je u 24-satnom formatu sata.

Vrijeme prikazano na LCD-u bit će 12 sati s AM / PM formatom, ali, kada postavite alarm s ovim projektom, morate postaviti u 24-satni format od 0 do 23 sata.

Na primjer: ako želite postaviti alarm u 21:00, morate postaviti 21 sat i 0 minuta. U pet sati ujutro: 5 sati i 0 minuta i tako dalje.

Autorski prototip:

Sviđa li vam se ovaj projekt? Imate li pitanja u vezi s ovim projektom, slobodno izrazite u komentaru, možda ćete dobiti brzi odgovor.

Video isječak:




Prethodno: Sklop indikatora razine svjetionika za spremnike za zrno kombajna Dalje: 3 kruga pretvarača s čistim sinusnim valovima velike snage SG3525