Ceas digital Arduino folosind modulul RTC

Încercați Instrumentul Nostru Pentru Eliminarea Problemelor





În acest post vom construi un ceas digital folosind modulul RTC sau Ceas în timp real. Vom înțelege ce este modulul „RTC”, cum să interacționăm cu Arduino și ce face.

De:



Modulul RTC este un circuit, care ține evidența cu precizie a timpului curent. Are două funcții, comunică cu microcontrolere și microprocesoare pentru a da timpul curent și a acționa ca circuit de rezervă pentru menținerea timpului în caz de întrerupere a alimentării, deoarece are un sistem de rezervă al bateriei încorporat.

Putem găsi RTC în orice dispozitiv electronic în care timpul este o funcție importantă a gadgetului.



De exemplu, computerul sau laptopul nostru își menține timpul chiar și după ce alimentarea este oprită sau bateria este scoasă. Pe placa de bază a oricărui computer putem găsi o baterie CMOS, care alimentează circuitul RTC.

Un fel similar de circuit pe care îl vom folosi în acest proiect.

Modulul RTC este un dispozitiv ieftin care poate fi găsit pe orice site-uri de comerț electronic și magazinele dvs. locale de proiecte electronice.

Ilustrație a modulului RTC tipic DS1307:

Majoritatea modulelor RTC vin cu baterie (CR2032) în momentul cumpărării. Există diferite dimensiuni și modele, este posibil ca cele ilustrate mai sus să nu fie la fel pentru dvs. Dar asigurați-vă că numărul modelului este DS1307. Codul scris în această postare este compatibil numai cu DS1307.

Acum știi ceva despre RTC-uri. Acum să trecem la designul ceasului digital. Înainte de a continua cu acest proiect, trebuie să descărcați biblioteca din următoarele linkuri și să o instalați pe IDE:

• DS1307RTC.h

Link: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Link: github.com/PaulStoffregen/Time

Alte două biblioteci ar fi fost preinstalate pe Arduino IDE, dacă aveți cea mai recentă versiune.

• LiquidCrystal.h

• Sârmă.h

Circuitul:

Conexiunea de circuit între arduino și afișajul LCD este standard, pe care o putem găsi conexiune similară și în alte proiecte bazate pe LCD. Singura componentă suplimentară este RTC.

Pentru a reduce congestia firelor în timpul prototipului, RTC poate fi introdus pe pinii analogici direct ai arduino-ului. Lipiți SCl, SDA, Vcc și GND cu știfturi masculine și introduceți-le de la A2 la A5, așa cum se arată în prototip.

Prototipul autorului:

Cum se introduce corect RTC pe Arduino:

Dacă RTC-ul dvs. are locații de pin diferite și nu s-a putut reproduce așa cum este ilustrat mai sus, puteți utiliza întotdeauna fire pentru conectare. Acum configurarea hardware-ului dvs. este completă, să trecem la partea software a proiectului.

Cum să setați ora:

Odată ce modulul RTC este programat, acesta menține timpul chiar și atunci când este scos din arduino. Bateria ar trebui să dureze cel puțin câțiva ani.

Nu există nici un buton pentru a regla ora următorul program va seta ora în RTC. Ora sincronizată automat cu ora computerului dvs., în timp ce compilați codul, deci asigurați-vă că computerul este setat să corecteze ora, înainte de a încărca programele.
Încărcați acest cod „SetTime” pentru a seta ora cu RTC conectat:

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

Odată ce acest cod este încărcat, deschideți monitorul serial și ar trebui să apară un mesaj de succes care să spună că ora a fost setată.

Acest lucru înseamnă că conexiunea dvs. între RTC și arduino este corectă și că timpul este setat.

Acum încărcați următorul cod pentru afișarea orei pe 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-------// 

Odată ce ați făcut acest lucru, ar trebui să vedeți ora și data sunt afișate pe ecranul LCD și rulează.

Notă: Codul „SetTime” este modificat din exemplul de cod al DS1307RTC pentru a optimiza conexiunile prin cablu pentru modulul RTC, încărcarea codului original nu va seta timpul.

Ceas cu alarmă digitală folosind Arduino

În cele de mai sus am învățat cum să construim ceasul de bază Arduino folosind modulul RTC, în secțiunea următoare investigăm modul în care acesta poate fi actualizat într-un circuit de ceas cu alarmă digital folosind Arduino.

Există unii oameni care nu au nevoie de ceas cu alarmă, se trezesc în mod natural și sunt unii oameni care se trezesc după ce ceasul cu alarmă sună de câteva ori și există unii oameni care apasă butonul de amânare de o grămadă de ori și merg la facultate / lucrează târziu unele scuze.

Proiectul de distracție cu ceas cu alarmă propus poate confrunta problema cu lenea în timpul trezirii de dimineață. Majoritatea ceasurilor cu alarmă au un buton de amânare și un timp de limită prestabilit pentru alarmă dacă utilizatorul nu a răspuns.

Am proiectat acest ceas cu alarmă fără buton leneș (buton de amânare), iar alarma nu se va opri până când utilizatorul nu apasă un buton.

Acest ceas poate afișa ora în format de 12 ore și data în format ZZ / LL / AAAA.

Ora și data vor fi prezentate pe un ecran LCD de 16 x 2. Un modul RTC sau modul de ceas în timp real se va ocupa de urmărirea orei și poate păstra ora corectă chiar și după o lungă întrerupere a curentului.

Există 5 butoane cu condiția că funcția va fi explicată în scurt timp. Creierul proiectului Arduino poate orice model la alegere, vă recomandăm Arduino pro mini sau Arduino nano datorită dimensiunii sale compacte.

Acum să ne scufundăm în scheme.

Mai sus este schematică pentru ca Arduino să afișeze conexiunea, reglați contrastul afișajului rotind potențiometrul de 10K.

Mai jos este restul circuitului:

Circuitul poate fi alimentat cu adaptor de perete de 9V 500mA.

Funcțiile a 5 butoane:

S1 - Acesta este utilizat pentru oprirea alarmei (este și butonul de resetare).
S2 - Este utilizat pentru setarea alarmei. Apăsând lung S2 veți ajunge la meniul de setare a alarmelor.
S3 - Este folosit pentru a crește orele.
S4 - este folosit pentru a crește minutele.
S5 - Este utilizat pentru comutarea stării alarmei. Dacă „*” există pe afișajul LCD din colțul din dreapta jos alarma este PORNITĂ, dacă „*” nu există, statisticile alarmei sunt OPRITE.

Mai multe detalii despre modul de setare a alarmei sunt explicate în partea de jos a articolului.

Descărcați fișierele bibliotecii de mai jos:

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

Acum, trebuie să setăm ora la modulul RTC, ora va fi sincronizată de la PC la modulul RTC.

Încărcați codul de mai jos pentru a seta ora și deschideți monitorul serial:

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

Acum ați setat cu succes timpul la RTC
Apoi, trebuie să încărcați următorul cod principal:

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

După încărcarea codului de mai sus, trebuie să vedeți ora și data corecte care rulează pe afișaj.

Acum să vedem cum să setați alarma:
• Apăsați lung S2 până când puteți vedea meniul Alarmă.
• Apăsați S3 și S4 pentru a regla orele și respectiv minutele.
• După setarea timpului dorit, apăsați din nou S2. Se va spune „Alarma este setată pentru xx: xx ore”.
• Dacă alarma este PORNITĂ, puteți vedea simbolul „*” pe afișaj, dacă alarma este OPRITĂ, nu va exista simbolul „*”.
• Puteți activa / dezactiva alarma apăsând S5 timp de o jumătate de secundă. Nu apăsați lung până când „*” dispare (se întoarce din nou), doar apăsați o jumătate de secundă pentru a comuta starea alarmei.

NOTĂ IMPORTANTĂ:

Cea mai frecventă greșeală în timp ce setați o alarmă pe orice ceas este comutarea neintenționată a AM / PM, ceea ce duce la a nu suna alarma la momentul dorit.

Pentru a contracara această problemă, setarea propusă pentru ceasul cu alarmă este concepută în format de ceas de 24 de ore.

Ora afișată pe ecranul LCD va fi de 12 ore cu formatul AM / PM, dar, când setați o alarmă cu acest proiect, trebuie să setați în formatul de 24 de ore de la 0 la 23 de ore.

De exemplu: dacă doriți să setați alarma la 21:00 trebuie să setați 21 de ore și 0 minute. Pentru, 5 AM: 5 ore și 0 minute și așa mai departe.

Prototipul autorului:

Îți place acest proiect? Aveți orice întrebare cu privire la acest proiect, nu ezitați să exprimați în comentariu, este posibil să primiți un răspuns rapid.

Clip video:




Precedent: Circuitul indicatorului de nivel al balizei pentru rezervoarele de cereale combinate Următorul: 3 circuite invertoare de înaltă putere SG3525 de mare putere