יום שלישי, 17 ביוני 2025

שעון מעורר רטט עם M5 stick c Plus

 מבוא

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

מטרות הפרויקט

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



רכיבים נדרשים

חומרה עיקרית

  • M5StickC Plus - מכשיר פיתוח ESP32 עם מסך LCD 1.14" צבעוני
  • כבל USB-C לטעינה ותכנות
  • מנוע רטט או זמזם (אופציונלי) - לחיבור לפין GPIO 26

רכיבים אופציונליים לשדרוג

  • זמזם פיאזו או רמקול קטן להתרעה קולית
  • מודול Grove לחיבור קל של חיישנים נוספים
  • מארז הגנה למכשיר

שלב 1: התקנת Arduino IDE והגדרה ראשונית 

הבנת NTP ואזורי זמן

מה זה NTP?

NTP (Network Time Protocol) הוא פרוטוקול לסנכרון זמן מדויק ברשתות מחשבים. השרתים מספקים זמן מדויק המבוסס על שעונים אטומיים.

אזורי זמן בישראל

ישראל משתמשת בשני אזורי זמן:

  • שעון חורף: UTC+2 (7200 שניות)
  • שעון קיץ: UTC+3 (10800 שניות)

בקוד שלנו הגדרנו:

שרת NTP ישראלי

זהו שרת NTP ישראלי המספק זמן מדויק ומהיר לאזור שלנו.

הבנת הקוד - חלקים מרכזיים

1. הגדרות גלובליות ומשתנים

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

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

לגבי משתני שעון המעורר: alarmEnabled הוא משתנה בוליאני (true/false) שאומר לתוכנה אם ההתרעה מופעלת או לא. alarmHour ו-alarmMinute שומרים את הזמן המדויק שבו אנחנו רוצים שההתרעה תצלצל. לבסוף, alarmTriggered עוזר לתוכנה לזכור אם ההתרעה כבר התחילה לצלצל, כך שהיא לא תתחיל מחדש כל שנייה.

2. פונקציית timeToDo() - טיימר ללא blocking

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

במקום זאת, הפונקציה timeToDo() עובדת כמו שעון עצר חכם. בכל פעם שהיא נקראת, היא מוסיפה 1 למונה (tcount++). כשהמונה מגיע למספר שהגדרנו (tbase), היא מחזירה true ומאפסת את המונה. אחרת, היא מחזירה false.

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

3. סנכרון זמן מ-NTP

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

שלב ראשון - התחברות לאינטרנט: המכשיר מתחבר לרשת WiFi באמצעות הפרטים שהגדרנו. הוא ממתין עד שהחיבור מצליח (זה יכול לקחת כמה שניות). במהלך הזמן הזה תראו על המסך "connecting WiFi".

שלב שני - בקשת זמן מהשרת: ברגע שיש חיבור אינטרנט, המכשיר פונה לשרת NTP בישראל ומבקש את הזמן המדויק. זה כמו לשאול "מה השעה עכשיו?" לשעון עולמי מדויק ביותר.

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

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

4. בדיקת והפעלת התרעה

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

תנאי ראשון - האם ההתרעה מופעלת: הפונקציה בודקת אם alarmEnabled הוא true. אם ההתרעה כבויה, אין סיבה לבדוק כלום.

תנאי שני - האם ההתרעה כבר צילצלה: היא בודקת שההתרעה לא צילצלה כבר (!alarmTriggered). זה מונע מההתרעה להתחיל מחדש כל שנייה.

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

הטריק החכם כאן הוא התנאי RTC_TimeStruct.Seconds < 5. במקום לבדוק רק שנייה 0 (שיכולה להחמיץ אם התוכנה עסוקה באותו רגע), אנחנו בודקים את 5 השניות הראשונות של הדקה. זה נותן לנו "חלון זמן" גדול יותר לתפוס את ההתרעה, כך שהיא בוודאי לא תחמיץ.

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

5. חישוב אחוז סוללה

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

כל סוללת ליתיום (הסוג שיש במכשיר שלנו) מתנהגת בצורה צפויה: כשהיא מלאה, המתח שלה הוא בערך 4.2 וולט. כשהיא מתרוקנת, המתח יורד בהדרגה עד לבערך 3.0 וולט. זה כמו מדד דלק במכונית - יש לנו טווח ידוע של ערכים.

הפונקציה לוקחת את המתח הנוכחי ומשווה אותו לטבלה שיצרנו. למשל, אם המתח הוא 4.1 וולט או יותר, אנחנו יודעים שהסוללה כמעט מלאה (100%). אם המתח הוא 3.8 וולט, זה אומר שנשארו בערך 50% מהסוללה.

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

תפעול הפונקציות

הפעלה ראשונית

  1. הדלקת המכשיר: לחץ על כפתור ההפעלה הראשי
  2. סנכרון אוטומטי: המכשיר יתחבר אוטומטית לרשת WiFi ויסנכרן את הזמן
  3. תצוגת זמן: לאחר הסנכרון יוצג הזמן הנוכחי והתאריך

הגדרת שעון מעורר

  1. כניסה להגדרות: החזק את כפתור B למשך 1.5 שניות
  2. שינוי שעה: לחץ על כפתור A להעלאת השעות
  3. שינוי דקות: לחץ על כפתור B להעלאת הדקות
  4. הפעלת/כיבוי התרעה: החזק את שני הכפתורים יחד
  5. יציאה: המתן 5 שניות או החזק שני כפתורים להשמת הגדרות


כאשר מצלצלת ההתרעה

  • הפסקת התרעה: לחץ על כפתור A
  • התרעה אוטומטית: ההתרעה נפסקת אוטומטית לאחר 30 שניות


קריאת מידע על המסך

  • שורה עליונה: השעה הנוכחית (HH:MM:SS)
  • שורה שנייה: התאריך (DD/MM/YYYY)
  • שורה שלישית: הגדרות התרעה (Alarm: HH:MM [ON/OFF])
  • שורה תחתונה: מצב סוללה באחוזים ומתח

חיבור רכיבים חיצוניים

חיבור מנוע רטט (פין 26)



פתרון בעיות נפוצות

המכשיר לא מתחבר לרשת WiFi

  • בדוק את פרטי הרשת (שם משתמש וסיסמה)
  • וודא שהרשת זמינה ויציבה
  • נסה לאפס את המכשיר ולהריץ שוב

השעה לא מדויקת

  • בדוק את הגדרת אזור הזמן (timeZone)
  • וודא חיבור אינטרנט יציב בזמן הסנכרון
  • נסה שרת NTP אחר

ההתרעה לא עובדת

  • וודא שההתרעה מופעלת ([ON] במסך)
  • בדוק שהזמן המוגדר נכון
  • נסה להגדיר התרעה כמה דקות קדימה לבדיקה

מסך כהה או לא מגיב

  • טען את המכשיר (ייתכן שהסוללה ריקה)
  • אפס את המכשיר על ידי לחיצה על כפתור Reset

בעיות קומפילציה

  • וודא שכל הספריות מותקנות
  • בדוק את בחירת הבורד ב-Arduino IDE
  • נסה לעדכן את ספריית M5StickCPlus

שדרוגים אפשריים

שדרוגים אפשריים של התוכנה

  • מספר התרעות: הוספת מערך של התרעות יומיות
  • התרעות יום בשבוע: התרעה רק בימי חול/סוף שבוע
  • סנוז: תכונת "עוד 5 דקות"
  • בהירות אדפטיבית: התאמת בהירות לפי חיישן אור
  • מצבי צריכת חשמל: מצב שינה לחיסכון בסוללה

שדרוגים אפשריים בחומרה

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

קוד מלא מוכן לשימוש

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


וזה הקוד המלא, כולל הכל: 




סיכום

פרויקט זה מדגים יכולות מתקדמות של ESP32 ו-M5StickC Plus, כולל:

  • עבודה עם פרוטוקולי רשת (WiFi, NTP)
  • ניהול זמן אמת (RTC)
  • ממשק משתמש עם מסך LCD וכפתורים
  • שליטה ב-GPIO לרכיבים חיצוניים
  • ניהול צריכת חשמל וסוללה

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

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




אין תגובות:

הוסף רשומת תגובה

הערות? הארות? יש לך משהו חשוב לספר לכולם? שאלות?

נשמח לשמוע!

(התגובה תפורסם בהקדם בכפוף לאישור מערכת מייקינג)