ESP32 שעון זמן אמת (RTC) באמצעות DS1307 ותצוגת OLED

Esp32 S Wn Zmn Mt Rtc B Mz Wt Ds1307 Wtzwgt Oled



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

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

אז עם זה, נשאר לנו רק הפתרון של שימוש במודול RTC החיצוני. בואו נבדוק את השלבים של התממשקות לוח ESP32 עם מודול DS1307 RTC.







תוכן:

1. מהו מודול RTC DS1307

DS1307 הוא מכשיר בעל הספק נמוך שיכול לעקוב אחר זמן ותאריך במדויק. הוא משתמש בפורמט עשרוני מקודד בינארי (BCD). זה יכול להגיד לך זמן בפורמט מפורט כמו שניות, דקות ואפילו שעות וימים. ניתן גם להדפיס את התאריך בפורמט מלא כמו חודש ושנה. הוא גם יודע מתי זו שנה מעוברת, עד 2100. כדי לתקשר עם DS1307, אתה יכול להשתמש בפרוטוקול I2C.





ל-DS1307 יש סוללה מובנית שיכולה להפעיל אותו במשך כשנה ללא מקור 5V חיצוני. באמצעות גיבוי סוללה זה, הוא יכול לשמור על הזמן גם כאשר המתח הראשי כבוי. יש לו גם 56 בתים של SRAM לאחסון נתונים מסוימים. ה-DS1307 הוא מכשיר שימושי שיש לו יישומים רבים בשילוב עם לוח Arduino או ESP32. לדוגמה, נתונים אלה יכולים להיות מועילים ברישום נתונים, מערכות אזעקה או בקרה תעשייתית. אם אתה צריך שמירת זמן אמינה, ה-DS1307 הוא אופציה מצוינת.





מפרטי מודול RTC DS1307

מודול RTC DS1307 מורכב מ-RTC IC, EEPROM, מתנד קריסטל ומחזיק סוללה לגיבוי.



להלן הפרטים של חלקים אלה:

DS1307 RTC IC : ה-DS1307 RTC IC הוא שבב בעל 8 פינים שעוקב אחר זמן ותאריך באמצעות פרוטוקול I2C. הוא משתמש במעט מאוד חשמל, פחות מ-500nA. זה יכול להציג זמן בשניות, דקות ושעות, ותאריך בימים, חודשים ושנים. זה גם יכול לעבור בין פורמטים של 24 שעות ל-12 שעות.

24C32 EEPROM IC : ה-24C32 EEPROM IC הוא שבב של 32 בתים מבית Atmel המאחסן את ההגדרות, השעה והתאריך. הוא גם משתמש בפרוטוקול I2C.

32.768kHz קריסטל : מתנד הקריסטל 32.768kHz מספק את תדר השעון עבור DS1307 RTC IC.

מחזיק סוללה : מחזיק הסוללה מחזיק סוללת CR2032. זהו תא מטבע ליתיום 3V. הוא מספק כוח רציף ל-DS1307 RTC IC.

אספקת חיישן DS18B20 : אספקת החיישן DS18B20 מאפשרת לך להלחים ולהשתמש בחיישן הטמפרטורה DS18B20. זה לא מולחם מראש. אתה יכול להלחים את החבילה דרך החור ולקבל את הטמפרטורה מהפין DS של המודול.

הרשימה שלהלן נותנת כמה מפרטים מהירים של חיישן DS1307 RTC:

  • מתח הפעלה: 4.5–5.5 וולט, בדרך כלל 5 וולט
  • צריכה נוכחית : פחות מ-1.5 mA
  • דיוק : 0-40 מעלות צלזיוס, תלוי בגביש
  • סוֹלְלָה : CR2032 (מטבע 3 V)
  • זיכרון : 56 בתים של זיכרון RAM לא נדיף
  • מִמְשָׁק : ממשק טורי דו-חוטי (I2C).
  • תְפוּקָה : פין פלט 1 הרץ
  • פלט גל ריבוע ניתן לתכנות : צורך פחות מ-500 nA במצב גיבוי סוללה
  • זיהוי הפסקת חשמל : זיהוי אוטומטי של הפסקת חשמל ומעגלי מתג
  • מעגל חישת כוח : זה יכול לעבור אוטומטית לגיבוי אספקה ​​על מחסור בחשמל
  • פיצוי לשנה מעוברת : תקף עד שנת 2100

Pinout מודול RTC DS1307

למודול יש מספר פינים עם פונקציות שונות.

  • VCC הוא הפין שזקוק למתח DC בין 3.3V ל-5.5V כדי להפעיל את המודול.
  • GND הוא הפין עבור מתח נמוך או הארקה.
  • SDA ו SCL הם הפינים המתקשרים נתונים ואותות שעון דרך אפיק I2C.
  • DS הוא הפין שמודד את הטמפרטורה עם חיישן DS1307 אם יש לך אחד במודול RTC.
  • SQ הוא הפין שיוצר אות גל ריבועי בתדר של 1 הרץ, 4 קילו-הרץ, 8 קילו-הרץ או 32 קילו-הרץ, תלוי איך אתה מתכנת אותו.
  • אחד הוא הסיכה שמשתמשת בסוללת 3V כדי לשמור על זמן מדויק כאשר המתח הראשי כבוי.

2. כיצד לממשק RTC DS1307 ו-OLED Display עם ESP32

כדי לממשק את ESP32 עם DS1307 ו-OLED Display, אתה יכול להשתמש בפיני I2C המובנים של לוח ESP32. גם תצוגת DS1307 וגם תצוגת OLED הם מכשירים מבוססי I2C. לאחר מכן יכול לתקשר באמצעות פרוטוקול העבד הראשי של I2C דרך אפיק I2C.

לפני שנעבור לכיוון ההתממשקות של ESP32 עם DS1307 ותצוגת OLED, תחילה עליך להתקין מספר ספריות נדרשות.

התקנת הספריות הנדרשות

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

להלן שתי הספריות שאתה הולך להזדקק להן:

  • RTClib (על ידי Adafruit) היא ספריית Arduino IDE להגדרה ולקבל זמן מ-RTC. זה גם מספק שיעורים למניפולציה של תאריכים, שעות ומשכי זמן. באמצעות ספרייה זו, תוכל לממשק ולתכנת את מודולי שעון זמן אמת (RTC), כגון DS1307 ו-DS3231.
  • ס SD1306 (של Adafruit) היא ספרייה עבור Arduino, באמצעותה ניתן לממשק ולתכנת את צגי ה-OLED עם Arduino או כל לוח מיקרו-בקר אחר.

כדי להוריד ולהתקין את שתי הספריות הללו ב- Arduino IDE, פתח תחילה את מנהל הספרייה חפש את ספריית RTClib ולחץ להתקין :

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

באופן דומה, חפש את ספריית SSD1306. ספרייה זו נחוצה עבור תצוגת OLED. נְקִישָׁה להתקין להמשיך.

הפעם גם תקבלו את אותה הודעת אישור. הקלק על ה התקן הכל אוֹפְּצִיָה.

כעת שתי הספריות עבור OLED ו-DS1307 מותקנות ומוכנות לשימוש. אבל לפני כן, ראשית, גלה את כתובת ה-I2C עבור תצוגת ה-OLED.

3. מציאת כתובת I2C של תצוגת OLED

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

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

כאן במקרה שלנו לאחר הפעלת קוד הסורק I2C מוצגת כתובת ה-I2C הבאה של מסך ה-OLED במסוף ה- IDE של Arduino.

לרוב, יש סיכוי גבוה שגם אתם תקבלו את אותו הדבר 0x3C כתובת עבור מסך ה-OLED שלך.

4. חיבור מודול OLED ו-RTC DS1307 עם ESP32

1. חבר את פיני SDA ו-SCL של מודול DS1307 וגם של תצוגת OLED לפיני I2C של ESP32. בְּדֶרֶך כְּלַל, אלה הם GPIO 21 ו- GPIO 22 , אבל אתה יכול להקצות כל פינים אחרים גם בקוד במידת הצורך.

2. חבר את ה-VCC וה-GND של DS1307 וגם את צג ה-OLED לפינים של 3.3V ו-GND של ESP32.

3. הכנס סוללת מטבע CR2032 למודול DS1307 כדי לספק כוח גיבוי לשעון בזמן אמת.

4. העלה את הקוד לדוגמה ממדריך זה ללוח ה-ESP32 שלך. שנה את הקוד עבור פלטים מותאמים אישית.

לאחר ההעלאה, שעון יתחיל מהשעה שנקבעה ויציג את השעה על מסך ה-OLED.

5. תרשים מעגל

דיאגרמת המעגלים של ESP32 עם DS1307 היא פשוטה, עם ארבעה חוטים בלבד שצריך לחבר. אתה יכול לקצר את חוטי I2C SDA ו-SCL של שני חיישני ה-OLED וה-DS1307. באופן דומה, כדי להפעיל את שני החיישנים הללו, ניתן להשתמש בפין 3V3 ו-GND של לוח ESP32. אתה יכול גם להפעיל ממקור נפרד במידת הצורך.

הערה : זה בטוח להפעיל את ה-RTC DS1307 מפין 3.3V של ESP32 אם לא חרגה מהמגבלה הנוכחית של ESP32. אבל אם אתה רוצה להיות באתר בטוח, אתה יכול להשתמש במקור מתח נפרד למודול RTC או לנסות את החיישן DS3231 בעל הספק נמוך שטווח הפעולה שלו הוא בין 3.3 ל-5.5 VDC.

התמונה למטה ממחישה את החיבור של ESP32 עם חיישן RTC DS1307.

באופן דומה, אם ברצונך לחבר את מסך ה-OLED כדי להציג את השעה, תוכל להשתמש באותם פיני I2C ובפיני הכוח של לוח ה-ESP32.

6. קוד

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

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
char Week_days [ 7 ] [ 12 ] = { 'יוֹם רִאשׁוֹן' , 'יוֹם שֵׁנִי' , 'יוֹם שְׁלִישִׁי' , 'יום רביעי' , 'יוֹם חֲמִישִׁי' , 'יוֹם שִׁישִׁי' , 'יום שבת' } ;
הגדרה בטלה ( ) {
Serial.begin ( 115200 ) ;
#ifndef ESP8266
בזמן ( ! סידורי ) ;
#endif
אם ( ! DS1307_RTC.begin ( ) ) {
Serial.println ( 'לא הצלחתי למצוא את RTC' ) ;
בזמן ( 1 ) ;
}
DS1307_RTC.adjust ( תאריך שעה ( ו ( __תַאֲרִיך__ ) , פ ( __זְמַן__ ) ) ) ;
}
לולאה ריקה ( ) {
DateTime עכשיו = DS1307_RTC.now ( ) ;
Serial.print ( עכשיו.שנה ( ) , דצמבר ) ;
Serial.print ( '/' ) ;
Serial.print ( עכשיו.חודש ( ) , דצמבר ) ;
Serial.print ( '/' ) ;
Serial.print ( עכשיו.יום ( ) , דצמבר ) ;
Serial.print ( '(' ) ;
Serial.print ( ימי חול [ now.dayOfTheWeek ( ) ] ) ;
Serial.print ( ') ' ) ;
Serial.print ( עכשיו.שעה ( ) , דצמבר ) ;
Serial.print ( ':' ) ;
Serial.print ( עכשיו.דקה ( ) , דצמבר ) ;
Serial.print ( ':' ) ;
Serial.print ( עכשיו.שני ( ) , דצמבר ) ;
Serial.println ( ) ;
לְעַכֵּב ( 1000 ) ;
}

קוד זה משתמש ב- ספריית RTClib להתממשק עם מודול שעון זמן אמת DS1307 שעוקב אחר התאריך והשעה.

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

אתה יכול להשתמש ב לוּלָאָה פונקציה כדי לקבל את התאריך והשעה מ-RTC. לאחר מכן, אתה יכול להציג אותו על הצג הטורי כך: שנה/חודש/יום (יום בשבוע) שעה:דקה:שנייה. זכור להוסיף השהיה של שנייה אחת לאחר כל לולאה, כדי שהקוד לא ירוץ מהר מדי.

הצג זמן נוכחי בצג OLED

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

זכור, כאן אנו משתמשים במודול תצוגת OLED בגודל 0.96 אינץ' 128×64 I2C SSD. אם אתה משתמש בכל גודל אחר, שנה את הקוד בהתאם. כמו כן, בדוק את כתובת I2C ושנה אותה בקוד הנתון. במקרה שלנו, יש לנו כתובת I2C 0x3C עבור מסך ה-OLED.

#include
#include
#include
#include 'RTClib.h'
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

צג Adafruit_SSD1306 ( SCREEN_WIDTH, SCREEN_HEIGHT, & חוט, - 1 ) ;
RTC_DS1307 RTC;
ימי char [ 7 ] [ 12 ] = { 'יוֹם רִאשׁוֹן' , 'יוֹם שֵׁנִי' , 'יוֹם שְׁלִישִׁי' , 'יום רביעי' , 'יוֹם חֲמִישִׁי' , 'יוֹם שִׁישִׁי' , 'יום שבת' } ;
הגדרה בטלה ( ) {
Serial.begin ( 115200 ) ;
אם ( ! RTC.begin ( ) ) {
Serial.println ( 'לא הצלחתי למצוא את RTC' ) ;
בזמן ( 1 ) ;
}
RTC.adjust ( תאריך שעה ( ו ( __תַאֲרִיך__ ) , פ ( __זְמַן__ ) ) ) ;
אם ( ! display.begin ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Serial.println ( ו ( 'הקצאת SSD1306 נכשלה' ) ) ;
ל ( ;; ) ;
}
לְעַכֵּב ( 1000 ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( לבן ) ;
display.setCursor ( 30 , עשרים ) ;
display.println ( 'לינוקס' ) ;
display.display ( ) ;
לְעַכֵּב ( 3000 ) ;
display.clearDisplay ( ) ;
}
לולאה ריקה ( ) {
DateTime now = RTC.now ( ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
display.print ( עכשיו.יום ( ) ) ;
display.print ( '/' ) ;
display.print ( עכשיו.חודש ( ) ) ;
display.print ( '/' ) ;
display.print ( עכשיו.שנה ( ) ) ;
display.println ( ימים [ now.dayOfTheWeek ( ) ] ) ;
display.println ( '' ) ;
display.setCursor ( 0 , 40 ) ;
אם ( עכשיו.שעה ( ) < 10 )
display.print ( '0' ) ;
display.print ( עכשיו.שעה ( ) ) ;
display.print ( ':' ) ;
אם ( עכשיו.דקה ( ) < 10 )
display.print ( '0' ) ;
display.print ( עכשיו.דקה ( ) ) ;
display.print ( ':' ) ;
אם ( עכשיו.שני ( ) < 10 )
display.print ( '0' ) ;
display.println ( עכשיו.שני ( ) ) ;
display.display ( ) ;
}

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

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

ה לוּלָאָה הפונקציה מקבלת את התאריך והשעה של מודול DS1307. לאחר מכן, הוא מנקה את התצוגה ומדפיס את התאריך והשעה בצורה מעוצבת. הקוד מוסיף גם אפסים מובילים לשעות, לדקות ולשניות, במקרה שהערכים שלהם קטנים מ-10.

7. חומרה

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

סיכום

ל-RTC DS1307 יש SRAM של 56 בתים עם תמיכה בגיבוי סוללה. זהו מכשיר בעל 8 פינים המשתמש בפרוטוקול תקשורת I2C. כדי לממשק את מודול DS1307 RTC עם ה-ESP32, אתה יכול להשתמש בפינים I2C (GPIO 22 (SCL) ו-GPIO 21 (SDA)) של לוח ESP32. אתה יכול להדפיס את השעה על קונסולת Arduino IDE או להשתמש בכל מסך כמו OLED או I2C LCD כדי להציג את השעה. מודול DS1307 RTC הוא מכשיר שימושי למעקב אחר זמן ותאריך ביישומים שונים. חלק מהיישומים העיקריים כוללים אוגרי נתונים, שעונים דיגיטליים ושעונים חכמים.