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

צג והקליט טמפרטורה באמצעות Bluetooth LE ו- RaspberryPi: 9 שלבים (עם תמונות)
צג והקליט טמפרטורה באמצעות Bluetooth LE ו- RaspberryPi: 9 שלבים (עם תמונות)

וִידֵאוֹ: צג והקליט טמפרטורה באמצעות Bluetooth LE ו- RaspberryPi: 9 שלבים (עם תמונות)

וִידֵאוֹ: צג והקליט טמפרטורה באמצעות Bluetooth LE ו- RaspberryPi: 9 שלבים (עם תמונות)
וִידֵאוֹ: SMLIGHT SLZB-06 - Zigbee координатор с Ethernet, wi-fi, POE и USB C, zigbee2mqtt и ZHA 2024, יולי
Anonim
צג והקליט טמפרטורה באמצעות Bluetooth LE ו- RaspberryPi
צג והקליט טמפרטורה באמצעות Bluetooth LE ו- RaspberryPi
צג והקליט טמפרטורה באמצעות Bluetooth LE ו- RaspberryPi
צג והקליט טמפרטורה באמצעות Bluetooth LE ו- RaspberryPi

מדריך זה עוסק כיצד להרכיב מערכת ניטור טמפרטורות מרובת צומתים עם באג חיישן Bluetooth LE מ- Blue Radios (BLEHome) ו- RaspberryPi 3B הודות לפיתוח תקן Bluetooth LE, קיימים כיום בשוק חיישנים אלחוטיים בעלי הספק נמוך. בעלות נמוכה מאוד ויכול לפעול על תא מטבע יחיד במשך חודשים בכל פעם. אחד החיישנים האלה שהרמתי הוא מהרדיו הכחול הנקרא Sensor Bugs. בעלות של כ -25 $ באמזון, זהו מכשיר Bluetooth LE עם חיישן טמפרטורה, חיישן אור ומצב אקסרומטר, כולם מובנים ליחידה קטנה שיכולה לתקשר באופן אלחוטי. זוהי התאמה מושלמת ל- Raspberry Pi 3B, הכוללת תמיכה מובנית ברדיו Bluetooth LE..

שלב 1: הגדרת פטל פטל

השלב הראשון הוא לקבל הגדרת Raspberry Pi עובדת. עקוב אחר ההוראות מאתר Raspberry Pi, טען את Raspbian בכרטיס SD, הכנס ל- Raspberry Pi והפעל אותו. הגדרתי את המערכת שלי עם גרסת Raspbian Stretch Lite (ללא GUI) בנובמבר 2017. הגדר WiFi במידת הצורך, אני מעדיף להתאים את אזור הזמן לאזור הזמן הנוכחי במקום UTC. אתה יכול לעשות זאת למרות שהפקודה: $ sudo dpkg-reconfigure tzdata מנוחה של ההוראה מניחה שההגדרה מתבצעת למרות ממשק שורת הפקודה.

שלב 2: הגדרת MySQL ב- Raspberry Pi

כדאי להתקין מסד נתונים מקומי לאחסון כל הנתונים שנתפסו. התקנת MySQL ב- Raspberry Pi היא קלה במיוחד. זה גם לא קשה לשנות את הסקריפט כדי להתחבר לשרת SQL באופן חיצוני, אתה יכול לדלג על שלב זה אם ברצונך להשתמש בשרת SQL ברשת. יש הרבה הוראות ברשת, אני מציע זאת: https:// www.stewright.me/2014/06/tutorial-install-…

לאחר התקנת שרת SQL, תוכל להשתמש בלקוח MySQL CLI ליצירת משתמש, מסד נתונים וטבלה. כדי להיכנס ל- MySQL CLI, השתמש בפקודה:

$ sudo mysql -uroot -p ראשית, צור משתמש מקומי להוספת נתונים שנתפסו:> צור משתמש 'datasrc'@'localhost' מזוהה על ידי 'datasrc000'; לאחר מכן צור מסד נתונים וטבלה:> CREATE DATABASE SensorBug; הגדרת המשתמש הרשאה:> להעניק את כל ההפרטים על SensorBug.* ל- 'datasrc'@'localhost'; כעת הוסף טבלה חדשה למסד הנתונים. בדוגמה זו, אני הולך להוסיף טבלה עם העמודות הבאות: DATE, TIME, ADDRESS, LOCATION, TEMPERATURE ו- ACCEROMETER

  • DATE/TIME - זהו התאריך והשעה בהם הנתונים מוקלטים
  • ADDRESS - זהו ה- MAC של SensorBug שההודעה נלכדת ממנו
  • LOCATION - מחרוזת קריאה לאדם המציינת היכן נמצא החיישן
  • טמפרטורה - זוהי הטמפרטורה המוקלטת
  • ACCELE - זהו הערך של פלט מד התאוצה, שימושי להקלטת מיקום החיישן (אם מופעל)

הפקודה שעושה זאת היא:> USE SensorBug; > צור נתוני טבלה (תאריך DATE, שעה TIME, כתובת TINYTEXT, מיקום TINYTEXT, טמפרטורת FLOAT, accele INT); כעת מסד הנתונים מוכן, אנו יכולים להמשיך להגדרת ה- SensorBugs.

שלב 3: הגדרת SensorBugs

באגי החיישן הם מכשירים קטנים ומסודרים למדי. לרוע המזל, היצרן סיפק רק אפליקציית IOS לתכנותו. אף על פי כן, עדיין ניתן לעבוד איתו אם יש לכם רק מכשיר אנדרואיד. שלב ראשון, התאם את המכשיר עם טלפון. ללא התאמת המכשיר, SensorBug לא יפרסם נתונים. ניסיתי לבדוק אם אני יכול לעשות זאת ישירות עם RaspberryPi, למרבה הצער, נראה כי מנהל ההתקן של Bluetooth LE ב- RaspberryPi עדיין ניסיוני ומכיל באגים כדי למנוע את ההתאמה שלו עם מכשירי Bluetooth LE. גרסה עתידית של מנהל ההתקן blueZ עשויה לתקן זאת, אך כפי שנכתב כיום, אין דרך להתאים את SensorBug ל- RaspberryPi. למרבה המזל, איננו צריכים לשייך את המכשיר כדי ללכוד את הנתונים המפורסמים שלו. הדבר היחיד שאנחנו צריכים הוא טלפון כדי להגדיר את SensorBug. כברירת מחדל, SensorBug יתחיל לפרסם נתוני טמפרטורה במרווח של 1 שניות לאחר שיצמד למכשיר. לנתוני טמפרטורת לכידה, זה כל מה שצריך. אם אתה מתכוון להרחיב להשתמש במיקום או בחיישן האור, מהתצורה יהיה צורך במכשיר. בתור התחלה, נחבר את המכשיר ונתק. זה יהיה מספיק טוב למטרת לכידת טמפרטורה. התחל על ידי לחיצה על שני הכפתורים ב- SensorBug. הנורית הכחולה/ירוקה תהבהב, מה שמצביע על כך שהוא מופעל. לחץ על אחד הלחצנים, הנורית הירוקה אמורה להידלק, ציינו שהכוח מופעל. אם הנורית הירוקה אינה דולקת, לחץ על שני הכפתורים כדי לנסות להדליק את המכשיר שוב. לחץ והחזק את אחד הלחצנים עד שהנורית הכחולה תתחיל להבהב. זה יכניס את המכשיר למצב זוג. עבור לתפריט תצורה של Bluetooth בטלפון וחפש את מכשיר SensorBug. ברגע שהוא מופיע, בחר אותו כדי להתאים אותו עם המכשיר. זהו, כעת SensorBug מופעל ומפרסם את נתוני הטמפרטורה.

שלב 4: התקנת מעטפת ה- Python Bluetooth LE

לאחר מכן עלינו להתקין את הספרייה כדי שפייתון יכול לדבר עם ערימת Bluetooth LE. ניתן למצוא את ההוראה כאן: https://github.com/IanHarvey/bluepy עבור Python 2.7, זה פשוט כמו הזנת הפקודות הבאות:

