فهرست مطالب:

نظارت و ثبت دما با Bluetooth LE و RaspberryPi: 9 مرحله (همراه با تصاویر)
نظارت و ثبت دما با Bluetooth LE و RaspberryPi: 9 مرحله (همراه با تصاویر)

تصویری: نظارت و ثبت دما با Bluetooth LE و RaspberryPi: 9 مرحله (همراه با تصاویر)

تصویری: نظارت و ثبت دما با Bluetooth LE و RaspberryPi: 9 مرحله (همراه با تصاویر)
تصویری: ESP32 Project 35 - Plant Monitor, soil, temperature and light | SunFounder's ESP32 IoT Learnig kit 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 دلار در آمازون است ، یک دستگاه بلوتوث LE با سنسور دما ، سنسور نور و شتاب سنج است که همگی در یک واحد کوچک ساخته شده اند که می تواند به صورت بی سیم ارتباط برقرار کند. این برای بازی Raspberry Pi 3B که از رادیو بلوتوث LE پشتیبانی می کند مطابقت کامل دارد. به

مرحله 1: رزبری پای را راه اندازی کنید

اولین قدم این است که راه اندازی رزبری پای را دریافت کنید. دستورالعمل های وب سایت Raspberry Pi را دنبال کنید ، Raspbian را روی یک کارت SD بارگذاری کنید ، در Raspberry Pi وارد کنید و آن را بوت کنید. من سیستم خود را با Raspbian Stretch Lite (بدون GUI) نسخه نوامبر 2017 راه اندازی می کنم. در صورت نیاز ، WiFi را تنظیم کنید ، ترجیح می دهم منطقه زمانی به منطقه زمانی فعلی به جای UTC. می توانید این کار را با دستور زیر انجام دهید: $ sudo dpkg-reconfigure tzdata

مرحله 2: راه اندازی MySQL در Raspberry Pi

نصب پایگاه داده محلی برای ذخیره تمام داده های ضبط شده مفید است. نصب MySQL بر روی رزبری پای بسیار آسان است. همچنین تغییر اسکریپت برای اتصال خارجی به یک سرور SQL کار چندان دشواری نیست ، در صورت تمایل به استفاده از سرور SQL در شبکه می توانید این مرحله را رد کنید. دستورالعمل های زیادی در شبکه وجود دارد ، من این را پیشنهاد می کنم: https:// www.stewright.me/2014/06/tutorial-install-…

پس از نصب سرور SQL ، می توانید از کلاینت MySQL CLI برای ایجاد کاربر ، پایگاه داده و جدول استفاده کنید. برای وارد کردن MySQL CLI ، از دستور زیر استفاده کنید:

$ sudo mysql -uroot -p ابتدا یک کاربر محلی ایجاد کنید تا داده های گرفته شده را وارد کنید:> CREATE USER 'datasrc'@'localhost' IDENTIFYED BY 'datasrc000' ؛ سپس ، یک پایگاه داده و جدول ایجاد کنید:> CREATE DATABASE SensorBug ؛ راه اندازی کاربر اجازه:> اعطای همه خصوصیات در SensorBug.* به 'datasrc'@'localhost' ؛ اکنون یک جدول جدید به پایگاه داده اضافه کنید. برای این مثال ، من یک جدول با ستون های زیر اضافه می کنم: DATE ، TIME ، ADDRESS ، LOCATION ، TEMPERATURE و ACCEROMETER

  • DATE/TIME - این تاریخ و زمان ثبت داده ها است
  • آدرس - این MAC از SensorBug است که پیام از آن گرفته شده است
  • LOCATION - یک رشته قابل خواندن برای نشان دادن مکان سنسور
  • TEMPERATURE - این دمای ثبت شده است
  • ACCELE - این مقدار خروجی شتاب سنج است که برای ضبط موقعیت سنسور مفید است (در صورت فعال بودن)

دستوراتی که این کار را انجام می دهند این است:> USE SensorBug؛ > ایجاد داده های جدول (تاریخ DATE ، زمان TIME ، آدرس TINYTEXT ، محل TINYTEXT ، دما FLOAT ، شتاب INT) ؛ اکنون پایگاه داده آماده است ، می توانیم به راه اندازی سنسور اشکال برویم.

مرحله 3: راه اندازی SensorBugs

اشکالات سنسورها دستگاههای کوچک کاملی هستند. متأسفانه ، سازنده فقط برنامه IOS را برای برنامه نویسی آن ارائه کرده است. به هر حال ، اگر فقط دستگاه Android دارید ، می توانید با آن کار کنید. در مرحله اول ، دستگاه را با تلفن جفت کنید. بدون جفت شدن دستگاه ، SensorBug داده ها را تبلیغ نمی کند. من سعی کردم ببینم آیا می توانم این کار را مستقیماً با RaspberryPi انجام دهم ، متأسفانه به نظر می رسد که درایور Bluetooth LE در RaspberryPi هنوز آزمایشی است و دارای اشکال است تا از جفت شدن آن با دستگاه های Bluetooth LE جلوگیری کند. نسخه آینده درایور blueZ ممکن است این مشکل را برطرف کند ، اما به عنوان نوشته فعلی ، راهی برای جفت کردن SensorBug با RaspberryPi وجود ندارد. خوشبختانه ، ما نیازی به جفت کردن دستگاه نداریم تا داده های تبلیغ شده آن را ضبط کنیم. تنها چیزی که ما نیاز داریم یک تلفن برای پیکربندی SensorBug است. به طور پیش فرض ، SensorBug هنگامی که با یک دستگاه جفت می شود ، داده های دما را در فاصله 1 ثانیه تبلیغ می کند. برای ضبط داده های دما ، این تنها چیزی است که لازم است. اگر قصد استفاده از سنسور موقعیت یا نور را دارید ، پیکربندی دستگاه مورد نیاز است. برای شروع ، ما دستگاه را جفت می کنیم و ارتباط را قطع می کنیم. این به اندازه کافی برای هدف گرفتن دما مناسب است. با فشار دادن هر دو دکمه در SensorBug شروع کنید. چراغ آبی/سبز چشمک می زند که نشان می دهد روشن است. یکی از دکمه ها را فشار دهید ، چراغ سبز باید روشن شود ، نشان می دهد که برق روشن است. اگر LED سبز روشن نیست ، دکمه هر دو را فشار دهید تا دوباره دستگاه را روشن کنید. یکی از دکمه ها را فشار داده و نگه دارید تا LED آبی شروع به چشمک زدن کند. این دستگاه را در حالت جفت قرار می دهد. به منوی تنظیمات بلوتوث در تلفن بروید و دستگاه SensorBug را جستجو کنید. پس از نمایش ، آن را انتخاب کنید تا با دستگاه جفت شود. همین ، SensorBug تغذیه شده و داده های دما را تبلیغ می کند

مرحله 4: نصب Bluetooth LE Python Wrapper

در مرحله بعد باید کتابخانه را برای پایتون نصب کنیم تا با پشته Bluetooth LE صحبت کند. دستورالعمل را می توانید در اینجا پیدا کنید: https://github.com/IanHarvey/bluepy برای پایتون 2.7 ، به سادگی وارد کردن دستورات زیر است:

$ sudo apt-get install python-pip libglib2.0-dev $ sudo pip install bluepy

مرحله 5: آدرس SensorBug را اسکن و پیدا کنید

برای اطلاع از آدرس MAC SensorBug ، از این دستور استفاده کنید: $ sudo hcitool lescan شما باید خروجی زیر را مشاهده کنید:

EC: FE: 7E: 10: B1: 92 (ناشناخته) اگر تعداد زیادی دستگاه بلوتوث LE در اطراف خود دارید ، شاید پیدا کردن این که با کدام دستگاه صحبت می کنید دشوار باشد. می توانید bluetoothctl را امتحان کنید که جزئیات بیشتری را ارائه می دهد:

$ sudo bluetoothctl [bluetooth]# اسکن در [جدید] دستگاه EC: FE: 7E: 10: B1: 92 SensorBug10B192 [CHG] EC دستگاه: FE: 7E: 10: B1: 92 سازنده کلید داده: 0x0085 [CHG] EC دستگاه: FE: 7E: 10: B1: 92 ارزش تولید کننده: 0x02 [CHG] EC EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x00 [CHG] EC EC: FE: 7E: 10: B1: 92 ManufacturerData value: 0x3c [CHG] EC device: FE: 7E: 10: B1: 92 ManufacturerData value: 0x25 [CHG] EC device: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x09 [CHG] EC EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x41 [CHG] EC EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x02 [CHG] EC EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x02 [CHG] دستگاه EC: FE: 7E: 10: B1: 92 ارزش تولید کننده: 0x43 [CHG] EC دستگاه: FE: 7E: 10: B1: 92 ManufacturerData مقدار: 0x0b [CHG] EC EC: FE: 7E: 10: B1: 92 ManufacturerData مقدار: 0x01 [CHG] EC دستگاه: FE: 7E: 10: B1: 92 ارزش تولید کننده: 0x6f

آدرس MAC را ضبط کنید ، این مورد باید در اسکریپت پایتون وارد شود تا دستگاههای ناخواسته Bluetooth LE فیلتر شود

مرحله 6: اسکریپت پایتون را اضافه کنید

یک نسخه از اسکریپت پایتون در دسترس است:

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

در اینجا همان فایل است ، هنگام کپی به دندانه توجه کنید:

همچنین آدرس MAC را در فایل پایتون به روز کنید تا با آدرس سنسور به دست آمده از نتیجه اسکن مطابقت داشته باشد.

# این برنامه یک نرم افزار رایگان است: می توانید آن را مجدداً توزیع کرده و یا اصلاح کنید

# آن تحت شرایط مجوز عمومی GNU که توسط منتشر شده است

# بنیاد نرم افزار آزاد ، نسخه 3 مجوز ، یا

# (به دلخواه شما) هر نسخه بعدی.

#

# این برنامه به امید مفید بودن توزیع می شود ،

# اما بدون هیچ گونه گارانتی ؛ حتی بدون ضمانت ضمنی از

# بازرگانی یا تناسب برای یک هدف خاص. را ببینید

# مجوز عمومی GNU برای جزئیات بیشتر.

#

# شما باید کپی مجوز عمومی GNU را دریافت کرده باشید

# همراه با این برنامه. اگر نه ، ببینید.

# bscan.py - اسکنر ساده بلوتوث LE و استخراج کننده داده

از وارد کننده اسکنر bluepy.btle ، DefaultDelegate

زمان واردات

pymysql را وارد کنید

وارد کردن ساختار

نام میزبان = 'localhost'

نام کاربری = 'datasrc'

رمز عبور = 'datasrc000'

پایگاه داده = 'SensorBug'

#آدرس MAC سنسور را از محل جستجو وارد کنید

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

SENSOR_LOCATION = ["گاراژ" ، "نمای بیرونی"]

کلاس DecodeErrorException (استثنا):

def _init _ (خود ، ارزش):

self.value = مقدار

def _str _ (خود):

return repr (self.value)

کلاس ScanDelegate (DefaultDelegate):

def _init _ (خود):

DefaultDelegate._ init _ (خود)

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

if isNewDev:

چاپ "دستگاه کشف شده" ، dev.addr

elif isNewData:

print "Received new data from"، dev.addr

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

جدول #blesensor تاریخ ، زمان ، addr ، مکان ، دما ، accero است

cur = conn.cursor ()

dostr = 'INSERT INTO VALUES data (CURRENT_DATE ()، NOW ()،٪ s،٪ s،٪ s،٪ s)؛'

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

conn.commit ()

اسکنر = اسکنر (). withDelegate (ScanDelegate ())

myConnection = pymysql.connect (host = name host، user = user name، passwd = password، db = database)

ManuDataHex =

ReadLoop = درست است

تلاش كردن:

while (ReadLoop):

دستگاه ها = scanner.scan (2.0)

ManuData = ""

برای dev در دستگاه ها:

ورودی = 0

AcceroData = 0

AcceroType = 0

TempData = 0

برای saddr در SENSOR_ADDRESS:

ورودی += 1

if (dev.addr == saddr):

چاپ "دستگاه٪ s (٪ s) ، RSSI =٪ d dB"٪ (dev.addr ، dev.addrType ، dev.rssi)

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION [ورودی-1]

for (adtype، desc، value) در dev.getScanData ():

چاپ "٪ s =٪ s"٪ (نزول ، مقدار)

if (desc == "سازنده"):

ManuData = مقدار

if (ManuData == ""):

چاپ "هیچ داده ای دریافت نشده ، پایان رمزگشایی"

