Arduino Digital Clock RTC-moduulia käyttämällä

Kokeile Instrumenttia Ongelmien Poistamiseksi





Tässä viestissä aiomme rakentaa digitaalisen kellon käyttämällä RTC- tai Real Time Clock -moduulia. Ymmärrämme mikä RTC-moduuli on, miten olla yhteydessä Arduinoon ja mitä se tekee.

Kirjoittaja:



RTC-moduuli on piiri, joka seuraa ajankohtaa tarkasti. Se suorittaa kaksi toimintoa, se on yhteydessä mikrokontrollereihin ja mikroprosessoreihin antamaan nykyisen ajan ja toimimaan varapiirinä ajan ylläpitämiseksi sähkökatkoksen sattuessa, koska siinä on sisäänrakennettu akun varmuuskopiointijärjestelmä.

Voimme löytää RTC: n kaikista elektronisista laitteista, joissa aika on gadgetin tärkeä tehtävä.



Esimerkiksi tietokoneemme tai kannettava tietokone säilyttää aikansa silloinkin, kun virta on kytketty pois päältä tai akku on poistettu. Minkä tahansa tietokoneen emolevyltä voimme löytää CMOS-akun, joka käyttää RTC-piiriä.

Samanlainen piiri, jota aiomme käyttää tässä projektissa.

RTC-moduuli on halpa laite, joka löytyy kaikilta verkkokauppasivustoilta ja paikallisista sähköisistä projektikaupoista.

Kuva tyypillisestä RTC-moduulista DS1307:

Suurimmassa osassa RTC-moduuleista on paristo (CR2032) ostohetkellä. Kokoja ja malleja on erilaisia, yllä kuvattu ei välttämättä ole sama sinulle. Mutta varmista, että mallinumero on DS1307. Tähän viestiin kirjoitettu koodi on yhteensopiva vain DS1307: n kanssa.

Nyt tiedät jotain RTC: stä. Siirrytään nyt digitaalisen kellon suunnitteluun. Ennen kuin jatkat tämän projektin aloittamista, sinun on ladattava kirjasto seuraavista linkeistä ja asennettava IDE: si:

• DS1307RTC.h

Linkki: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Linkki: github.com/PaulStoffregen/Time

Kaksi muuta kirjastoa olisi esiasennettu Arduino IDE: hen, jos olet uusimmalla versiolla.

• LiquidCrystal.h

• Lanka. H

Piiri:

Arduinon ja LCD-näytön välinen piiriliitäntä on vakiona, minkä voimme löytää samanlaisen yhteyden muissa LCD-pohjaisissa projekteissa. Ainoa lisäkomponentti on RTC.

Langan ruuhkien vähentämiseksi prototyypin aikana RTC voidaan asettaa suoraan arduinon analogisiin nastoihin. Juotetaan SCl-, SDA-, Vcc- ja GND-uros otsikkotapilla ja työnnetään se A2: sta A5-nastoihin prototyypin mukaisesti.

Kirjoittajan prototyyppi:

Kuinka lisätä RTC oikein Arduinoon:

Jos RTC: lläsi on eri nastan sijainnit ja että se ei pysty toistamaan yllä esitetyllä tavalla, voit aina käyttää johtoja yhteyden muodostamiseen. Nyt laitteiston määritys on valmis, siirrymme projektin ohjelmisto-osaan.

Kuinka asettaa aika:

Kun RTC-moduuli on ohjelmoitu, se ylläpitää aikaa, vaikka se poistettaisiin arduinosta. Akun tulisi kestää vähintään pari vuotta.

Kellonajan säätämiseen ei ole mitään painiketta. Seuraava ohjelma asettaa ajan RTC: ssä. Aika synkronoidaan automaattisesti tietokoneen ajan kanssa koodia laadittaessa, joten varmista, että tietokoneesi on asetettu oikeaan aikaan, ennen kuin lataat ohjelmia.
Lataa tämä “SetTime” -koodi asettaaksesi kellonajan RTC: n ollessa kytkettynä:

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

Kun tämä koodi on ladattu, avaa sarjamonitori ja menestysviestin pitäisi ilmestyä sanomalla, että aika on asetettu.

Tämä tarkoittaa, että yhteys RTC: n ja arduinon välillä on oikea ja aika on asetettu.

Lataa nyt seuraava koodi ajan näyttämiseksi nestekidenäytössä.

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

Kun tämä on tehty, sinun pitäisi nähdä, että kellonaika ja päivämäärä näkyvät LCD-näytöllä ja ovat käynnissä.

Huomautus: SetTime-koodia muokataan DS1307RTC: n esimerkkikoodista optimoimaan johdinliitännät RTC-moduulille, alkuperäisen koodin lataaminen ei aseta aikaa.

Digitaalinen herätyskello Arduinolla

Tässä edellä opimme kuinka rakentaa peruskello Arduino RTC-moduulin avulla, seuraavassa jaksossa tutkitaan, kuinka tämä voidaan päivittää digitaaliseksi herätyskellopiiriksi Arduinoa käyttämällä.

On joitain ihmisiä, jotka eivät tarvitse herätyskelloa, he heräävät luonnollisesti ja on joitain ihmisiä, jotka heräävät herätyskellon soidessa muutaman kerran, ja on joitain ihmisiä, jotka painavat torkkutoimintopainiketta useita kertoja ja lähtevät yliopistoonsa / työhön myöhään joitain tekosyitä.

Ehdotettu hauska pieni herätyskelloprojekti saattaa kohdata ongelman laiskuuteen aamun herätyksen aikana. Useimmissa herätyskelloissa on torkkutoiminto ja ennalta määritetty hälytyksen katkaisuaika, jos käyttäjä ei vastaa.

Suunnittelimme tämän herätyskellon ilman laiska-painiketta (torkkutoiminto), eikä hälytys sammu, ennen kuin käyttäjä painaa painiketta.

Tämä kello voi näyttää ajan 12 tunnin muodossa ja päivämäärän PP / KK / VVVV muodossa.

Aika ja päivämäärä näytetään 16 x 2 LCD-näytöllä. RTC tai reaaliaikainen kelloajan moduuli huolehtii ajan seurannasta ja voi säilyttää oikean ajan myös pitkän virtakatkoksen jälkeen.

Mukana on 5 painiketta, joiden toiminnot selitetään pian. Arduino-projektin aivot pystyvät valitsemaan minkä tahansa mallin, suosittelemme Arduino pro mini- tai Arduino nanoa kompaktin koonsa vuoksi.

Sukelletaan nyt kaavioihin.

Yllä on kaavio Arduinon näyttämään yhteys, säätämään näytön kontrastia kiertämällä 10K-potentiometriä.

Alla on muu piiri:

Piiri voidaan käyttää 9 V 500 mA: n seinäadapterilla.

5 painikkeen toiminnot:

S1 - Tätä käytetään hälytyksen pysäyttämiseen (se on myös nollauspainike).
S2 - Käytetään hälytyksen asettamiseen. Painamalla pitkään S2, pääset hälytysasetusten valikkoon.
S3 - Sitä käytetään lisäämään tunteja.
S4 - sitä käytetään minuuttien lisäämiseen.
S5 - Käytetään hälytystilan vaihtamiseen. Jos “*” on LCD-näytössä oikeanpuoleisessa alakulmassa, hälytys on PÄÄLLÄ, jos ”*” ei ole, hälytystilastot ovat POIS PÄÄLTÄ.

Lisätietoja hälytyksen asettamisesta on selitetty artikkelin alaosassa.

Lataa kirjastotiedostot alla:

Linkki1: github.com/PaulStoffregen/DS1307RTC
Linkki2: github.com/PaulStoffregen/Time

Nyt meidän on asetettava aika RTC-moduulille, aika synkronoidaan tietokoneeltasi RTC-moduuliin.

Lataa alla oleva koodi ajan asettamiseksi ja sarjamittarin avaamiseksi:

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

Nyt olet asettanut ajan RTC: lle
Seuraavaksi sinun on ladattava seuraava pääkoodi:

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

Kun olet ladannut yllä olevan koodin, sinun on näytettävä oikea aika ja päivämäärä näytöllä.

Katsotaan nyt, kuinka hälytys asetetaan:
• Paina pitkään S2, kunnes näet Hälytys-valikon.
• Säädä tunnit ja minuutit painamalla S3 ja S4.
• Kun olet asettanut haluamasi ajan, paina S2 uudelleen. Se sanoo 'Hälytys on asetettu xx: xx tunniksi'.
• Jos hälytys on päällä, näytössä näkyy “*” -symboli, jos hälytys on pois päältä, ”*” -symbolia ei ole.
• Voit kytkeä hälytyksen päälle / pois päältä painamalla S5 puoli sekuntia. Älä paina pitkään, kunnes * * häviää (se palaa takaisin), paina vain puoli sekuntia pitkää vaihtaaksesi hälytyksen tilan.

TÄRKEÄ MUISTIINPANO:

Yleisin virhe hälytyksen asettamisessa millä tahansa kellolla on tahaton AM / PM-vaihtaminen, mikä johtaa siihen, että hälytys ei soi haluuksillamme.

Tämän ongelman ratkaisemiseksi ehdotettu herätyskelloasetus on suunniteltu 24 tunnin kellomuodossa.

Nestekidenäytössä näkyvä aika on 12 tuntia AM / PM-muodossa, mutta kun asetat hälytyksen tällä projektilla, sinun on asetettava 24 tunnin muodossa 0-23 tuntia.

Esimerkiksi: jos haluat asettaa hälytyksen kello 21.00, sinun on asetettava 21 tuntia ja 0 minuuttia. Kello 5.00: 5 tuntia 0 minuuttia ja niin edelleen.

Kirjoittajan prototyyppi:

Pidätkö tästä projektista? Jos sinulla on kysyttävää tästä projektista, voit ilmaista kommenttisi, saatat saada nopean vastauksen.

Videoleike:




Pari: Majakan tason osoitinpiiri leikkuupuimurin viljasäiliöille Seuraava: 3 suuritehoista SG3525 puhdasta siniaaltoinvertteripiiriä