$ sudo apt-get להתקין python-pip libglib2.0-dev $ sudo pip להתקין bluepy

שלב 5: סרוק וגלה את הכתובת של SensorBug

כדי לברר את כתובת MAC SensorBug, השתמש בפקודה זו: $ sudo hcitool lescan אתה אמור לראות פלט כמו:

EC: FE: 7E: 10: B1: 92 (לא ידוע) אם יש לך הרבה מכשירי Bluetooth LE בסביבה, יתכן שיהיה קשה לברר עם מי אתה מדבר. אתה יכול לנסות bluetoothctl שנותן פרטים נוספים:

$ sudo bluetoothctl [bluetooth]# סריקה ב- [NEW] מכשיר EC: FE: 7E: 10: B1: 92 SensorBug10B192 [CHG] Device EC: FE: 7E: 10: B1: 92 יצרן מפתח נתונים: 0x0085 [CHG] Device EC: FE: 7E: 10: B1: 92 ערך יצרן נתון ערך: 0x02 [CHG] מכשיר EC: FE: 7E: 10: B1: 92 ערך יצרן נתוני ערך: 0x00 [CHG] מכשיר EC: FE: 7E: 10: B1: 92 ערך נתוני יצרן: 0x3c [CHG] מכשיר EC: FE: 7E: 10: B1: 92 ערך יצרן נתוני ערך: 0x25 [CHG] מכשיר EC: FE: 7E: 10: B1: 92 ערך יצרן נתוני ערך: 0x09 [CHG] מכשיר EC: FE: 7E: 10: B1: 92 ערך יצרן נתוני: 0x41 [CHG] מכשיר EC: FE: 7E: 10: B1: 92 ערך נתוני יצרן: 0x02 [CHG] מכשיר EC: FE: 7E: 10: B1: 92 ערך יצרן: ערך ערך 0x02 [CHG] EC: FE: 7E: 10: B1: 92 ערך יצרן נתון ערך: 0x43 [CHG] מכשיר EC: FE: 7E: 10: B1: 92 ערך יצרן נתוני ערך: 0x0b [CHG] מכשיר EC: FE: 7E: 10: B1: 92 נתוני יצרן ערך: 0x01 [CHG] מכשיר EC: FE: 7E: 10: B1: 92 יצרן ערך נתונים: 0x6f

רשום את כתובת ה- MAC, יהיה עליך להזין את זה בתסריט הפייתון כדי לסנן התקני Bluetooth LE לא רצויים

שלב 6: הוסף את סקריפט Python

עותק של סקריפט Python זמין מ:

drive.google.com/open?id=10vOeEAbS7mi_eXn_…

להלן אותו קובץ, הקפד על הכניסה בעת ההעתקה:

כמו כן, עדכן את כתובת ה- MAC בקובץ הפייתון כך שיתאים לכתובת החיישן המתקבלת מתוצאת הסריקה.

# תוכנית זו היא תוכנה חינמית: אתה יכול להפיץ אותה מחדש ו/או לשנות

# זה תחת התנאים של רישיון הציבור הכללי של GNU כפי שפורסם על ידי

# קרן התוכנה החופשית, גרסה 3 של הרישיון, או

# (לבחירתך) כל גרסה מאוחרת יותר.

#

# תוכנית זו מופצת בתקווה שהיא תהיה שימושית, # אך ללא אחריות כלשהי; בלי אפילו האחריות המשתמעת של

# סחירות או התאמה למטרה מיוחדת. ראה את

# רישיון ציבורי כללי של GNU לפרטים נוספים.

#

# היית צריך לקבל עותק של הרישיון הציבורי הכללי של GNU

# יחד עם תוכנית זו. אם לא, ראה.

# bscan.py - סורק LE Bluetooth פשוט וחולץ נתונים פשוט

מסורק יבוא bluepy.btle, DefaultDelegate

זמן יבוא

יבוא pymysql

מבנה יבוא

hostname = 'localhost'

שם משתמש = 'datasrc'

password = 'datasrc000'

database = 'SensorBug'

#הזן את כתובת ה- MAC של החיישן מהסקאן

SENSOR_ADDRESS = ["ec: fe: 7e: 10: b9: 92", "ec: fe: 7e: 10: b9: 93"]

SENSOR_LOCATION = ["מוסך", "חיצוני"]

class DecodeErrorException (חריגה):

def _init _ (עצמי, ערך):

ערך עצמי.ערך

def _str _ (עצמי):

החזר repr (ערך עצמי)

class ScanDelegate (DefaultDelegate):

def _init _ (עצמי):

Default.elegate._ init _ (עצמי)

def handleDiscovery (self, dev, isNewDev, isNewData):

אם הוא NewDev:

- "מכשיר שהתגלה", dev.addr

elif isNewData:

- "התקבל נתונים חדשים מ-", dev.addr

def doQueryInsert (conn, addr, loc, temp, accero):

טבלת #blesensor היא תאריך, שעה, כתובת, מיקום, טמפ ', עלות

cur = conn.cursor ()

dostr = 'הכנס לנתוני VALUES (CURRENT_DATE (), NOW (), %s, %s, %s, %s);'

cur.execute (dostr, (addr, loc, temp, accero))

conn.commit ()

סורק = סורק (). withDelegate (ScanDelegate ())

myConnection = pymysql.connect (מארח = שם מארח, משתמש = שם משתמש, passwd = סיסמה, db = מסד נתונים)

ManuDataHex =

ReadLoop = נכון

לְנַסוֹת:

בעוד (ReadLoop):

מכשירים = scanner.scan (2.0)

ManuData = ""

להתקנים בהתקנים:

ערך = 0

AcceroData = 0

AcceroType = 0

TempData = 0

עבור saddr ב- SENSOR_ADDRESS:

ערך += 1

אם (dev.addr == saddr):

הדפס "התקן %s (%s), RSSI = %d dB" %(dev.addr, dev.addrType, dev.rssi)

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION [ערך -1]

עבור (adtype, desc, value) ב- dev.getScanData ():

הדפס " %s = %s" %(desc, value)

if (desc == "יצרן"):

ManuData = ערך

if (ManuData == ""):

- הדפסה "לא התקבלו נתונים, סיום פענוח"

לְהַמשִׁיך

#print ManuData

עבור i, j ב- zip (ManuData [:: 2], ManuData [1:: 2]):

ManuDataHex.append (int (i+j, 16))

#התחל בפענוח נתוני היצרן הגולמיים

אם ((ManuDataHex [0] == 0x85) ו- (ManuDataHex [1] == 0x00)):

הדפס "בית כותרת 0x0085 נמצא"

אַחֵר:

- "בית הכותרת 0x0085 לא נמצא, עצירת פענוח"

לְהַמשִׁיך

#דילוג על סרן/קטין

#אינדקס 5 הוא 0x3c, ציין את רמת הסוללה והגדרת מספר #

אם (ManuDataHex [4] == 0x3c):

BatteryLevel = ManuDataHex [5]

ConfigCounter = ManuDataHex [6]

idx = 7

#print "TotalLen:" + str (len (ManuDataHex))

בעוד (idx <len (ManuDataHex)):

#print "Idx:" + str (idx)

#print "Data:" + hex (ManuDataHex [idx])

אם (ManuDataHex [idx] == 0x41):

#נתוני מד צעדים

idx += 1

AcceleroType = ManuDataHex [idx]

AcceleroData = ManuDataHex [idx+1]

idx += 2

elif (ManuDataHex [idx] == 0x43):

#נתוני טמפרטורה

idx += 1

TempData = ManuDataHex [idx]

TempData += ManuDataHex [idx +1] * 0x100

TempData = TempData * 0.0625

idx += 2

אַחֵר:

idx += 1

- הדפס "כתובת מכשיר:" + CurrentDevAddr

- הדפס "מיקום המכשיר:" + CurrentDevLoc

הדפס "רמת סוללה:" + str (BatteryLevel) + "%"

הדפס "מונה תצורה:" + str (ConfigCounter)

הדפס "נתוני Accelero:" + hex (AcceleroType) + "" + hex (AcceleroData)

הדפס "נתוני טמפ ':" + str (TempData)

doQueryInsert (myConnection, CurrentDevAddr, CurrentDevLoc, TempData, AcceleroData)

ReadLoop = שקר

למעט DecodeErrorException:

לַעֲבוֹר

שלב 7: בדוק את סקריפט Python

הסקריפט חייב להיות מופעל בשורש, כך:

$ sudo python bscan.py מכשיר שהתגלה ec: 6e: 7e: 10: b1: 92 מכשיר ec: 6e: 7e: 10: b1: 92 (ציבורי), RSSI = -80 dB Flags = 06 שירותי 16b לא שלמים = 0a18 יצרן = 850002003c25094102024309016f בית הכותרת 0x0085 נמצא כתובת המכשיר: ec: 6e: 7e: 10: b1: 92 מיקום המכשיר: רמת הסוללה של המוסך: 37% מונה התצורה: 9 נתוני Accero: 0x2 0x2 נתוני הטמפ ': 16.5625

שלב 8: הוסף את ה- Scrip Python ל- Crontab

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

$ sudo crontab -e

# ערוך קובץ זה כדי להציג משימות שיופעלו על ידי cron.

# # כל משימה להריץ צריכה להיות מוגדרת באמצעות שורה אחת # המציינת עם שדות שונים מתי המשימה תופעל # ואיזו פקודה להפעיל עבור המשימה # # כדי להגדיר את הזמן ניתן לספק ערכים קונקרטיים למשך # דקה (מ '), שעה (ח), יום החודש (דום), חודש (שני), # ויום בשבוע (דאו) או השתמש ב- '*' בשדות אלה (עבור 'כל'). # # שים לב שמשימות יתחילו מבוסס על מערכת cron # מושג הדמון של זמן ואזורי זמן. # # פלט של עבודות crontab (כולל שגיאות) נשלח באמצעות # דוא ל למשתמש שאליו משתייך קובץ crontab (אלא אם ינותב מחדש). # # לדוגמה, תוכל להפעיל גיבוי של כל חשבונות המשתמש שלך # בשעה 5 בבוקר מדי שבוע עם: # 0 5 * * 1 tar -zcf /var/backups/home.tgz/home/ # # למידע נוסף עיין ב דפים ידניים של crontab (5) ו- cron (8) # # mh dom mon dow command 0 * * * * python /home/pi/bscan.py 20 * * * * python /home/pi/bscan.py 40 * * * * python /home/pi/bscan.py

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

שלב 9: תוספת: הגדר את SensorBug לפלט חישת מיקום

תוספת: הגדר את SensorBug עבור פלט חישת מיקום
תוספת: הגדר את SensorBug עבור פלט חישת מיקום
תוספת: הגדר את SensorBug לפלט חישת מיקום
תוספת: הגדר את SensorBug לפלט חישת מיקום

אפשר להגדיר את SensorBug באנדרואיד עבור פלט חישת מיקום לחישת שינוי מיקום, מה שנקרא חיסכון בדלת המוסך, SensorBug יזהה אם המכשיר עומד זקוף או מונח שטוח. כאשר המכשיר שטוח, הערך שנרשם הוא 0x20 אם המכשיר עומד זקוף, הערך הוא 0x02 אין זה מבדיל אם מיקום X או Y למעלה, כל עוד ציר Z אינו למעלה או למטה. הדרך הקלה ביותר לעשות זאת היא באמצעות אפליקציית LightBlue. SensorBug אמור להופיע בתפריט הסריקה. בחר את המכשיר שברצונך להגדיר, עבור למאפייני GATT לתצורת מד תאוצה UUID: 9DC84838-7619-4F09-A1CE-DDCF63225B11

ראה תמונה: כתוב מחרוזת תצורה חדשה:

010d3f02020000002d00000002 קרא שוב את מחרוזת התצורה כדי לאשר את הכתיבה. זה מאפשר את מד התאוצה לחישת מיקום.

מוּמלָץ: