Arduino digitaalne kell RTC mooduli abil

Proovige Meie Instrumenti Probleemide Kõrvaldamiseks





Selles postituses ehitame digitaalse kella, kasutades RTC või reaalajas kella moodulit. Mõistame, mis on “RTC” moodul, kuidas Arduinoga liituda ja mida see teeb.

Kõrval:



RTC moodul on vooluring, mis jälgib täpselt praegust aega. Sellel on kaks funktsiooni, see suhtleb mikrokontrollerite ja mikroprotsessoritega, et anda praegune aeg ja toimida varuahelana, et säilitada elektrikatkestuse korral aega, kuna sellel on sisseehitatud aku varusüsteem.

RTC leiame kõigist elektroonikaseadmetest, kus aeg on vidina oluline funktsioon.



Näiteks hoiab meie arvuti või sülearvuti oma aega ka pärast toite välja lülitamist või aku eemaldamist. Iga arvuti emaplaadilt võime leida CMOS-patarei, mis toidab RTC-vooluahelat.

Samasugust vooluringi, mida selles projektis kasutame.

RTC moodul on odav seade, mida leiate kõigilt e-kaubanduse saitidelt ja teie kohalikest elektrooniliste projektide poodidest.

Tüüpilise RTC mooduli DS1307 illustratsioon:

Enamikul RTC moodulitest on ostmise ajal kaasas aku (CR2032). Suurusi ja mudeleid on erinevaid, ülaltoodud illustreeritud ei pruugi teie jaoks ühesugused olla. Kuid veenduge, et mudeli number oleks DS1307. Selles postituses kirjutatud kood ühildub ainult seadmega DS1307.

Nüüd teate midagi RTC-de kohta. Nüüd liigume digitaalse kella kujunduse juurde. Enne selle projektiga jätkamist peate teegi alla laadima järgmistelt linkidelt ja installima oma IDE-sse:

• DS1307RTC.h

Link: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Link: github.com/PaulStoffregen/Time

Kui kasutate uusimat versiooni, oleks Arduino IDE-sse eelinstallitud veel kaks teeki.

• LiquidCrystal.h

• Traat.h

Vooluring:

Arduino ja LCD-ekraani vaheline vooluühendus on standardne, mille võime leida sarnase ühenduse ka teistel LCD-põhistel projektidel. Ainus lisakomponent on RTC.

Traadi ülekoormuse vähendamiseks prototüübi ajal saab RTC sisestada otse arduino analoognõeltesse. Jootke SCl, SDA, Vcc ja GND koos isaste päistihvtidega ja sisestage A2 - A5 tihvtid, nagu näidatud prototüübis.

Autori prototüüp:

RTC õigesti sisestamine Arduinole:

Kui teie RTC-l on erinevad tihvtide asukohad ja ta ei saa paljundada, nagu ülaltoodud, siis võite alati ühendamiseks kasutada juhtmeid. Nüüd on teie riistvara seadistamine lõpule jõudnud, liigume projekti tarkvarasse.

Aja määramine:

Kui RTC moodul on programmeeritud, säilitab see ka arduinost eemaldamise aja. Aku peaks vastu pidama vähemalt paar aastat.

Kellaaja reguleerimiseks pole nuppu, järgmine programm määrab aja RTC-s. Aeg sünkroonitakse koodi koostamise ajal automaatselt arvuti ajaga, nii et enne programmide üleslaadimist veenduge, et teie arvuti on õigeks ajaks seadistatud.
Laadige see SetTime kood üles, et määrata kellaaeg, kui RTC on ühendatud:

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

Kui see kood on üles laaditud, avage jadamonitor ja peaks ilmuma edukateade, mis ütleb, et aeg on määratud.

See tähendab, et teie ühendus RTC ja arduino vahel on õige ja aeg on määratud.

Nüüd laadige LCD ekraanil üles aja kuvamiseks järgmine kood.

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

Kui see on tehtud, peaksite nägema, et LCD-ekraanil kuvatakse kellaaeg ja kuupäev ning see töötab.

Märge: RTC-mooduli traadiühenduste optimeerimiseks on koodi SetTime modifitseeritud DS1307RTC näitekoodist, originaalkoodi üleslaadimine ei määra aega.

Digitaalne äratuskell Arduino abil

Selles ülalpool õppisime, kuidas ehitada Arduino baaskell RTC mooduli abil, järgmises osas uurime, kuidas seda Arduino abil digitaalseks äratuskellaks muuta.

On inimesi, kellel pole äratuskella vaja, nad ärkavad loomulikult ja on inimesi, kes ärkavad pärast seda, kui äratuskell heliseb paar korda, ja on inimesi, kes vajutavad mitu korda edasilükkamisnuppu ja lähevad hilja oma kolledžisse / tööle mõned vabandused.

Kavandatud lõbus väike äratuskellaprogramm võib hommikuse ärkamise ajal probleemiga kokku puutuda. Enamikul äratuskelladest on edasilükkamise nupp ja alarmi ettemääratud aeg, kui kasutaja ei reageeri.

Kujundasime selle äratuskella ilma laisa nuputa (edasilükkamise nupp) ja äratus ei lülitu välja enne, kui kasutaja nuppu vajutab.

See kell võib näidata aega 12-tunnises vormingus ja kuupäeva PP / KK / AAAA vormingus.

Kellaaega ja kuupäeva kuvatakse 16 x 2 LCD ekraanil. RTC või reaalajas kella aja moodul hoolitseb aja jälgimise eest ja suudab säilitada õiget aega ka pärast pikka voolukatkestust.

Kui funktsioon on varsti selgitatud, on olemas 5 nuppu. Arduino projekti aju suudab valida ükskõik millise mudeli, meie kompaktse suuruse tõttu soovitaksime kasutada Arduino pro mini või Arduino nano.

Nüüd sukeldume skeemidesse.

Ülaltoodud on skeem Arduino jaoks ühenduse kuvamiseks, ekraani kontrastsuse reguleerimiseks 10K potentsiomeetri pööramisega.

Allpool on ülejäänud vooluring:

Vooluahelat saab toita 9V 500mA seinaadapteriga.

5 nupu funktsioonid:

S1 - seda kasutatakse alarmi peatamiseks (see on ka lähtestamisnupp).
S2 - kasutatakse alarmi seadistamiseks. Kui vajutate pikalt nuppu S2, jõuate häireseadete menüüsse.
S3 - seda kasutatakse tundide suurendamiseks.
S4 - seda kasutatakse minutite suurendamiseks.
S5 - kasutatakse alarmi oleku vahetamiseks. Kui parempoolses alumises nurgas oleval LCD-ekraanil on “*”, on alarm sisse lülitatud, kui “*” pole olemas, on alarmi statistika VÄLJAS.

Häire seadmise kohta on üksikasjalikumalt selgitatud artikli lõpus.

Laadige alla teegi failid:

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

Nüüd peame määrama aja RTC moodulile, aeg sünkroonitakse teie arvutist RTC moodulini.

Aja määramiseks ja seeriamonitori avamiseks laadige üles järgmine kood:

//------------------------------------------------// #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üüd olete edukalt määranud aja RTC-le
Järgmisena peate üles laadima järgmise põhikoodi:

//------------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ärast ülaltoodud koodi üleslaadimist peate ekraanil nägema õiget kellaaega ja kuupäeva.

Vaatame nüüd, kuidas alarm panna:
• Vajutage pikalt nuppu S2, kuni näete menüüd Alarm.
• Vajutage S3 ja S4 vastavalt tundide ja minutite reguleerimiseks.
• Pärast soovitud aja määramist vajutage uuesti S2. See ütleb 'Äratus on seatud xx: xx tunniks'.
• Kui alarm on SEES, näete ekraanil sümbolit *, kui alarm on OFF, siis sümbolit * ei kuvata.
• Alarmi saate sisse või välja lülitada, vajutades pool sekundit S5. Ärge vajutage kaua, kuni “*” kaob (see tuleb uuesti tagasi), vajutage alarmi oleku vahetamiseks lihtsalt pool sekundit.

TÄHTIS MÄRKUS.

Igas kellas alarmi seadmisel on kõige tavalisem viga tahtmatu AM / PM sisse- ja väljalülitamine, mille tulemusel äratus meie sooviajal ei helise.

Selle probleemi lahendamiseks on kavandatud äratuskella seade loodud 24 tunni kellavormingus.

LCD ekraanil kuvatav aeg on 12 tundi AM / PM formaadis, kuid kui panete selle projektiga alarmi sisse, peate seadistama 24 tunni vormingus vahemikus 0 kuni 23 tundi.

Näiteks: kui soovite äratuse seada kell 21.00, peate määrama 21 tundi ja 0 minutit. Kella 5 hommikul: 5 tundi ja 0 minutit ja nii edasi.

Autori prototüüp:

Kas teile meeldib see projekt? Kui teil on selle projektiga seotud küsimusi, väljendage julgelt kommentaare, võite saada kiire vastuse.

Videoklipp:




Paari: kombaini kombainiteraviljamahutite majaka taseme indikaatorahel Järgmine: 3 suure võimsusega SG3525 puhast Sinewave inverterahelat