ادامه هید

#چاپ ManuData

برای i ، j در zip (ManuData [:: 2] ، ManuData [1:: 2]):

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

#شروع به رمزگشایی داده های خام تولید کننده کنید

if ((ManuDataHex [0] == 0x85) و (ManuDataHex [1] == 0x00)):

چاپ "بایت سرصفحه 0x0085 پیدا شد"

دیگری:

چاپ "بایت سرصفحه 0x0085 یافت نشد ، رمزگشایی متوقف می شود"

ادامه هید

#پرش از عمده/صغیر

#ایندکس 5 0x3c است ، میزان باتری را مشخص کرده و پیکربندی کنید #

if (ManuDataHex [4] == 0x3c):

BatteryLevel = ManuDataHex [5]

ConfigCounter = ManuDataHex [6]

idx = 7

#چاپ "TotalLen:" + str (len (ManuDataHex))

while (idx <len (ManuDataHex)):

#چاپ "Idx:" + str (idx)

#چاپ "داده:" + hex (ManuDataHex [idx])

if (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) + "٪"

چاپ "Config Counter:" + str (ConfigCounter)

چاپ "Accelero Data:" + hex (AcceleroType) + "" + hex (AcceleroData)

چاپ "Temp Data:" + str (TempData)

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

ReadLoop = غلط

به جز DecodeErrorException:

عبور

مرحله 7: اسکریپت پایتون را آزمایش کنید

اسکریپت باید به صورت ریشه اجرا شود ، بنابراین:

$ 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 Data: 0x2 0x2 Temp Data: 16.5625

مرحله 8: Python Scrip را به Crontab اضافه کنید

اسکریپت پایتون باید به صورت ریشه اجرا شود ، بنابراین اگر می خواهید داده ها را به طور خودکار ضبط کنید ، باید به crontab ریشه اضافه شود. برای این مثال ، من هر 20 دقیقه اسکریپت را اجرا می کنم از دستور استفاده کنید:

$ sudo crontab -e

# این فایل را ویرایش کنید تا وظایفی را که توسط cron اجرا می شوند معرفی کنید.

# # هر وظیفه ای که باید اجرا شود باید از طریق یک خط واحد تعریف شود # که با فیلدهای مختلف زمان انجام کار را نشان می دهد # و چه دستوراتی برای کار # اجرا شود برای تعریف زمان می توانید مقادیر مشخصی را برای # دقیقه (m) ، ساعت (h) ، روز ماه (dom) ، ماه (mon) ، # و روز هفته (dow) یا از "*" در این زمینه ها استفاده کنید (برای "هر"). # # توجه داشته باشید که کارها شروع می شوند بر اساس تصور سیستم cron # daemon از زمان و مناطق زمانی. # # خروجی مشاغل 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 * * * * پایتون /home/pi/bscan.py

خودشه. اسکریپت پایتون در فاصله زمانی منظم اجرا می شود و خروجی را در پایگاه داده SQL کدگذاری می کند

مرحله 9: اضافی: SensorBug را برای Position Sensing Output پیکربندی کنید

Extra: پیکربندی SensorBug برای Position Sensing Output
Extra: پیکربندی SensorBug برای Position Sensing Output
Extra: پیکربندی SensorBug برای Position Sensing Output
Extra: پیکربندی SensorBug برای Position Sensing Output

امکان پیکربندی SensorBug در Android برای خروجی حسگر موقعیت در حالی که اگر دستگاه به طور مستقیم ایستاده باشد ، مقدار 0x02 است اگر موقعیت X یا Y بالا باشد ، تا زمانی که محور Z بالا یا پایین نباشد ، فرقی نمی کند. ساده ترین راه برای انجام این کار استفاده از LightBlue App است. SensorBug باید در منوی اسکن نشان داده شود. دستگاهی را که می خواهید پیکربندی کنید انتخاب کنید ، برای پیکربندی شتاب سنج به ویژگی های GATT بروید UUID: 9DC84838-7619-4F09-A1CE-DDCF63225B11

مشاهده تصویر: یک رشته پیکربندی جدید بنویسید:

010d3f02020000002d00000002 رشته پیکربندی را برای تأیید نوشتن مجدد بخوانید. این شتاب سنج را برای تشخیص موقعیت فعال می کند.

توصیه شده: