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

סופר פשוט Raspberry Pi 433MHz אוטומציה ביתית: 7 שלבים
סופר פשוט Raspberry Pi 433MHz אוטומציה ביתית: 7 שלבים

וִידֵאוֹ: סופר פשוט Raspberry Pi 433MHz אוטומציה ביתית: 7 שלבים

וִידֵאוֹ: סופר פשוט Raspberry Pi 433MHz אוטומציה ביתית: 7 שלבים
וִידֵאוֹ: Raspberry PI 4B, установка Supervised Home Assistant на RaspiOS 64 - проверка инструкции 2024, נוֹבֶמבֶּר
Anonim
סופר פשוט Raspberry Pi 433MHz אוטומציה ביתית
סופר פשוט Raspberry Pi 433MHz אוטומציה ביתית

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

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

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

לפרויקט זה תזדקק ל:

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

זוג משדרים/מקלטים של 433MHz. נראה כי אלה הנפוצים ביותר בפרויקט מסוג זה. רכישת חבילה של חמישה כמו זו המקושרת מבטיחה שיש לך כמה חלפים

סט שקעי חשמל בשליטה מרחוק על 433 מגה-הרץ. השתמשתי באלו שאני ממליץ בחום, אבל יש אינספור דגמים זמינים. רק וודא שהם פועלים בתדר זה

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

[אם תחליט לרכוש כל אחד מהמוצרים האלה, אעריך מאוד אם תיכנס לרישומים באמצעות הקישורים שלמעלה - כך, אני מקבל נתח זעיר מהרווחים ללא עלות נוספת לך!]

שלב 1: הגדרת יחידת המקלט

הגדרת יחידת המקלט
הגדרת יחידת המקלט

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

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

לאחר שהבנת כיצד אינטראקציות השקעים שלך עם המכשיר, יהיה עליך להשתמש ביחידת המקלט 433MHz שלך (בתמונה למעלה) כדי 'לרחרח' את הקודים הנשלחים על ידי המכשיר. לאחר שתיעד את צורות הגל של הקודים הללו, תוכל לשכפל אותם באמצעות פייתון ולשלוח אותם החוצה באמצעות יחידת המשדר.

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

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

חשוב: אם תחבר את הסיכה המסומנת '3v3' בתמונה למעלה לסיכת מתח גבוהה יותר בפי (למשל 5v), סביר להניח שתפגע ב- Pi מכיוון שסיכות GPIO לא יכולות לסבול מתח מעל 3v3. לחלופין, אתה יכול להפעיל אותו עם 5v ולהקים מחלק מתח כדי לשלוח מתח בטוח לסיכת DATA.

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

שלב 2: הרחת קודי המכשיר

הרחת קודי המכשיר
הרחת קודי המכשיר

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

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

מאת datetime לייבא datetime

ייבוא matplotlib.pyplot כ- pyplot ייבוא RPi. GPIO כ- GPIO

ספריות RPi. GPIO ו- datetime נכללו בהפצה Raspbian שלי, אך נאלצתי להתקין את ספריית matplotlib כדלקמן:

sudo apt-get להתקין python-matplotlib

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

כאשר הוא מופעל (באמצעות הפקודה 'python ReceiveRF.py'), הוא יגדיר את סיכת ה- GPIO המוגדרת כקלט נתונים (סיכה 23 כברירת מחדל). לאחר מכן הוא ידגם כל הזמן את הסיכה ויכנס אם הוא מקבל 1 דיגיטלי או 0. זה ממשיך למשך זמן מוגדר (5 שניות כברירת מחדל). כשיגיע מגבלת הזמן הזו, התסריט יפסיק להקליט נתונים ויסגור את קלט ה- GPIO. לאחר מכן הוא מבצע מעט עיבוד אחר ומתווה את ערך הקלט שהתקבל מול הזמן. שוב, אם יש לך שאלות לגבי מה התסריט עושה, סביר להניח שאתה יכול לענות עליהן בעצמך לאחר שתראה כיצד הוא פועל. ניסיתי להפוך את הקוד לקריא ופשוט ככל האפשר.

מה שאתה צריך לעשות זה לחפש כאשר התסריט מציין שיש לו ** התחיל להקליט **. לאחר הופעת הודעה זו, עליך ללחוץ והחזק את אחד הלחצנים במכשיר הטלפון למשך כשנייה. הקפד להחזיק אותו קרוב למקלט. לאחר שהסקריפט יסיים להקליט, הוא ישתמש ב- matplotlib כדי לתוות צורת גל גרפית של האות שהוא קיבל במהלך מרווח ההקלטה. שים לב, אם אתה מחובר ל- Pi שלך באמצעות לקוח SSH כגון PuTTY, יהיה עליך גם לפתוח יישום X11 כדי לאפשר לצורת הגל להציג. אני משתמש ב- xMing לשם כך (ולדברים אחרים כגון ניתוק שולחן עבודה מרחוק לתוך ה- Pi שלי). כדי לאפשר את הצגת העלילה, פשוט התחל ב- xMing לפני שתפעיל את הסקריפט ותחכה להופעת התוצאות.

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

שלב 3: תמלול האות שנוצר

תמלול האות שנוצר
תמלול האות שנוצר

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

1 = short_on + long_off0 = long_on + short_off

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

1111111111111010101011101

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

לפני שתוכל לשלוח מחדש את האותות באמצעות המשדר, יש עוד קצת עבודה. העיתוי בין השיאים לשפל המקביל ל -1 או 0 חשוב מאוד, ועליך לוודא שאתה יודע כמה זמן נמשך 'קצר_ון' או 'ארוך_אוף' בפועל. עבור הקודים שלי, היו שלושה חלקים של מידע תזמון שהייתי צריך לחלץ כדי לשכפל את האותות:

  • משך מרווח 'קצר', כלומר תחילת 1 או סוף 0.
  • משך מרווח 'ארוך', כלומר סיום 1 או תחילת 0.
  • משך מרווח 'מורחב'. שמתי לב שכאשר החזקתי את הלחצן למטה על המכשיר, הייתה תקופת 'הרחבה_אפ' בין כל מופע חוזר של בלוק האות. עיכוב זה משמש לסנכרון ויש לו משך זמן קבוע.

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

  • עיכוב קצר = 0.00045
  • long_delay = 0.00090 (ארוך פי שניים מ'קצר ')
  • עיכוב_אריך = 0.0096

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

הגדרת יחידת המשדר
הגדרת יחידת המשדר

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

במקרה זה, זה בסדר להפעיל את היחידה באמצעות אספקת 5V מה- Pi מכיוון שסיכת DATA לא תשלח אותות ל- Pi, רק תקבל אותם. כמו כן, ספק כוח 5V יספק טווח שידור רב יותר מאשר שימוש באספקת 3v3. שוב, אתה יכול לחבר את סיכת DATA לכל סיכה מתאימה בפי. השתמשתי בסיכה 23 (כמו במקלט).

דבר נוסף שהייתי ממליץ לעשות הוא להוסיף אנטנה לחור הקטן בפינה השמאלית העליונה של המשדר. השתמשתי בחתיכת ישר ישר באורך 17 ס מ. מקורות מסוימים ממליצים על חוט מפותל באורך דומה. אני לא בטוח מה עדיף, אבל החוט הישר מספק מספיק טווח בכדי להפעיל/לכבות את השקעים מכל מקום בדירה הקטנה שלי. הכי טוב להלחם את האנטנה, אבל רק הוצאתי חלק מהפלסטיק מהחוט ועטפתי את הנחושת דרך החור.

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

שלב 5: העברת אותות באמצעות ה- Pi

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

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

זמן יבוא

ייבוא sys יבוא RPi. GPIO כ- GPIO

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

a_on = '111111111111101100101101'

a_off = '1111111111111010101010111' b_on = '1111111111101110101011101' b_off = '1111111111101110101010111' c_on = '1111111111101011101011101' c_off = '1111111111101011101010111' d_on = '1111111111101010111011101 '1100111011101

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

ברגע שאתה מרוצה מהקודים/העיכובים שהכנסת לתסריט (תוכל לשנות את שם משתני מחרוזת הקוד אם תרצה), אתה די מוכן לנסות את המערכת! לפני שתעשה זאת, תסתכל על הפונקציה transmit_code () בתסריט. כאן מתרחשת האינטראקציה בפועל עם המשדר. פונקציה זו מצפה שאחד ממחרוזות הקוד יישלח כארגומנט. לאחר מכן הוא פותח את הסיכה המוגדרת כפלט GPIO ועובר כל תו במחרוזת הקוד. לאחר מכן הוא מפעיל או מכבה את המשדר בהתאם למידע התזמון שהזנת כדי לבנות צורת גל התואמת את מחרוזת הקוד. הוא שולח כל קוד מספר פעמים (10 כברירת מחדל) כדי להפחית את הסיכוי שהוא יפספס, ומשאיר עיכוב מוארך בין כל בלוק קוד, בדיוק כמו המכשיר.

כדי להריץ את הסקריפט, תוכל להשתמש בתחביר הפקודה הבא:

python TransmitRF.py code_1 code_2 …

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

python TransmitRF.py a_on b_on c_off

שלב 6: הערה לגבי דיוק תזמון

כאמור, העיתוי בין פולסי ההפעלה/כיבוי המועברים הוא די חשוב. התסריט TransmitRF.py משתמש בפונקציה time.sleep () של python כדי לבנות את צורות הגל עם מרווחי הדופק הנכונים, אך יש לציין כי פונקציה זו אינה מדויקת לחלוטין. האורך שבגללו הוא גורם לתסריט להמתין לפני ביצוע הפעולה הבאה יכול להיות תלוי בעומס המעבד באותו רגע נתון. זוהי סיבה נוספת מדוע TransmitRF.py שולח כל קוד מספר פעמים - למקרה שפונקציית time.sleep () לא תוכל לבנות נכון מופע נתון של הקוד.

לי אישית מעולם לא היו בעיות עם time.sleep () בכל הנוגע לשליחת הקודים. עם זאת אני יודע של- time.sleep () שלי יש שגיאה של בערך 0.1ms. קבעתי זאת באמצעות הסקריפט המצורף SleepTest.py שניתן להשתמש בו כדי לתת הערכה עד כמה הפונקציה time.sleep () של Pi שלך מדויקת. עבור השקעים המסוים שלי בשלט רחוק, העיכוב הקצר ביותר שהייתי צריך ליישם היה 0.45ms. כפי שאמרתי, לא היו לי בעיות עם שקעים שאינם מגיבים, כך שנראה כי 0.45 ± 0.1ms זה מספיק טוב.

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

שלב 7: סיכום

סיכום
סיכום

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

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

עבור רוב המשימות האלה, אני משתמש בפונקציית crontab בתוך לינוקס. זה מאפשר לך להגדיר משימות מתוזמנות אוטומטיות להפעלת הסקריפט TransmitRF.py בזמנים ספציפיים. אתה יכול גם להשתמש בפקודה Linux at להפעלת משימות חד פעמיות (אשר מבחינתי היה צריך להתקין בנפרד באמצעות 'sudo apt-get install at'). לדוגמה, כדי להדליק את תנור החימום שלי חצי שעה לפני שהאזעקה שלי תיגמר למחרת בבוקר, כל מה שאני צריך לעשות הוא להקליד:

בשעה 05:30

python TransmitRF.py c_on

תוכל גם להשתמש בפרויקט זה בשילוב עם מערכת הניטור הביתית של Dropbox שלי לשליטה במכשירי אינטרנט דרך האינטרנט! תודה שקראת, ואם אתה רוצה להבהיר משהו או לשתף את דעתך, אנא פרסם תגובה!

מוּמלָץ: