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

שעון מעורר חכם באמצעות Magicbit (Arduino): 10 שלבים
שעון מעורר חכם באמצעות Magicbit (Arduino): 10 שלבים

וִידֵאוֹ: שעון מעורר חכם באמצעות Magicbit (Arduino): 10 שלבים

וִידֵאוֹ: שעון מעורר חכם באמצעות Magicbit (Arduino): 10 שלבים
וִידֵאוֹ: Lesson 22: Using Seven Segment Display with Arduino and Electronic Dice | SunFounder Robojax 2024, נוֹבֶמבֶּר
Anonim
Image
Image

הדרכה זו מראה כיצד לייצר שעון מעורר חכם באמצעות תצוגת OLED בלוח ה- dev של Magicbit ללא שימוש במודול RTC.

אספקה

  • מג'יקביט
  • כבל USB-A למיקרו USB

שלב 1: סיפור

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

שלב 2: הגדרת חומרה

חבר את ה- Magicbit למחשב באמצעות כבל USB.

שלב 3: הגדרת תוכנה

פתח את Arduino IDE והגדר את הלוח עם Arduino IDE. הקישור הבא מתייחס כיצד לעשות זאת. אז אנו ממליצים לך קודם כל להיכנס לקישור ולהכיר את Magic bit.

magicbit-arduino.readthedocs.io/en/latest/…

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

שלב 4: תיאוריה ומתודולוגיה

אם אתה מסתכל על הסרטון הראשון, אתה יכול לראות שהתצוגה כוללת 2 מסכים.

  • מסך שעון המציג פירוט זמן
  • מסך אזעקה המציג פרטי אזעקה

למעבר בין שני המסכים השתמשנו בכל כפתור לחיצה של שניים ב- Magicbit. כפתורים אלה מחוברים ל -35 (כפתור שמאלי) ול -34 (כפתור ימני) של ה- ESP32 ב- Magicbit. כדי להציג את הזמן ופרטים אחרים השתמשנו בתצוגת OLED מובנית ב- magicbit.

בואו נדבר על איך המסכים הגרפיים האלה עובדים.

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

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

  • זווית יד דקה = דקות*(360/60)
  • זווית שעות יד = שעות*(360/12)

הזווית הנמדדת ביחס לקו בין מרכז שעון המספר למספר 12. בפונקציית השעון. בעזרת פונקציות sin ו- cos נוכל לחשב את הקואורדינטות x ו- y של קצות השורות והדקות. התמונה למטה מתארת את מהלך המצב.

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

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

שלב 5: קבלת הזמן המקומי

החלק החשוב ביותר בשעון הוא האופן בו אנו מקבלים את הזמן המקומי בצורה מדויקת. לשם כך תוכל להשתמש במודול שעון RTC חיצוני או בשעון RC מובנה ב- ESP32 ב- Magicbit. בפרויקט זה השתמשנו בשיטה השנייה. בשיטה זו אנו משתמשים בלקוח NTP (רשת זמן פרוטוקול) עבור מקבל את הזמן המקומי מהאינטרנט. לגישה לאינטרנט השתמשנו במתקן WIFI מובנה ב- ESP32. לכן בשלב הראשון אנו משתמשים ב- WIFI לגישה לאינטרנט על ידי מתן SSID וסיסמה. לאחר מכן עלינו להגדיר את gmtOffset ו- daylightOffset במשתנים תוך שניות. הערכים של משתנים אלה שונים מאזור לאזור בעולם. פירושו gmtOffset הוא מספר השניות בהן אתה שונה מה- GMT..במרבית הימים aresoffset הוא 3600. אתה יכול למצוא אותו באינטרנט. לאחר שקיבלנו את הזמן המקומי הנוכחי כבר לא השתמשנו ב- WIFI. כי אז אנו מחשבים זמן מקומי משעון RC מובנה ב- ESP32. זה נעשה באמצעות ספריית time.h. יש דוגמה פשוטה ב- Arduino (Arduino> דוגמאות> ESP32> Time> simpletime) שתוכל ללמוד כיצד זה עובד הלאה. כמו כן, תוכל להשתמש בקישורים אלה לידע נוסף אודות לקוח NTP.

  • https://dronebotworkshop.com/esp32-intro/
  • https://lastminuteengineers.com/esp32-ntp-server-d…

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

שלב 6: הגדרת האזעקה

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

שלב 7: הגדרת הבאזר

אנו משתמשים בדופק PWM ליצירת צליל הבאזר באמצעות הפונקציה analogCwrite () בקוד. מכיוון שכל פונקציות הספרייה נמצאות ב- ESP32 תקף ל- Magicbit. אתה יכול לשנות את צליל הביפ של הזמזם משינוי תדירותו וערך PWM שלו בקוד.

techtutorialsx.com/2017/06/15/esp32-arduin…

דף זה מתאר כיצד אופן הפעולה של זמזם עם ESP32.

שלב 8: הגדרת לחצנים

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

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

שלב 9: פתרון בעיות

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

  • וודא שנתת את ה- SSID והסיסמה הנכונים
  • שנה את שרת NTP (אתה יכול למצוא שרתים רבים מהאינטרנט המתייחסים לאזור שלך).
  • משנה את חיבור האינטרנט. (אפשר גם נקודה חמה ניידת).

כמו כן, תוכל לפתור הכל באמצעות הצג הטורי. בנוסף לתצוגת OLED הצג הטורי מציג מידע על הזמן.

שלב 10: קוד ארדואינו

// ספריות לתצוגת OLED

#לִכלוֹל

#include #include #define OLED_RESET 4 #include // wifi library for connect #include "time.h" // ספרייה לשימוש בשעון RC // הגדר שמות סיכות קלט ופלט #הגדר כפתור ימני 34 #הגדר כפתור שמאלי 35 #הגדר GreenLED 16 #define Buzzer 25 int preTime = 0; int counts = 0; int currentTime = 0; struct tm timeinfo; const char* ssid = "SSID שלך"; // פרטי wifi const char* password = "סיסמתך"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // משתני אזעקה int dateIndex = 0; int timeIndex = 0; int selectIndex = -1; buzzerOn = 0; int rect [6] [4] = {{5, 0, 118, 16}, {1, 22, 30, 22}, {37, 22, 30, 22}, {73, 22, 55, 22}, {31, 44, 30, 20}, {67, 44, 30, 20}}; // מלבן בחירה const char* ntpServer = "asia.pool.ntp.org"; // שרת detais const long gmtOffset_sec = 19800; const int daylightOffset_sec = 0; תצוגת Adafruit_SSD1306 (128, 64); // גודל OLED להגדיר בתים clockCenterY = (display.height () + 16)/2; // פרטי פנים של שעון אנלוגי byte clockCenterX = (display.height () - 16)/2; בייט clockRadius = 23; מצב bool = 0; // מסך מופעל או כבוי אזעקה בוליאנית = 0; // מצב אזעקה הנוכחי String alarmState = "אזעקה מופעלת"; // אזעקה מופעלת או כבויה // משתנים נתונים מאוחסנים בזמן char dayName [10]; מספר יום צ'אר [3]; חודש צ'ארה [10]; שנת חרלה [5]; שעות צ'ארלה [3]; דקות צ'ארלה [3]; מספר החודש char [3]; צ'ארס שניות [3]; // משתני כפתורים bool RightState = 1; bool LeftState = 1; // משתני זמזם int channel = 0; int תדר = 2000; int PWM = 200; רזולוציית int = 8; הגדרת void () {// set input ו- ouputs pinMode (RightButton, INPUT); pinMode (כפתור שמאלי, INPUT); pinMode (GreenLED, OUTPUT); pinMode (באזר, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // לאתחל תצוגת display.display (); עיכוב (3000); display.clearDisplay (); ledcSetup (0, תדר, רזולוציה); // להגדיר פרמטרים של pwm ledcAttachPin (Buzzer, 0); Serial.begin (115200); // להסתיר תקשורת טורית // להתחבר ל- WiFi Serial.printf ("מתחבר ל- %s", ssid); WiFi.begin (ssid, סיסמא); בעוד (WiFi.status ()! = WL_CONNECTED) {עיכוב (500); Serial.print ("."); } Serial.println ("מחובר"); // init וקבל את הזמן configTime (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // נתק את ה- WiFi מכיוון שכבר אין בו צורך ב- WiFi.disconnect (נכון); WiFi.mode (WIFI_OFF); display.clearDisplay (); } לולאת void () {getTime (); // קבל את השעה הנוכחית // אחסן את הלחצן הימני והשמאלי של לחצן RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // צא לחצו על הלחצנים אם (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // כאשר נלחץ על הכפתור, זמזם פולט עיכוב צליל ביפ (100); אם (מצב == 0) {// שנה למצב מסגרת אזעקה = 1; // שנה מצב למצב אזעקה RightState = LeftState = 1; // אנחנו צריכים רק שינוי sceern} counts = 0; // reset reset} if (state == 1 && (ספירות) <5) {// אם במסך אזעקה וללא פסק זמן calculateAlarm (); // לחשב ערכי זמן של אזעקת informaton showAlarm (); // הצג ערכים} אחר {// אם בשעון מצב מסך = 0; display.clearDisplay (); clockFace (); // השעון האנלוגי printLocalTime (); // הדפס זמן בשעון והדפס פרטים אחרים} onAlarm (); // השווה את זמן ההתראה עם השעה המקומית והפעל את עיכוב האזעקה (100); // עיכוב עבור אזעקה מופעלת וכיבוי} void clockFace () {// caalog display face face.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // הדפס מעגל שעון עבור (int digit = 0; digit = 5) {// יש רק 5 selctions.so אפס ל- -1 (-1 = הוא alarn מופעל או כבוי) selectIndex = -1; } dateAndTimeSelection (selectIndex); // change selection} void dateAndTimeSelection (int index) {if (index == -1) {// אזעקה מופעלת או מושבתת אם (RightState == 0) {// מעבר בין אזעקה מופעלת וכיבוי אם (alarmState == "אזעקה מופעלת") {alarmState = "אזעקה כבויה"; } אחר {alarmState = "אזעקה מופעלת"; }}}} אחר {אם (RightState == 0) {// במגוון בחירות אחרות תאריך השעה או השעה במערך alarmDateTime [index] = alarmDateTime [index] + 1; // אינדקס הוא הבחירה}} int השווה [4] = {12, 2030, 23, 59}; // גבולות עליונים של התאריכים והשנים int השוואה [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // הגבול העליון של החודשים int resetValue [4] = {1, 2020, 0, 0}; // ערכי התחלה עבור (int i = 1; אני משווה [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> comparemonth [alarmDateTime [1] - 1]) {// אפס vlaues אם החודשים גדולים מהגבולות שלהם alarmDateTime [0] = 1; }} void showAlarm () {// הדפסת פרטי אזעקה String alarmDateTime0 = String (alarmDateTime [0]); // המרת עוקצים להצגת String alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = String (alarmDateTime [2]); String alarmDateTime3 = String (alarmDateTime [3]); String alarmDateTime4 = String (alarmDateTime [4]); // אם לערכים יש ספרה אחת אחת הוסף להם "0". אם (alarmDateTime [0]

מוּמלָץ: