תוכן עניינים:

NODEMCU Lua ESP8266 עם שעון בזמן אמת (RTC) ו- EEPROM: 7 שלבים
NODEMCU Lua ESP8266 עם שעון בזמן אמת (RTC) ו- EEPROM: 7 שלבים

וִידֵאוֹ: NODEMCU Lua ESP8266 עם שעון בזמן אמת (RTC) ו- EEPROM: 7 שלבים

וִידֵאוֹ: NODEMCU Lua ESP8266 עם שעון בזמן אמת (RTC) ו- EEPROM: 7 שלבים
וִידֵאוֹ: FLProg9: RTC Alarm Clock | ESP32 NodeMCU | Arduino Visual Embedded Programming 2024, נוֹבֶמבֶּר
Anonim
NODEMCU Lua ESP8266 עם שעון בזמן אמת (RTC) & EEPROM
NODEMCU Lua ESP8266 עם שעון בזמן אמת (RTC) & EEPROM

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

אתה יכול לשאול מדוע לא להשתמש ב- ESP8266 כדי לשמור על הזמן עבורך? אתה יכול, יש לו RTC פנימי משלו (שעון בזמן אמת), אך ל- ESP8266 יש 3 תדרי שעון הפעלה שונים - 52 מגהרץ כאשר הוא מופעל, 80 מגהרץ במהלך פעולה רגילה ו -160 מגהרץ אם הוא מוגבר. אם אתה צריך שמירת זמן מדויקת יותר, במיוחד לאורך תקופות ארוכות יותר, אז RTC חיצוני עשוי לספק פתרון. במודולים אלה יש גם גיבוי סוללה במקרה של אובדן חשמל. RTC אינו מדויק במיוחד מכיוון שהוא סופר את הזמן שחלף מאז שהוא נקבע ולמרות שהוא עשוי לעשות את זה ברוב היישומים, יתכן שהוא לא מספיק טוב לשמירה על זמן קריטי. ניתן לקבל את השעה המדויקת משרת זמן SNTP שממנו ניתן לעדכן את ה- RTC במרווחי זמן קבועים במידת הצורך.

מודול ה- DS1307 Tiny RTC I2C (למעלה) הוא דוגמה לפריטים אלה וניתן לרכוש אותו ב- eBay וספקים אחרים בפחות מ -2 ליש ט. יש גם אחרים כמו DS1302 ו- DS3231 שעובדים בצורה דומה ועולים מ- 99p ומעלה.

מודול DS1307 משתמש בממשק I2C ועל ESP-01 צריך להיות מחובר כ:

Vcc - 3.3v, Gnd - Gnd, SDA - D3, SCL - D4

ניתן לחבר SDA ו- SCL לכל אחד מסיכות הקלט/פלט ב- ESP8266 הגדולים יותר (שנה את הקוד בהתאם). רק את הסיכות בצד שמאל צריך להיות מחובר במודול זה.

שלב 1: זמן Google

Google Time
Google Time

ישנן דוגמאות רבות לקבלת הזמן מגוגל ולהיראות כך. כאשר אתה מפעיל את תוכנית GoogleTime.lua אתה מקבל תוצאה כזו:

dofile ("GoogleTime.lua")> שעה: יום שישי, 15 בדצמבר 2017 11:19:45 GMT

הבעיה בשיטה זו היא שאתה מקבל את הזמן בפורמט מחרוזת ואתה צריך לפצל את המחרוזת לביטים האישיים שלה במשך שעות, דקות, שניות וכו 'ה- RTC מקבל את הזמן בפורמט מיוחד כלומר חותמת זמן UNIX. במונחים של הדיוט זהו מספר השניות שחלפו מאז יום חמישי הראשון בינואר 1970 ועד היום והשעה הנוכחית. תקופת UNIX (1970/01/01 00:00:00) משמשת את רוב מערכות ההפעלה הממוחשבות והזמן שחלף מאוחסן כמספר 32 סיביות חתום. המשמעות היא שמערכת זו תעבוד עד ה -19 בינואר 2038 כאשר המספר יהפוך להיות גדול מכדי לאחסן אותו כך. פתרון אחד הוא לאחסן את המספר כ- 64 סיביות, אך לעת עתה שיטת 32 הסיביות תספיק.

כדי להגדיר את השעה ל- 9 ביולי 2015, 18:29:49 ב- RTC הפנימי, היית משתמש בשורת קוד זו:

rtctime.set (1436430589, 0)

2 הפרמטרים הם שניות ומיקרו שניות.

תוכל למצוא מידע נוסף בקריאת תיעוד NodeMCU.

שלב 2: שרתי זמן SNTP

שרתי זמן SNTP
שרתי זמן SNTP

פרוטוקול זמן רשת פשוט (SNTP) מסופק ממקורות רבים באינטרנט, ולמדינות רבות ברחבי העולם יש שירות זה.

התוכנית, SNTPTime2.lua קובעת את השעה ב- RTC הפנימי. אתה צריך שיהיה לך את המודולים rtctime & sntp בבנייתך כאשר אתה מהבהב ב- ESP8266. התוכנית מקבלת את הזמן מהשרת תוך שניות ומיקרו שניות ומגדירה את ה- RTC הפנימי עם rtctime.set (sec, usec).

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

ישנם שרתי SNTP רבים ברחבי העולם וחלקם כדלקמן:

  • sntp.sync ({"216.239.35.0"},
  • sntp.sync ({"0.uk.pool.ntp.org", "0.uk.pool.ntp.org"},
  • sntp.sync ({"3.uk.pool.ntp.org", "143.210.16.201"},
  • sntp.sync ({"0.uk.pool.ntp.org", "1.uk.pool.ntp.org", "3.uk.pool.ntp.org"},

ניתן להחליף את כל שורות הקוד שלעיל לתוכנית SNTPTime2.lua.

ישנם יותר שרתי SNTP בכתובות למטה שאפשר להשתמש בהם שוב בתוכנית.

93.170.62.252, 130.88.202.49, 79.135.97.79, ntp.exnet.com

Google מספקת גם שרתי זמן בכתובות הבאות:

216.239.35.0, 216.239.35.4, 216.239.35.8, 216.239.35.12

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

שלב 3: קבלת הזמן ממודול RTC

קבלת הזמן ממודול RTC
קבלת הזמן ממודול RTC

התוכנית GetRTCTime.lua קוראת את הזמן מתוך ה- RTC הפנימי.

החלק הראשון קורא את הזמן ומציג אותו תוך שניות ומיקרו שניות.

החלק השני הופך אותו לפורמט קריא יותר של בני אדם.

כאשר מתקשרים ל tm = rtctime.epoch2cal (rtctime.get ()) הוא מחזיר:

  • שנה - 1970 ~ 2038
  • שני - חודש 1 ~ 12 בשנה הנוכחית
  • יום - יום 1 ~ 31 בחודש הנוכחי
  • שָׁעָה
  • דקות
  • שניות
  • יום - יום 1 ~ 366 בשנה הנוכחית
  • wday - יום 1 ~ 7 בשבוע הנוכחי (יום ראשון הוא 1)

ניתן לגשת לכל פריט בתור tm ["day"], tm ["year"]…

תוכל למצוא מידע נוסף בקריאת תיעוד NodeMCU.

DisplaySNTPtime.lua היא דרך משוכללת יותר להציג את התאריך והשעה על מסך LCD בגודל 128 x 64 OLED, מכיוון שהוא ניתן לחיבור בקלות וניתן להשתמש בו עם תוכניות אלה.

שלב 4: זיכרון משתמש RTC

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

כללתי את RTCmem.lua, תוכנית פשוטה שמדגימה את השימוש בה. אתה צריך שיהיה לך מודול rtcmem במבנה שלך.

שלב 5: מודולי RTC חיצוניים

מודולי RTC חיצוניים
מודולי RTC חיצוניים

מודולי ה- RTC החיצוניים מתחברים ל- ESP8266 דרך ממשק I2C, שמשתמש רק בשני פיני קלט/פלט ולכן עובד עם ESP-01 כמו גם עם רוב שאר ESP8266 התקנים.

כתובת מודול RTC היא 0x68 ונגישות אליה באמצעות הפקודות הרגילות של I2C. עם זאת, יש לזכור, הנתונים ברשומות ה- RTC מאוחסנים בפורמט BCD (בסיס 16), כך שהתוכניות שלך צריכות להתמודד עם זה. השעה והתאריך מאוחסנים ב -7 רישומים בתוך ה- RTC. ב- RTC הפנימי, ההמרות BCD מטופלות על ידי מודול rtctime.

SetExtRTC.lua ממיר את הנתונים ל- BCD וקובע את השעה.

ReadExtRTC.lua קורא את נתוני הזמן ומדפיס אותם. הערה: הנתונים מודפסים בהקסדצימלי.

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

שלב 6: רישום נתונים

רישום נתונים
רישום נתונים

אם תסתכל מקרוב על המודולים של RTC, תבחין כי יש בהם AT24C32 EEPROM IC או דומה מובנה, או שאתה יכול להשתמש בלוח 24C256 כפי שמופיע למעלה. לרוב IC אלה של EEPROM יש סיכות סיכה דומות כמפורט לעיל. הם מגיעים עם כמויות אחסון שונות, אך לכולם ניתן לגשת באותו אופן. מכיוון שה- AT24C32 כבר מולחם על הלוח, ניתן להשתמש בו ישירות מה- I2C של ה- RTC החיצוני.

אם יש לך רק IC 24C256 או דומה, תוכל להגדיר אותו בלוח לחם, לחבר את A1, A2 ו- A3 ל- Gnd, Vcc ל- 3.3V ו- SDA ו- SCL ל- I2C, ניתן להשאיר את WP צף. חלק ממעגלי ה- EEPROM פועלים רק על 5V, לכן בדוק קודם את דף הנתונים הרלוונטי.

ByteWR.lua כותב 1 בייט של נתונים למיקום הזיכרון 0x00 של ה- EEPROM וקורא אותו בחזרה.

Desiderata.lua כותב כמה שורות מטקסט מפורסם ל- EEPROM.

eeRead.lua קורא נתונים מה- EEPROM ומדפיס אותם.

הערה: תוכניות אלה צריכות לפעול גם עם לוחות EEPROM אחרים.

שלב 7: סיכום

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

מוּמלָץ: