Arduino digitális óra az RTC modul használatával

Próbálja Ki A Műszerünket A Problémák Kiküszöbölésére





Ebben a bejegyzésben egy digitális órát fogunk építeni az RTC vagy a Real Time Clock modul használatával. Megértjük, mi az „RTC” modul, hogyan lehet az Arduinóval együttműködni és mit csinál.

Által:



Az RTC modul egy áramkör, amely pontosan követi az aktuális időt. Két funkciója van, kommunikál a mikrovezérlőkkel és a mikroprocesszorokkal, hogy aktuális időt adjanak, és tartalék áramkörként működjenek az idő fenntartására áramkimaradás esetén, mivel beépített akkumulátoros biztonsági rendszerrel rendelkezik.

Az RTC-t minden olyan elektronikus eszközben megtalálhatjuk, ahol az idő a szerkentyű fontos funkciója.



Például számítógépünk vagy laptopunk megtartja az idejét még akkor is, ha a tápfeszültséget leállítják vagy az akkumulátort eltávolítják. Bármely számítógép alaplapján megtalálhatunk egy CMOS akkumulátort, amely táplálja az RTC áramkört.

Hasonló típusú áramkört fogunk használni ebben a projektben.

Az RTC modul egy olcsó eszköz, amely megtalálható minden e-kereskedelmi webhelyen és a helyi elektronikus projektüzletekben.

A tipikus DS1307 RTC modul illusztrációja:

Az RTC modulok nagy része a vásárláskor akkumulátorral (CR2032) érkezik. Különböző méretűek és modellek vannak, a fent bemutatott kép nem feltétlenül egyezik meg az Ön számára. De győződjön meg arról, hogy a modell száma DS1307. Az ebben a bejegyzésben írt kód csak a DS1307 kompatibilis.

Most tudsz valamit az RTC-kről. Most térjünk át a digitális óra kialakítására. A projekt folytatása előtt le kell töltenie a könyvtárat a következő linkekről, és telepítenie kell az IDE-jére:

• DS1307RTC.h

Link: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Link: github.com/PaulStoffregen/Time

A másik két könyvtárat előre telepítették volna az Arduino IDE-re, ha Ön a legújabb verziót használja.

• LiquidCrystal.h

• Huzal.h

Az áramkör:

Az áramköri kapcsolat az arduino és az LCD kijelző között alapfelszereltség, amelyet hasonló kapcsolatot találhatunk más LCD alapú projekteknél is. Az egyetlen kiegészítő komponens az RTC.

A huzal torlódásának csökkentése érdekében a prototípus során az RTC közvetlenül az arduino analóg csapjaihoz illeszthető. Forrasztja az SCl, SDA, Vcc és GND-t hím fejléc-csapokkal, és helyezze be A2-től A5-ig a prototípus szerint.

A szerző prototípusa:

Az RTC helyes beillesztése az Arduino-ba:

Ha az RTC-jének különböző tűs helyei vannak, és nem tudott replikálni a fentiek szerint, akkor mindig vezetékeket használhat a csatlakozáshoz. Most a hardver beállítása befejeződött, térjünk át a projekt szoftveres részére.

Az idő beállítása:

Az RTC modul beprogramozása után megtartja az időt, még akkor is, ha eltávolítják az arduino-ból. Az akkumulátornak legalább pár évig kell tartania.

Nincs gomb az idő beállítására, a következő program állítja be az időt az RTC-ben. Az idő automatikusan szinkronizálódik a számítógépével, a kód összeállítása közben, ezért a programok feltöltése előtt győződjön meg arról, hogy a számítógép helyes időbe van állítva.
Töltse fel ezt a „SetTime” kódot az idő beállításához a csatlakoztatott RTC segítségével:

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

Miután feltöltöttük ezt a kódot, nyissuk meg a soros monitort, és egy sikerüzenetnek kell megjelennie, amely szerint az idő be van állítva.

Ez azt jelzi, hogy a kapcsolat az RTC és az arduino között helyes és az idő be van állítva.

Most töltse fel a következő kódot az idő megjelenítéséhez az LCD-n.

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

Ha ez megtörtént, látnia kell, hogy az idő és a dátum megjelenik az LCD-n, és fut.

Jegyzet: A „SetTime” kód a DS1307RTC példakódjából módosul, hogy optimalizálja a vezetékes kapcsolatokat az RTC modulhoz. Az eredeti kód feltöltése nem állítja be az időt.

Digitális ébresztőóra az Arduino használatával

Ebben a fentiekben megtanultuk az alapvető Arduino óra felépítését az RTC modul használatával, a következő szakaszban azt vizsgáljuk, hogyan lehet ezt az Arduino segítségével digitális ébresztőóra áramkörré fejleszteni.

Van, akinek nincs szüksége ébresztőórara, természetesen felébred, és van, aki ébresztőóra ébredése után néhányszor ébred fel, és van, aki sokszor nyomja meg a szundi gombot, és későn megy egyetemre / munkába néhány kifogás.

A javasolt vidám kis ébresztőóra projekt szembesülhet a problémával a reggeli ébrenlét lustaságával. A legtöbb ébresztőóra rendelkezik szundi gombbal és előre meghatározott határidővel a riasztáshoz, ha a felhasználó nem válaszolt.

Ezt az ébresztőórát lusta gomb (szundi gomb) nélkül terveztük meg, és az ébresztő nem kapcsol ki, amíg a felhasználó nem nyom meg egy gombot.

Ez az óra 12 órás formátumban és a dátum NN / HH / ÉÉÉÉ formátumban képes megjeleníteni.

Az idő és a dátum 16 x 2 LCD kijelzőn jelenik meg. Egy RTC vagy valós idejű óra időmodul gondoskodik az idő követéséről, és hosszú áramkimaradás után is megtarthatja a pontos időt.

5 gomb található, feltéve, hogy kinek a funkcióját rövidesen elmagyarázzák. Az Arduino projekt agya tetszőleges modellt képes kiválasztani, kompakt mérete miatt javasoljuk az Arduino pro mini vagy az Arduino nano alkalmazását.

Most merüljünk el sematikus ábrákon.

A fenti vázlatos az Arduino számára a kapcsolat megjelenítéséhez, a kijelző kontrasztjának beállításához a 10K potenciométer forgatásával.

Az alábbiakban látható az áramkör többi része:

Az áramkört 9V 500mA fali adapterrel lehet táplálni.

5 gomb funkciói:

S1 - Ez a riasztás leállítására szolgál (ez a reset gomb is).
S2 - riasztás beállítására szolgál. Az S2 hosszan tartó megnyomásával eljuthat a riasztási menübe.
S3 - Órák növelésére használják.
S4 - percek növelésére szolgál.
S5 - A riasztási állapot váltására szolgál. Ha a * * van az LCD kijelzőn a jobb alsó sarokban, akkor a riasztás BE van kapcsolva, ha a * nem létezik, a riasztási statisztika KI van kapcsolva.

A riasztás beállításának részletes leírása a cikk alján található.

Töltse le az alábbi könyvtárfájlokat:

1. link: github.com/PaulStoffregen/DS1307RTC
Link2: github.com/PaulStoffregen/Time

Most be kell állítanunk az időt az RTC modulra, az időt szinkronizáljuk az Ön PC-jétől az RTC modulig.

Töltse fel az alábbi kódot az idő beállításához és a soros monitor megnyitásához:

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

Most sikeresen beállította az időt az RTC-re
Ezután fel kell töltenie a következő fő kódot:

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

A fenti kód feltöltése után látnia kell a pontos időt és dátumot a kijelzőn.

Most nézzük meg, hogyan kell beállítani az ébresztést:
• Hosszan nyomja meg az S2 gombot, amíg meg nem jelenik a Riasztás menü.
• Az S3 és az S4 gombokkal állítsa be az órákat és a perceket.
• A kívánt idő beállítása után nyomja meg ismét az S2 gombot. Azt fogja mondani, hogy „A riasztás xx: xx órára van beállítva”.
• Ha a riasztás BE van kapcsolva, akkor a kijelzőn a „*” szimbólum látható, ha a riasztás KI van kapcsolva, akkor a „*” szimbólum nem jelenik meg.
• Az ébresztést be- és kikapcsolhatja az S5 fél másodpercig történő lenyomásával. Ne nyomja addig hosszan, amíg a „*” el nem tűnik (újra visszatér), csak nyomja meg fél másodpercig a riasztási állapot váltásához.

FONTOS JEGYZET:

A riasztás bármely órára történő beállításakor a leggyakoribb hiba a nem szándékos AM / PM be- és kikapcsolása, ami azt eredményezi, hogy a vészidőnkben nem szólal meg a riasztás.

A probléma megoldására a javasolt ébresztőóra-beállítást 24 órás formátumra tervezték.

Az LCD-n megjelenített idő 12 óra lesz AM / PM formátumban, de ha ezzel a projekttel riasztást állít be, akkor 24 órás formátumban kell beállítania 0 és 23 óra között.

Például: ha ébresztést akar 9: 00-kor beállítani, akkor 21 órát és 0 percet kell beállítania. 5 óráig: 5 óra 0 perc és így tovább.

A szerző prototípusa:

Tetszik neked ez a projekt? Bármilyen kérdése van a projekttel kapcsolatban, nyugodtan fejezze ki a megjegyzésben, gyors választ kaphat.

Videoklip:




Előző: Jelzőszint jelző áramkör kombájn gabonatartályokhoz Következő: 3 nagy teljesítményű SG3525 tiszta Sinewave inverter áramkör