תוכן עניינים:
2025 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2025-01-13 06:57
ע י Boomer48 עקוב אחר מאת המחבר:
אני אוהב מיקרו -בקרי PIC ואני אוהב לתכנת בשפת הרכבה. למעשה, במהלך השנים האחרונות פרסמתי כ- 40 פרויקטים באתר שלי המבוססים על שילוב זה. לאחרונה הזמנתי כמה חלקים מאחד הספקים האהובים עלי בארה ב וראיתי ארדואינו ננו, עם כבל תכנות, במחיר של 1.20 $ בלבד יותר משבב מעבד ATMEGA328 חשוף. אז קניתי כמה מהם. לאחר מכן הורדתי את ה- Arduino IDE וניקיתי את זיכרוני מתכנת 'C ++'.
פרויקט זה הוא מיזוג של שעון המשתמש ב- GPS לתזמון ומקלט RF שמפענח הודעות מזג אוויר מחיישן AcuRite נפוץ. התוצאה היא תצוגת זמן וטמפרטורה בקנה מידה קטן. שעון ה- GPS ושגרת מזג האוויר מוגדרים כקבצים נפרדים, כך שקל להיכנס לשגרה הראשית ולהגדיר אותו כך שיעשה רק את פונקציית השעון או רק את פונקציית מזג האוויר. פשוט בטל את התגובה "#define" המתאים בראש השגרה הראשית אם אתה רוצה רק אחת מהפונקציות.
אם משתמשים בשתי הפונקציות, השורה העליונה של ה- LCD מציגה את השעה המקומית והשורה התחתונה של ה- LCD מציגה את הלחות והטמפרטורה הן בצלזיוס והן בפרנהייט. אם משתמשים רק בפונקציית השעון, השורה העליונה מציגה זמן מקומי והשורה התחתונה מציגה UTC. אם משתמשים רק בפונקציית מזג האוויר, השורה העליונה מציגה את החיישן הראשון שהתקבל והשורה התחתונה מציגה כל חיישן אחר שהתקבל. הוספתי את היכולת הזו כי יש לי שני חיישני מזג אוויר.
שלב 1: חיישן מזג אוויר
חיישן מזג האוויר AcuRite המשמש כאן שולח מידע על טמפרטורה ולחות כל 16 שניות. מאחור הוא מראה מספר דגם של 000592TXR אך הוא מפורסם בדרך כלל כדגם 06002M. חיישן זה משמש הרבה דגמי תחנות מזג אוויר שונים, כך שקל למצוא אותו והצלחתי להשיג אותם ב- eBay בפחות מ -20 $. AcuRite מוכרת חיישנים דומים למראה חלק מתחנות מזג האוויר שלהם, אך הם עשויים לציית לאותו פרוטוקול תקשורת אם לאו. יש אינדיקציה מסוימת לכך שחיישן 00606 הטמפרטורה בלבד משתמש באותה פורמט הודעה אך עם בת לחות לא חוקי.
כפי שניתן לראות בצורת הגל הראשונה המוצגת לעיל, הודעות מזג האוויר נשלחות בהתפרצויות עם פער של 2 אלפיות השנייה בין הודעות רצופות. צורת הגל השנייה המוצגת למעלה מרחיבה חלק מהודעה אחת על מנת לראות את משך הסיביות והדפוסים. ישנם ארבעה סיביות סינכרון שגובהן כ- 600us ואחריו הנמוך של 600us. נתוני הנתונים מיוצגים בגובה 400us ואחריו 200us נמוך (1) או 200us גבוה ואחריו 400us נמוך (0).
פורמט ההודעה כולל 7 בתים של נתונים. שני הבייטים הראשונים הם מזהה החיישן ואלה אינם משתנים (כלומר: הוא אינו משתמש בקוד מתגלגל). הבייט האחרון הוא סכום בדיקה תוסף פשוט של ששת הבייטים הראשונים. הבייט השלישי הוא מחוון רמת הסוללה ותמיד צריך להיות 44 הקס אם הסוללה טובה. הבייט הרביעי הוא הלחות וזה ערך לא מדורג בין 0 ל- 99. חשוב לזכור שהסיבית המשמעותית ביותר של בתים 4, 5 ו -6 היא ביט זוגיות ואינה חלק מהמדידה. ערכים. בתים 5 ו -6 הם הטמפרטורה המוקדמת (צלזיוס) כאשר 4 הסיביות התחתונות של בית 5 מחוברות עם 7 הביטים התחתונים של בית 6 ליצירת ערך של 11 סיביות. הטמפרטורה תמיד מיוצגת כמספר חיובי והיא הופכת שלילית רק כאשר החלת קנה המידה מיושמת. קנה המידה הוא (C / 10) - 100. החלוקה ב- 10 נדרשת מכיוון שרזולוציית הטמפרטורה היא בעשיריות מעלות. החיסור נדרש מכיוון שהחיישן מוסיף 100 על מנת לשמור על הערך המועבר חיובי.
שלב 2: מקלט RF
מודול ה- RF בו אני משתמש לפרויקט זה הוא RXB6. זהו מקלט סופר הטרודיני בניגוד למקלטים הסופר -רגנרטיביים הפחות רצויים. אם תסתכל על מודולי ה- RF הזולים בחוץ, תמצא שלוחות המשדרים והמקלט משולבים לעתים קרובות יחד. רוב אותם מקלטים מצורפים הם סוגים של התחדשות סופר ולכן הם נוטים להיות בעלי מאפייני ביצועים נמוכים בהרבה (כולל טווח) מאשר מקלטי סופר הטרודין. אנו זקוקים רק למודול המקלט לפרויקט זה מכיוון שנקבל אותות ממשדר חיישן מזג אוויר.
שלב 3: אנטנות RF
ה- RXB6 אינו מגיע עם אנטנה. אתה יכול לקנות כמה סלילים די בזול אבל גם קל לייצר אנטנה משלך. למעשה, ניתן להחליק כבל מגשר קרש ללוח על סיכת האנטנה של המודול אם אינך רוצה להיות מפואר מדי. באופן אידיאלי, אנטנת חוט ישר תהיה באורך גל 1/4 אשר מסתכם בכ -6.8 אינץ '. בתחילה עשיתי את דבר החוט המגשר ולא הייתה לי בעיה לאסוף את החיישן החיצוני שלי למרות שסדנת האלקטרוניקה שלי נמצאת במרתף שלי.
אפשרות נוספת היא לייצר אנטנה סלילית משלכם. יש מגוון תוכניות לכך באינטרנט אך זו המוצגת בתמונה למעלה היא מה שהכנתי. השתמשתי בחוט ליבה מוצק מתוך פיסת כבל אתרנט ופתלתי אותו סביב החלק החלק של מקדח בגודל 5/32 אינץ '. השאר את הבידוד דולק למעט הקצה שנמכר ללוח ה- RF. תצטרך 20 סיבובים. תוכל גם להשתמש במקדח בגודל 7/32 אינץ 'ולעטוף 17 סיבובים במקום. כל אלה כנראה יעבדו בסדר גמור עבור הטווחים שסביר להניח שיש לך לחיישנים שלך. המפתח האמיתי הוא בעל מקלט RF טוב מלכתחילה. לחיישני AcuRite יש גם משדרים די חזקים.
שלב 4: פרוטוקול תקשורת RF
ישנן כמה טכניקות אפנון שונות להעברת נתונים אך חיישנים אלה משתמשים בפשוטה ביותר שהיא OOK (on-off-keying) או ASK (amplitude-shift-keying). מכיוון שאנו עוסקים בדוגמאות 0/1 סיביות נתונים אלה, המשרעת מלאה או כבויה. לכן, למטרותינו, OOK ו- ASK זהים מכיוון ש- OOK פירושו שמוביל ה- RF מלא או כבוי. פורמט ההודעה מוגדר בדרך כלל על ידי יצרן מכשיר השידור והם יכולים להשתמש כמעט בכל קצב שידור, בכל סגנון עיצוב סיביות ובכל אורך הודעה. רצועת 433 מגה-הרץ תקועה מלאה בשידורים לדברים כמו מטרים חכמים וכו 'ולכן צריך לכוונן את התוכנה לסנן רק את פורמט ההודעות שאנו רוצים להשתמש בו.
שלב 5: נתוני זמן
אני משתמש ביחידת GPS זולה על מנת לקבל נתוני זמן מדויקים שיופעלו מחדש אוטומטית לאחר הפסקת חשמל. יש לי מספר יחידות GPS (ללא תצוגות) שמפיקות את המשפטים הסטנדרטיים של NMEA אבל הקטנה והזולה ביותר ביחידות שיש לי היא ה- NEO-6M. מודול NEO-6M קל לממשק ל- Arduino מכיוון שהוא משתמש ביציאה טורית ברמת TTL. ההבדל האמיתי היחיד הוא שתקן NMEA מציין קצב שידור טורי של 4800 אך ברירת המחדל של NEO-6M היא 9600 באוד. אתה יכול להריץ את תוכנית "u-center" החינמית כדי לשנות את קצב השידור אך פשוט השארתי אותה כברירת המחדל של היצרן. יש גם תוכנית שירות חינמית בשם GPSInfo (שמוציאה על ידי גלובלסאט), שהיא מאוד שימושית לצפייה במידע GPS במחשב האישי. תוכל לחבר את יחידת ה- GPS לכבל USB סטנדרטי ל- TTL לבדיקה או להתקנה באמצעות מחשב. זכור כי שבב ה- GPS במודול פועל למעשה ב -3.3 וולט (באמצעות ווסת מתח משולב) כך שאם ברצונך להתחבר ליציאת RXD שלו, עליך לעבור את הרמה למטה מ -5 וולט. יציאת TXD יכולה להתחבר ישירות ל- Arduino או למחשב האישי.
שלב 6: אזורי זמן
הצגת זמן GPS היא דבר קל לביצוע כל עוד אתה רק רוצה להציג UTC (תיאום זמן אוניברסלי). משפטים NMEA מורכבים מתווים ASCII הניתנים לפלט ישירות אל ה- LCD. חלק הזמן הוא בפורמט של HHMMSS. FF (שעות, דקות, שניות ושניות חלקיות). עבור השעון שלנו החלק השברירי אינו שימושי ולכן כל שעלינו להתמודד איתו הוא שש תווים. הבעיה היא שאז אתה צריך לעבור לשעה המקומית שלך ולתבנית AM/PM של 12 שעות אם אתה רוצה את זה. אבל לפעמים הבעיות הן שהופכות את החיים למעניינים ולכן זה בעצם החלק הזה של התוכנה.
באשר לאזורי זמן, אתה עשוי לחשוב שפשוט יהיו 24 מהם עם 12 מהם ממזרח למיקום UTC (+ אזורים) ו -12 מהם ממערב למיקום UTC (- אזורים). למעשה, ישנם כמה משונים שהם שעות חלקיות וזוג שחורג מה"גבול "של 12 שעות. אם במקרה אתה גר באחד מהאזורים האלה אני מתנצל כי התוכנה שלי מהווה רק את אזורי 24 השעות השלמות. יש גם מאיתנו שמשתמשים בחלק מהשנה במהלך שעון הקיץ, אך התוכנה אינה מתייחסת אליה באופן אוטומטי. זה ידרוש טבלת חיפוש של תאריכים עתידיים, מורכבות נוספת בתוכנה וצורך לעדכן את התוכנה אם ישתנו שבועות השנה להחלפה. במקום זאת, החומרה משתמשת במתג מגע לרגע כדי לאפשר הגדרה קלה של אזור הזמן (קיזוז UTC).
שלב 7: סכמטי
הסכימה מוצגת למעלה וכוללת את החיבורים לממשק LCD של 160 סיביות 1602. הנתונים הטוריים ממקלט ה- RF נמצאים ברמות לוגיות דיגיטליות ולכן הם מחוברים ישירות לאחד מפיני קלט הנתונים של Arduino. הסיכה מוגדרת בתוכנה לביצוע פונקציית הפרעה בשינוי כך שנוכל למדוד את רוחבי הדופק. יציאת ה- GPS TXD מחוברת ישירות לקלט Arduino RX.
ישנם שני מתגים המשמשים. כפי שצוין קודם לכן, מתג מגע לרגע מאפשר הגדרת קיזוז ה- UTC. ניתן ללחוץ על המתג בכל עת בכדי להיכנס למצב המוגדר. בתחילה, התצוגה תציג קיזוז UTC לא חוקי של "+77". עיין בסעיף "תוכנת השעון" להנחיות הגדרת קיזוז UTC.
המתג השני הוא מתג הפעלה/כיבוי פשוט. במצב "כבוי" הזמן יוצג בפורמט 12 שעות (AM/PM) ובמצב "מופעל" הזמן יוצג בפורמט 24 שעות. ניתן לשנות מתג זה בכל עת כדי לעבור בין פורמטים.
אם רק פונקציית השעון רצויה, אין צורך לחבר את מודול מקלט ה- RF. אם רק פונקציית מזג האוויר רצויה, אין צורך בחיבור ה- GPS ושני המתגים.
שלב 8: תוכנת LCD
אני נוטה להשתמש באחד משני סוגים של ממשקי LCD. האחד הוא הממשק הסטנדרטי של 4 סיביות והשני הוא ממשק 3 חוטים המשתמש ברגיסט משמרות. תכננתי את הממשק הזה כשעבדתי עם מיקרו -בקרי PIC קטנים שהיו להם מספר סיכות I/O מוגבל. השתמשתי בממשק 4 סיביות לפרויקט זה, אך יש לי קובץ LCD משלי, במקום להשתמש בספריית ה- Arduino LCD הגנרית. זה מפחית את צריכת הזיכרון ואת מורכבות הקוד ומאפשר לי גם לשנות את הקוד לפרויקטים ספציפיים כמו זה.
שלב 9: תוכנת שעון
יחידת ה- GPS מוציאה משפטים סטנדרטיים מסוג NMEA-0183 שהם מחרוזות ASCII המכילות מידע מגוון. ליישום זה בחרתי את משפט ה- GGA כדי לקבל את מידע השעה כי זהו המשפט שהשתמשתי בו לפרויקט GPS קודם. שדות המידע במשפטי NMEA מופרדים בפסיקים, כך שאחרי שזוהה כותרת משפט ה- GGA, התוכנה בדרך כלל הייתה סופרת פסיקים וקוראת לשגרה המתאימה עבור כל שדה של מידע GPS. יש צורך רק במידע על הזמן וזה בשדה שאחרי הפסיק הראשון ולכן אין צורך בספירה.
שש הספרות הזמן (HHMMSS) נאגרות ואז מעובדות לאחר קבלת כולן. ה- GPS עשוי להוציא כמה הודעות לא שלמות בשלב מוקדם, כך ששגרת החיץ תאמת שכל תו הוא ערך מספרי ASCII. אם תתקבל דמות לא טובה, ההודעה תימחק. זה עשוי לקרות גם במקרים נדירים במהלך פעולה רגילה, במיוחד אם התקשורת ביציאה הטורית יורדת מעט. ראיתי את זה רק פעם אחת וכל מה שקרה הוא שהזמן עצר לשנייה ואז קפץ שתי שניות במקום אחת.
אם התוכנה מוגדרת להצגת זמן בלבד, השורה הראשונה של ה- LCD תציג זמן מקומי והשורה השנייה תציג UTC. עבור UTC התוכנה פשוט שולחת את התווים ASCII ישירות לשגרת התצוגה, עם נקודות (:) מוכנסות כראוי.
על מנת להמיר את ה- UTC לזמן מקומי, יש להחיל את קיזוז ה- UTC (אזור זמן). מכיוון שזמן ה- UTC מה- GPS הוא בפורמט ASCII, התוכנה ממירה את תווי שעות ASCII לעשרוני ולאחר מכן מוסיפה את קיזוז ה- UTC. קיזוז ה- UTC מאוחסן כערך BCD חיובי עם סימן סימן ולכן הוא מומר תחילה לערך שלם ולאחר מכן נשלל אם סימן הסיט מוגדר. לאחר חישוב ערך השעה המקומית של השעה, טבלת חיפוש משמשת להמרתה ל- BCD, ולאחר מכן ה- BCD מומרת בחזרה ל- ASCII לתצוגה. טבלת החיפוש צריכה להתמודד עם פורמט UTC 24 שעות וגם +/- 12 אזורי זמן. על מנת לעשות זאת, זמני ה- UTC מ -0000 עד 2300 תופסים את 24 הערכים האמצעיים בטבלה עם 12 ערכים לפני ו -12 רשומות לאחר מכן כדי להסביר את אזורי הזמן. שולחן אחד בפורמט 12 שעות ולכן הוספתי גם טבלת חיפוש לחלק AM/PM בתצוגה. הטבלה השנייה היא בפורמט 24 שעות. כפי שצוין קודם לכן, מתג הפעלה/כיבוי מאפשר בחירת פורמט 12 שעות או 24 שעות.
אזור הזמן מאוחזר מ- EEPROM במהלך האתחול ומוצג בקצרה. אם הוא לא הוגדר לפחות פעם אחת אז שגרת ההגדרה נקראת. ניתן לקרוא את שגרת ההגדרות בכל עת על ידי לחיצה על מתג המגע הרגעי. שגרת ההגדרות תאתחל את התצוגה ל- "UTC OFFSET +77". לחיצה קצרה על המתג תשנה את הערך ל- "-00". אם נדרש אזור זמן חיובי, לחיצה קצרה נוספת תשנה את הערך ל "+00". לחיצה ארוכה (> שנייה אחת) תעביר את מצב ההגדרה לשלב הבא. בשלב זה כל לחיצה קצרה תגדיל את ערך הזמן עד למקסימום של 12. לאחר הגעת אזור הזמן הרצוי, לחץ והחזק את המתג למשך יותר משנייה אחת ולאחר מכן שחרר אותו. לאחר מכן התוכנה תשמור את ערך UTC ב- EEPROM ותציג בקצרה את "OFFSET SAVED". אם אתה טועה במהלך הכניסה, פשוט צא ולאחר מכן לחץ שוב על המתג כדי לאפס אותו.
ה- NEO-6M אינו דורש תיקון מיקום טוב על מנת להוציא את הזמן ולכן עליו להוציא הודעות ברגע שהוא מקבל לוויין אחד. עד אז התצוגה תראה "אין נתונים".
שלב 10: תוכנת מזג אוויר
לבקר ה- PIC יש את היכולת לחבר טיימר להפעלה/כיבוי באמצעות דופק חיצוני. אותו דופק קלט יכול לשמש גם כהפרעה חיצונית לאותת קריאה של משך הדופק. ל- Arduino אין את היכולת המדויקת הזו אז השתמשתי בפונקציית ההפרעה-על-שינוי. בקצה אחד של דופק הודעת ה- RF זמן המיקרו שניות הנוכחי נשמר על ידי מטפל ההפרעה. בקצה הנגדי מחושב הזמן שחלף כדי לקבוע את רוחב הדופק.
לתוכנה יש הגדרת "DEBUG" המאפשרת להציג את פורמט הנתונים הגולמיים של ההודעות שהתקבלו. יש גם הגדרה לציון סיכת הכניסה של Arduino לזרם הטורי ממקלט ה- RF. התוכנה מוגדרת כדי לחשב את הגדרות ההרשמה המתאימות לשינוי בהתבסס על הגדרה זו. החישוב עובד רק עבור הסיכות הדיגיטליות של Arduino. במקום זאת ניתן להשתמש בסיכה אנלוגית אך הדבר ידרוש קידוד קשיח של ערכי הרישום.
מטפל הפרעות קובע אם הספירה שנלכדה ארוכה מספיק כדי להיות דופק התחלה. כפי שצוין קודם לכן, הפער בין מספר הודעות הוא 2ms כך שזה מה שהתוכנה מחפשת. בגלל כל התעבורה של 433 מגה-הרץ, ההקרנה הראשונית בתוכנה מוודאת שהזמן הנמדד הוא לפחות 1.8ms אך לא גדול מ- 2.4ms. לאחר זיהוי ההתחלה התוכנה מחפשת את סיביות הסנכרון (600us) וסופרת כדי לוודא שארבע מהן מתקבלות. ברגע שהבדיקות הללו עוברות, התוכנה מחפשת את זמני הסיביות הנכונים של 200us ו- 400us.
סיביות שהתקבלו נוצרות לבייטים וכל בית נשמר. לאחר קבלת שבעה בייטים מסכם בדיקת ההודעה לפני אישור עיבוד נוסף. אם יש להוציא בתים גולמיים (מצב איתור באגים), אז הבתים מומרים לתווי ASCII ונשלחים אל ה- LCD. אם רצועות יציאת לחות וטמפרטורה רצויות, ההמרות המתאימות מבוצעות.
שני הבייטים של נתוני סנטיגרד בהודעת ה- RF מועברים יחדיו ליצירת ערך של 11 סיביות. החלק התחתון מועבר שמאלה לביט אחד כדי לסלק את סיביות השוויון וליישר אותו עם הביטים בחלק העליון. שני הבייטים נוצרים למשתנה מילים של 16 סיביות ואז כל העניין יועתק קצת כדי לקבל את יישור הסיביות הסופי. המילה משתנה מומרת לאחר מכן למשתנה של נקודה צפה לחישובי המתמטיקה.
יתרון אחד גדול בשימוש ב- C ++ בשפת הארדואינו לעומת הרכבה ב- PIC הוא שזה מפשט את חישובי המתמטיקה. כפי שצוין קודם לכן המרת הסנטיגראד היא (C / 10) -100. התוצאה מומרת למחרוזת ונשלחת לתצוגת ה- LCD. חישוב פרנהייט הוא (C * 1.8) + 32. התוצאה מומרת שוב למחרוזת ונשלחת לתצוגת ה- LCD. בשני המקרים, המרת המחרוזת כוללת את הסימן השלילי (במידת הצורך) ואת הנקודה העשרונית. נבדקת הנקודה העשרונית כדי לוודא שרק תו אחד לאחר העשרוני נשלח לתצוגה. בדיקה זו נחוצה מכיוון שהמחרוזת יכולה לנוע בין 3 ל -5 תווים.
יש לי שני חיישני AcuRite אז הוספתי בדיקה בתוכנה כדי לוודא שהנתונים של האחד לא יחליפו את הנתונים של השני אם התוכנה מוגדרת לבצע את פונקציית מזג האוויר בלבד. החיישן הראשון שמתקבל לאחר ההפעלה מוצג בקו 1 והשני מוצג בקו 2. באמצעות מצב איתור באגים, אני יכול לראות מה המזהה של כל חיישן כך שאוכל לבצע בדיקה פשוטה בקוד אם רק רצה לעבד נתונים מאחד מהם.
התוכנה עוקבת אחר מצב הסוללה (בייט 3) ומציגה הודעה אם היא מצביעה על סוללה חלשה. הודעה זו מחליפה את כל הנתונים האחרים של אותו חיישן.
שלב 11: תצוגות
להלן מספר תצוגות לדוגמא עבור הפונקציות השונות. יש לי עוד כמה הוראות אבל רוב הפרויקטים שלי של מיקרו -בקר PIC אפשר למצוא באתר שלי בכתובת: www.boomerrules.wordpress.com