שעון דיגיטלי של Arduino באמצעות מודול RTC

נסה את הכלי שלנו לביטול בעיות





בפוסט זה אנו הולכים לבנות שעון דיגיטלי באמצעות מודול RTC או שעון זמן אמת. נבין מהו מודול “RTC”, כיצד להתקשר עם ארדואינו ומה הוא עושה.

על ידי:



מודול RTC הוא מעגל העוקב במדויק אחר הזמן הנוכחי. הוא מבצע שתי פונקציות, הוא מתקשר עם מיקרו-בקרים ומיקרו-מעבדים בכדי לתת זמן שוטף ולשמש כמעגל גיבוי לשמירה על זמן במקרה של הפסקת חשמל, מכיוון שיש לו מערכת גיבוי סוללה מובנית.

אנו יכולים למצוא RTC בכל מכשירים אלקטרוניים בהם הזמן הוא פונקציה חשובה של הגאדג'ט.



לדוגמה, המחשב או המחשב הנייד שלנו שומרים על זמנם גם לאחר חיבור החשמל או הסרת הסוללה. על לוח האם של כל מחשב אנו יכולים למצוא סוללת CMOS, שמפעילה את מעגל RTC.

סוג דומה של מעגל שנשתמש בפרויקט זה.

מודול RTC הוא מכשיר זול אשר ניתן למצוא בכל אתרי מסחר אלקטרוני ובחנויות הפרויקטים האלקטרוניים המקומיות שלך.

איור של מודול RTC טיפוסי DS1307:

רוב מודולי ה- RTC מגיעים עם סוללה (CR2032) בעת הרכישה. ישנם המידות והדגמים השונים, ייתכן שהמוצג לעיל אינו זהה עבורך. אך וודא שמספר הדגם הוא DS1307. הקוד שנכתב בפוסט זה תואם רק ל- DS1307.

עכשיו אתה יודע משהו על RTC. עכשיו בואו נעבור לעיצוב השעון הדיגיטלי. לפני שתמשיך בפרויקט זה עליך להוריד את הספרייה מהקישורים הבאים ולהתקין ב- IDE שלך:

• DS1307RTC.h

קישור: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

קישור: github.com/PaulStoffregen/Time

שתי ספריות אחרות היו מותקנות מראש ב- Arduino IDE, אם אתה בגרסה האחרונה.

• LiquidCrystal.h

• Wire.h

המעגל:

חיבור המעגל בין ארדואינו לתצוגת LCD הוא סטנדרטי, אותו אנו יכולים למצוא חיבור דומה בפרויקטים אחרים מבוססי LCD. הרכיב הנוסף היחיד הוא ה- RTC.

כדי להפחית את גודש החוטים במהלך אב-טיפוס, ניתן להכניס את ה- RTC לסיכות האנלוגיות ישירות של הארדואינו. הלחמו את SCl, SDA, Vcc ו- GND בעזרת פינים של כותרות זכר והכנסו אותו לסיכות A2 ל- A5 כפי שמוצג באב הטיפוס.

אב הטיפוס של המחבר:

כיצד להכניס כראוי RTC בארדואינו:

אם ל- RTC יש מיקומי סיכה שונים ולא הצליחו להעתיק אותם כפי שמודגם לעיל, תמיד תוכלו להשתמש בחוטים לחיבור. כעת הגדרת החומרה שלך הושלמה, בוא נעבור לחלק התוכנה של הפרויקט.

כיצד להגדיר זמן:

לאחר שתוכנת מודול ה- RTC, הוא שומר על הזמן אפילו שהוא מוסר מהארדואינו. הסוללה אמורה להחזיק מעמד לפחות כמה שנים.

אין כפתור להתאמת הזמן בו התוכנית הבאה תקבע את השעה ב- RTC. הזמן מסונכרן אוטומטית עם זמן המחשב שלך, תוך כדי קומפילציה של הקוד, לכן וודא שהמחשב מוגדר לשעה הנכונה, לפני העלאת התוכניות.
העלה קוד 'SetTime' זה כדי להגדיר את הזמן עם 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 } 

לאחר העלאת קוד זה, פתח את המסך הטורי והודעת הצלחה אמורה לצוץ באומרו שהזמן נקבע.

זה מסמל שהחיבור שלך בין ה- RTC לארדואינו נכון והזמן נקבע.

כעת העלה את הקוד הבא להצגת השעה ב- 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-------// 

ברגע שזה נעשה, אתה אמור לראות את השעה והתאריך מוצגים על גבי LCD ופועלים.

פתק: קוד 'SetTime' שונה מקוד לדוגמא של DS1307RTC כדי לייעל חיבורי חוטים למודול RTC, העלאת קוד מקורי לא תקבע זמן.

שעון מעורר דיגיטלי באמצעות Arduino

בזה לעיל למדנו כיצד לבנות את השעון הבסיסי של ארדואינו באמצעות מודול RTC, בסדרה הבאה אנו חוקרים כיצד ניתן לשדרג את זה למעגל שעון מעורר דיגיטלי באמצעות ארדואינו.

יש אנשים שלא זקוקים לשעון מעורר, הם מתעוררים באופן טבעי ויש אנשים שמתעוררים אחרי שעון מעורר מצלצל כמה פעמים ויש אנשים שלוחצים על כפתור הנודניק כמה פעמים והולכים לקולג 'שלהם / עובדים מאוחר עם כמה תירוצים.

פרויקט השעון המעורר הקטן והמהנה המוצע עשוי להתמודד עם הבעיה עם עצלות במהלך הערות הבוקר. לרוב השעונים המעורר יש כפתור נודניק וזמן ניתוק מוגדר מראש להתראה אם ​​המשתמש לא הגיב.

תכננו את השעון המעורר הזה ללא כפתור עצל (כפתור נודניק) והאזעקה לא תיכבה עד שהמשתמש ילחץ על כפתור.

שעון זה יכול להציג זמן בתבנית 12 שעות ותאריך בפורמט DD / MM / YYYY.

השעה והתאריך יוצגו בתצוגת LCD בגודל 16x2. RTC או מודול זמן שעון בזמן אמת ידאג למעקב אחר הזמן ויכול לשמור על זמן נכון גם לאחר הפסקת חשמל ארוכה.

ישנם 5 לחצנים בתנאי מי הפונקציה תוסבר בקרוב. המוח של הפרויקט Arduino יכול לכל דגם שתבחרו, אנו ממליצים על Arduino pro mini או Arduino nano בגלל גודלו הקומפקטי.

עכשיו בואו נצלול לסכימות.

האמור לעיל הוא הסכימה של Arduino להציג חיבור, להתאים את ניגודיות התצוגה על ידי סיבוב פוטנציומטר 10K.

להלן שאר המעגלים:

ניתן להפעיל את המעגל מתאם קיר 9V 500mA.

פונקציות של 5 לחצנים:

S1 - זה משמש לעצירת האזעקה (זה גם כפתור איפוס).
S2 - משמש להגדרת אזעקה. בלחיצה ארוכה על S2 תגיע לתפריט הגדרת אזעקה.
S3 - הוא משמש להגדלת שעות.
S4 - הוא משמש להגדלת דקות.
S5 - משמש להחלפת מצב האזעקה. אם '*' קיים בתצוגת LCD בפינה הימנית התחתונה אזעקה מופעלת, אם '*' לא קיים סטטיסטיקת האזעקה אינה פעילה.

פירוט נוסף על אופן הגדרת האזעקה מוסבר בתחתית המאמר.

הורד את קבצי הספרייה למטה:

קישור 1: github.com/PaulStoffregen/DS1307RTC
קישור 2: github.com/PaulStoffregen/Time

כעת, עלינו להגדיר זמן למודול RTC, הזמן יסונכרן ממחשבך למודול RTC.

העלה את הקוד שלמטה כדי להגדיר זמן ולפתוח צג סידורי:

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

עכשיו הגדרת בהצלחה זמן ל- RTC
לאחר מכן עליך להעלות את הקוד הראשי הבא:

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

לאחר העלאת הקוד הנ'ל עליכם לראות את השעה והתאריך הנכונים פועלים בתצוגה.

בואו נראה כיצד להגדיר אזעקה:
• לחץ לחיצה ארוכה על S2 עד שתראה את תפריט האזעקה.
• לחץ על S3 ו- S4 כדי להתאים שעות ודקות בהתאמה.
• לאחר הגדרת הזמן הרצויה, לחץ שוב על S2. זה יגיד 'האזעקה מוגדרת ל- xx: xx שעות'.
• אם האזעקה פועלת תוכלו לראות את סמל '*' בתצוגה, אם האזעקה כבויה לא יהיה סמל '*'.
• ניתן להפעיל / לכבות את האזעקה על ידי לחיצה על S5 למשך חצי שנייה. אל תלחץ לחיצה ארוכה עד ש- '*' ייעלם (הוא יחזור שוב), פשוט לחץ על חצי שניה כדי להחליף את מצב האזעקה.

הערה חשובה:

הטעות הנפוצה ביותר בעת הגדרת אזעקה בכל שעון היא החלפה לא מכוונת של AM / PM, מה שגורם לא לצליל אזעקה בזמן הרצון שלנו.

כדי להתמודד עם בעיה זו הגדרת השעון המעורר המוצעת מתוכננת בתבנית שעון 24 שעות.

הזמן המוצג על גבי LCD יהיה 12 שעות בפורמט AM / PM, אך כאשר תגדיר אזעקה בפרויקט זה עליך להגדיר בתבנית 24 שעות בין 0 ל -23 שעות.

לדוגמא: אם ברצונך להגדיר אזעקה בשעה 21:00, עליך להגדיר 21 שעות ו- 0 דקות. במשך, 5 בבוקר: 5 שעות ו- 0 דקות וכן הלאה.

אב הטיפוס של המחבר:

האם אתה אוהב את הפרויקט הזה? יש לך שאלה כלשהי בנוגע לפרויקט זה, אל תהסס להביע בתגובה, ייתכן שתקבל תשובה מהירה.

סרטון וידאו:




קודם: מעגל מחוון ברמת משואות למיכלי גרגרים מקצרים הבא: 3 מעגלי מהפך סינוס טהור SG3525 בהספק גבוה