Arduino digitālais pulkstenis, izmantojot RTC moduli

Izmēģiniet Mūsu Instrumentu Problēmu Novēršanai





Šajā amatā mēs izveidosim digitālo pulksteni, izmantojot RTC vai Real Time Clock moduli. Mēs sapratīsim, kas ir “RTC” modulis, kā sazināties ar Arduino un ko tas dara.

Autors:



RTC modulis ir ķēde, kas precīzi seko līdzi pašreizējam laikam. Tas veic divas funkcijas, tas sazinās ar mikrokontrolleriem un mikroprocesoriem, lai dotu pašreizējo laiku un darbotos kā rezerves ķēde, lai uzturētu laiku strāvas padeves pārtraukuma gadījumā, jo tam ir iebūvēta akumulatora rezerves sistēma.

RTC mēs varam atrast visās elektroniskajās ierīcēs, kur laiks ir svarīga sīkrīka funkcija.



Piemēram, mūsu dators vai klēpjdators saglabā savu laiku arī pēc strāvas padeves pārtraukšanas vai akumulatora noņemšanas. Jebkura datora mātesplatē mēs varam atrast CMOS akumulatoru, kas darbina RTC ķēdi.

Līdzīga veida shēma, kuru izmantosim šajā projektā.

RTC modulis ir lēta ierīce, kuru var atrast visās e-komercijas vietnēs un vietējos elektronisko projektu veikalos.

Tipiskā RTC moduļa DS1307 ilustrācija:

Lielākā daļa RTC moduļu iegādes brīdī ir aprīkoti ar akumulatoru (CR2032). Ir dažādi izmēri un modeļi, iepriekš attēlotie var jums nebūt vienādi. Bet pārliecinieties, ka modeļa numurs ir DS1307. Šajā ierakstā ierakstītais kods ir saderīgs tikai ar DS1307.

Tagad jūs zināt kaut ko par RTC. Tagad pārejam pie digitālā pulksteņa dizaina. Pirms turpināt šo projektu, jums ir jāielādē bibliotēka no šīm saitēm un jāinstalē IDE:

• DS1307RTC.h

Saite: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Saite: github.com/PaulStoffregen/Time

Pārējās divas bibliotēkas būtu iepriekš instalētas Arduino IDE, ja izmantojat jaunāko versiju.

• LiquidCrystal.h

• Vads.h

Ķēde:

Ķēdes savienojums starp arduino un LCD displeju ir standarts, ko mēs varam atrast līdzīgu savienojumu arī citos LCD balstītos projektos. Vienīgais papildu komponents ir RTC.

Lai samazinātu stiepļu sastrēgumus prototipa laikā, RTC var ievietot tieši arduino analogajās tapās. Lodējiet SCl, SDA, Vcc un GND ar vīriešu galvenes tapām un ievietojiet to no A2 līdz A5 tapām, kā parādīts prototipā.

Autora prototips:

Kā pareizi ievietot RTC vietnē Arduino:

Ja jūsu RTC ir dažādas tapu atrašanās vietas un to nevar atkārtot, kā parādīts iepriekš, savienošanai vienmēr varat izmantot vadus. Tagad aparatūras iestatīšana ir pabeigta. Pārejam uz projekta programmatūras daļu.

Kā iestatīt laiku:

Kad RTC modulis ir ieprogrammēts, tas saglabā laiku, pat ja tas tiek noņemts no arduino. Baterijai vajadzētu kalpot vismaz pāris gadus.

Laika pielāgošanai nav pogas, un šī programma RTC iestatīs laiku. Laiks tiek automātiski sinhronizēts ar datora laiku, sastādot kodu, tāpēc pirms programmu augšupielādes pārliecinieties, vai datoram ir iestatīts pareizs laiks.
Augšupielādējiet šo “SetTime” kodu, lai iestatītu laiku ar pievienotu 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 } 

Kad šis kods ir augšupielādēts, atveriet seriālo monitoru, un vajadzētu parādīties veiksmes ziņojumam, kurā teikts, ka laiks ir noteikts.

Tas nozīmē, ka savienojums starp RTC un arduino ir pareizs un laiks ir noteikts.

Tagad augšupielādējiet šādu kodu, lai parādītu laiku 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-------// 

Kad tas ir izdarīts, jums vajadzētu redzēt, ka laiks un datums tiek parādīti LCD ekrānā un darbojas.

Piezīme: Kods “SetTime” tiek modificēts no DS1307RTC koda parauga, lai optimizētu vadu savienojumus RTC modulim, augšupielādējot sākotnējo kodu, laiks netiks iestatīts.

Digitālais modinātājs, izmantojot Arduino

Šajā iepriekš mēs uzzinājām, kā izveidot pamata Arduino pulksteni, izmantojot RTC moduli, nākamajā sadaļā mēs izpētām, kā to var uzlabot digitālā modinātāja ķēdē, izmantojot Arduino.

Ir daži cilvēki, kuriem modinātājs nav vajadzīgs, viņi pamostas dabiski, un ir daži cilvēki, kuri pamostas pēc tam, kad modinātājs zvana dažas reizes, un ir daži cilvēki, kuri vairākas reizes nospiež atlikšanas pogu un dodas uz savu koledžu / darbu ar vēlu daži attaisnojumi.

Piedāvātais jautrais mazais modinātāja projekts var risināt problēmu ar slinkumu rīta pamodināšanas laikā. Lielākajai daļai modinātāju ir atlikšanas poga un iepriekš noteikts trauksmes izslēgšanas laiks, ja lietotājs nereaģē.

Mēs izveidojām šo modinātāju bez slinkas pogas (atlikšanas poga), un modinātājs netiks izslēgts, kamēr lietotājs nespiedīs pogu.

Šis pulkstenis var parādīt laiku 12 stundu formātā un datumu formātā DD / MM / GGGG.

Laiks un datums tiks parādīti 16 x 2 LCD displejā. RTC vai reālā laika pulksteņa laika modulis rūpēsies par laika uzskaiti un var saglabāt pareizu laiku pat pēc ilga strāvas pārtraukuma.

Ir paredzētas 5 pogas, kuru funkcija drīz tiks paskaidrota. Projekta Arduino smadzenes var izmantot jebkuru modeli pēc jūsu izvēles, kompakto izmēru dēļ mēs iesakām izmantot Arduino pro mini vai Arduino nano.

Tagad iegremdēsimies shēmās.

Iepriekš ir shēma Arduino, lai parādītu savienojumu, pielāgotu displeja kontrastu, pagriežot 10K potenciometru.

Zemāk ir pārējā ķēde:

Kontūru var darbināt ar 9V 500mA sienas adapteri.

5 pogu funkcijas:

S1 - to izmanto trauksmes apturēšanai (tā ir arī atiestatīšanas poga).
S2 - tiek izmantots trauksmes iestatīšanai. Ilgi nospiežot S2, jūs nokļūsiet trauksmes iestatījumu izvēlnē.
S3 - to izmanto, lai palielinātu stundas.
S4 - tas tiek izmantots, lai palielinātu minūtes.
S5 - tiek izmantots trauksmes stāvokļa pārslēgšanai. Ja LCD displejā labajā pusē apakšējā stūrī ir “*”, trauksme ir IESLĒGTA, ja “*” nav, trauksmes statistika ir izslēgta.

Sīkāka informācija par trauksmes iestatīšanu ir paskaidrota raksta apakšdaļā.

Lejupielādējiet bibliotēkas failus zemāk:

1. saite: github.com/PaulStoffregen/DS1307RTC
2. saite: github.com/PaulStoffregen/Time

Tagad mums ir jāiestata laiks RTC modulim, laiks tiks sinhronizēts no datora uz RTC moduli.

Augšupielādējiet zemāk esošo kodu, lai iestatītu laiku un atvērtu sērijas monitoru:

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

Tagad esat veiksmīgi iestatījis laiku līdz RTC
Pēc tam jums jāaugšupielādē šāds galvenais kods:

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

Pēc iepriekš minētā koda augšupielādes displejā ir redzams pareizs laiks un datums.

Apskatīsim, kā iestatīt modinātāju:
• Ilgi nospiediet S2, līdz redzat Signalizācijas izvēlni.
• Nospiediet S3 un S4, lai attiecīgi pielāgotu stundas un minūtes.
• Pēc vēlamā laika iestatīšanas vēlreiz nospiediet S2. Tajā būs teikts “Modinātājs ir iestatīts uz xx: xx stundām”.
• Ja trauksme ir IESLĒGTA, displejā var redzēt simbolu “*”, ja trauksme ir izslēgta, simbola “*” nebūs.
• Jūs varat ieslēgt / izslēgt modinātāju, pus sekundi nospiežot S5. Nospiediet ilgi, līdz pazūd “*” (tas atkal atgriežas), vienkārši nospiediet pus sekundi, lai pārslēgtu trauksmes statusu.

SVARĪGA PIEZĪME:

Visizplatītākā kļūda, uzstādot modinātāju uz jebkura pulksteņa, ir nejauša AM / PM pārslēgšana, kā rezultātā trauksme netiek atskaņota mūsu vēlmes laikā.

Lai novērstu šo problēmu, ierosinātais modinātāja iestatījums ir paredzēts 24 stundu pulksteņa formātā.

LCD displejā redzamais laiks būs 12 stundas ar AM / PM formātu, bet, iestatot modinātāju ar šo projektu, jums jāiestata 24 stundu formātā no 0 līdz 23 stundām.

Piemēram: ja vēlaties iestatīt modinātāju plkst. 21:00, jums jāiestata 21 stunda un 0 minūtes. Pulksten 5:00: 5 stundas 0 minūtes un tā tālāk.

Autora prototips:

Vai jums patīk šis projekts? Vai jums ir kādi jautājumi par šo projektu, nekautrējieties izteikties komentārā, iespējams, saņemsit ātru atbildi.

Videoklips:




Pāri: Bākas līmeņa indikatora shēma kombainu graudu cisternām Nākamais: 3 lieljaudas SG3525 tīra sinewave invertora shēmas