جدول المحتويات:

مراقبة وتسجيل درجة الحرارة باستخدام Bluetooth LE و RaspberryPi: 9 خطوات (بالصور)
مراقبة وتسجيل درجة الحرارة باستخدام Bluetooth LE و RaspberryPi: 9 خطوات (بالصور)

فيديو: مراقبة وتسجيل درجة الحرارة باستخدام Bluetooth LE و RaspberryPi: 9 خطوات (بالصور)

فيديو: مراقبة وتسجيل درجة الحرارة باستخدام Bluetooth LE و RaspberryPi: 9 خطوات (بالصور)
فيديو: Raspberry Pi 4B في علبة Argon ONE M.2 مع 128 جيجا بايت SSD ، تجميع خادم لـ Home Assistant 2024, يوليو
Anonim
مراقبة وتسجيل درجة الحرارة مع Bluetooth LE و RaspberryPi
مراقبة وتسجيل درجة الحرارة مع Bluetooth LE و RaspberryPi
مراقبة وتسجيل درجة الحرارة مع Bluetooth LE و RaspberryPi
مراقبة وتسجيل درجة الحرارة مع Bluetooth LE و RaspberryPi

يدور هذا الدليل حول كيفية تجميع نظام مراقبة درجة الحرارة متعدد العقد مع خطأ مستشعر Bluetooth LE من Blue Radios (BLEHome) و RaspberryPi 3B بفضل تطوير معيار Bluetooth LE ، هناك الآن مستشعرات لاسلكية منخفضة الطاقة متوفرة في السوق بتكلفة منخفضة للغاية ويمكن تشغيلها على خلية عملة واحدة لعدة أشهر في كل مرة. أحد هذه المستشعرات التي التقطتها هو من Blue Radio يسمى Sensor Bugs. يكلف حوالي 25 دولارًا على Amazon ، وهو جهاز Bluetooth LE مزود بمستشعر درجة الحرارة ومستشعر الضوء ومقياس التسارع ، وكلها مدمجة في وحدة صغيرة يمكنها الاتصال لاسلكيًا ، وهذا تطابق مثالي لـ Raspberry Pi 3B ، الذي يدعم راديو Bluetooth LE.

الخطوة 1: إعداد Raspberry Pi

الخطوة الأولى هي الحصول على إعداد Raspberry Pi صالح للعمل. اتبع التعليمات الواردة من موقع Raspberry Pi على الويب ، وقم بتحميل Raspbian على بطاقة SD ، ثم أدخله في Raspberry Pi وقم بتشغيله ، وقم بإعداد نظامي باستخدام إصدار Raspbian Stretch Lite (بدون واجهة مستخدم رسومية) في نوفمبر 2017 ، قم بإعداد WiFi إذا لزم الأمر ، أفضل تعديل المنطقة الزمنية للمنطقة الزمنية الحالية بدلاً من التوقيت العالمي المنسق (UTC). يمكنك القيام بذلك من خلال الأمر: sudo dpkg-recfigure tzdataRest من التعليمات تفترض أن الإعداد قد تم من خلال واجهة سطر الأوامر.

الخطوة 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' IDENTIFYED BY 'datasrc000' ؛ بعد ذلك ، قم بإنشاء قاعدة بيانات وجدول:> إنشاء قاعدة بيانات SensorBug ؛ إعداد المستخدم إذن:> منح جميع الامتيازات في SensorBug. * إلى "datasrc" @ "localhost" ؛ أضف الآن جدولاً جديدًا إلى قاعدة البيانات. في هذا المثال ، سأضيف جدولًا يحتوي على الأعمدة التالية: التاريخ والوقت والعنوان والموقع ودرجة الحرارة و ACCEROMETER

  • التاريخ / الوقت - هذا هو تاريخ ووقت تسجيل البيانات
  • العنوان - هذا هو MAC الخاص بجهاز SensorBug الذي يتم التقاط الرسالة منه
  • الموقع - سلسلة يمكن للبشر قراءتها للإشارة إلى مكان وجود المستشعر
  • درجة الحرارة - هذه هي درجة الحرارة المسجلة
  • ACCELE - هذه هي قيمة خرج مقياس التسارع ، وهي مفيدة لتسجيل موضع المستشعر (إذا تم تمكينه)

الأمر الذي يقوم بهذا هو:> USE SensorBug؛ > إنشاء بيانات الجدول (التاريخ التاريخ والوقت والوقت والعنوان TINYTEXT والموقع TINYTEXT ودرجة الحرارة FLOAT وتسريع INT) ؛ الآن قاعدة البيانات جاهزة ، يمكننا الانتقال إلى إعداد sensorBugs.

الخطوة 3: إعداد SensorBugs

تعد أخطاء المستشعر أجهزة صغيرة أنيقة جدًا. لسوء الحظ ، قدمت الشركة المصنعة تطبيق IOS فقط لبرمجته. على الإطلاق ، لا يزال من الممكن العمل معه إذا كان لديك جهاز Android فقط. الخطوة الأولى ، قم بإقران الجهاز بهاتف. بدون إقران الجهاز ، لن يعلن SensorBug عن البيانات. حاولت معرفة ما إذا كان بإمكاني القيام بذلك مباشرة مع RaspberryPi ، لسوء الحظ ، يبدو أن برنامج تشغيل Bluetooth LE على RaspberryPi لا يزال قيد التجربة ويحتوي على أخطاء لمنعه من الاقتران بأجهزة Bluetooth LE. قد يصلح الإصدار المستقبلي من برنامج التشغيل blueZ هذا ، ولكن مثل الكتابة الحالية ، لا توجد طريقة لإقران SensorBug مع RaspberryPi. لحسن الحظ ، لا نحتاج إلى إقران الجهاز لالتقاط بياناته المعلن عنها. الشيء الوحيد الذي نحتاجه هو هاتف لتهيئة SensorBug. بشكل افتراضي ، سيبدأ SensorBug في الإعلان عن بيانات درجة الحرارة بفاصل 1 ثانية بمجرد إقرانه بجهاز. لالتقاط بيانات درجة الحرارة ، هذا كل ما هو مطلوب. إذا كنت تخطط للتوسيع لاستخدام الموضع أو مستشعر الضوء ، فستكون هناك حاجة إلى تكوين الجهاز. بالنسبة للمبتدئين ، سنقوم بإقران الجهاز ونفصل الاتصال. سيكون هذا جيدًا بما يكفي لغرض التقاط درجة الحرارة ، ابدأ بالضغط على كلا الزرين الموجودين في SensorBug. سيومض مؤشر LED باللون الأزرق / الأخضر ، مما يشير إلى أنه قيد التشغيل. اضغط على أحد الأزرار ، يجب أن يضيء مؤشر LED الأخضر ، للإشارة إلى أن الطاقة قيد التشغيل. إذا لم يضيء مؤشر LED الأخضر ، فاضغط على كلا الزرين لمحاولة تشغيل الجهاز مرة أخرى ، ثم اضغط مع الاستمرار على أحد الأزرار حتى يبدأ مؤشر LED الأزرق في الوميض. سيؤدي هذا إلى وضع الجهاز في وضع الإقران ، انتقل إلى قائمة تكوين Bluetooth على الهاتف وابحث عن جهاز SensorBug. بمجرد ظهوره ، حدده لإقرانه بالجهاز ، هذا كل شيء ، الآن يتم تشغيل SensorBug ويعلن عن بيانات درجة الحرارة

الخطوة 4: تثبيت Bluetooth LE Python Wrapper

بعد ذلك ، نحتاج إلى تثبيت مكتبة python للتحدث إلى Bluetooth LE stack. يمكن العثور على التعليمات هنا: https://github.com/IanHarvey/bluepy بالنسبة إلى Python 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 (غير معروف) إذا كان لديك الكثير من أجهزة Bluetooth LE ، فقد يكون من الصعب معرفة الجهاز الذي تتحدث إليه. يمكنك تجربة bluetoothctl الذي يعطي مزيدًا من التفاصيل:

$ sudo bluetoothctl [bluetooth] # scan on [جديد] الجهاز 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: 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 ، يجب إدخاله في برنامج Python النصي لتصفية أجهزة Bluetooth LE غير المرغوب فيها

الخطوة 6: أضف نص بايثون

نسخة من نص بايثون متاح من:

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

هنا هو نفس الملف ، اعتن بالمسافة البادئة عند النسخ:

أيضًا ، قم بتحديث عنوان MAC في ملف python لمطابقة عنوان المستشعر الذي تم الحصول عليه من نتيجة الفحص.

# هذا البرنامج برنامج مجاني: يمكنك إعادة توزيعه و / أو تعديله

# بموجب شروط رخصة جنو العمومية كما تم نشرها بواسطة

# مؤسسة البرمجيات الحرة ، إما الإصدار 3 من الترخيص ، أو

# (حسب اختيارك) أي إصدار لاحق.

#

# يتم توزيع هذا البرنامج على أمل أن يكون مفيدا ،

# لكن دون أي ضمان ؛ حتى بدون الضمان الضمني لـ

# القابلية للتسويق أو الملاءمة لغرض معين. انظر

# رخصة جنو العمومية لمزيد من التفاصيل.

#

# يجب أن تكون قد تلقيت نسخة من رخصة جنو العمومية العامة

# مع هذا البرنامج. إذا لم يكن كذلك ، انظر.

# bscan.py - ماسح ضوئي بسيط لـ Bluetooth LE ومستخرج البيانات

من bluepy.btle استيراد الماسح ، مندوب افتراضي

وقت الاستيراد

استيراد pymysql

استيراد هيكل

اسم المضيف = "مضيف محلي"

اسم المستخدم = 'datasrc'

كلمة المرور = 'datasrc000'

قاعدة البيانات = 'SensorBug'

# أدخل عنوان MAC الخاص بالمستشعر من lescan

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

SENSOR_LOCATION = ["مرآب" ، "خارجي"]

فئة DecodeErrorException (استثناء):

def _init _ (ذاتي ، قيمة):

self.value = القيمة

def _str _ (ذاتي):

عودة repr (self.value)

فئة ScanDelegate (مندوب افتراضي):

def _init _ (ذاتي):

المندوب الافتراضي._ init _ (ذاتي)

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

إذا كان NewDev:

طباعة "Discovered device" ، dev.addr

elif isNewData:

طباعة "تم استلام البيانات الجديدة من" ، dev.addr

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

جدول #blesensor هو التاريخ ، الوقت ، العنوان ، الموقع ، درجة الحرارة ، أكيرو

cur = conn.cursor ()

dostr = 'أدخل في قيم البيانات (CURRENT_DATE () ، الآن () ،٪ s ،٪ s ،٪ s ،٪ s) ؛'

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

conn.commit ()

الماسح الضوئي = الماسح الضوئي (). مع المندوب (ScanDelegate ())

myConnection = pymysql.connect (المضيف = اسم المضيف ، المستخدم = اسم المستخدم ، passwd = كلمة المرور ، db = قاعدة البيانات)

ManuDataHex =

ReadLoop = صحيح

محاولة:

بينما (ReadLoop):

الأجهزة = scanner.scan (2.0)

ManuData = ""

للتطوير في الأجهزة:

دخول = 0

AcceroData = 0

نوع AcceroType = 0

TempData = 0

للسدر في 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"٪ (وصف ، قيمة)

إذا (وصف == "الشركة المصنعة"):

ManuData = القيمة

إذا (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 ، توقف فك التشفير"

استمر

# تخطي التخصص / الصغرى

#Index 5 هو 0x3c ، حدد مستوى البطارية والتكوين #

إذا كان (ManuDataHex [4] == 0x3c):

BatteryLevel = ManuDataHex [5]

ConfigCounter = ManuDataHex [6]

معرف x = 7

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

بينما (idx <len (ManuDataHex)):

#print "Idx:" + str (idx)

#print "البيانات:" + ست عشري (ManuDataHex [idx])

إذا كان (ManuDataHex [idx] == 0x41):

# بيانات مقياس التسارع

المعرف + = 1

AcceleroType = ManuDataHex [idx]

AcceleroData = ManuDataHex [idx + 1]

معرف + = 2

إليف (ManuDataHex [idx] == 0x43):

# بيانات درجة الحرارة

المعرف + = 1

TempData = ManuDataHex [idx]

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

TempData = TempData * 0.0625

معرف + = 2

آخر:

المعرف + = 1

طباعة "عنوان الجهاز" + CurrentDevAddr

اطبع "موقع الجهاز:" + CurrentDevLoc

طباعة "Battery Level:" + str (BatteryLevel) + "٪"

طباعة "Config Counter:" + str (ConfigCounter)

طباعة "Accelero Data:" + hex (AcceleroType) + "" + hex (AcceleroData)

طباعة "بيانات درجة الحرارة:" + str (TempData)

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

ReadLoop = خطأ

باستثناء DecodeErrorException:

يمر

الخطوة السابعة: اختبر نص بايثون

يجب تشغيل البرنامج النصي في الجذر ، لذلك:

$ sudo python bscan.pyDiscovered device ec: 6e: 7e: 10: b1: 92 ec: 6e: 7e: 10: b1: 92 (عام) ، RSSI = -80 dB Flags = 06 غير مكتمل 16b Services = 0a18 الشركة المصنعة = 850002003c25094102024309016f تم العثور على بايت الرأس 0x0085 عنوان الجهاز: ec: 6e: 7e: 10: b1: 92 موقع الجهاز: المرآب مستوى البطارية: 37٪ عداد التكوين: 9 بيانات Accero: 0x2 0x2 بيانات درجة الحرارة: 16.5625

الخطوة 8: أضف Python Scrip إلى Crontab

يجب تشغيل نص 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

هذا كل شيء. سيتم تشغيل نص python النصي على فترات منتظمة وإعادة ترميز الإخراج في قاعدة بيانات SQL

الخطوة 9: إضافي: تكوين SensorBug لمخرجات استشعار الموضع

نشاط إضافي: قم بتكوين SensorBug لمخرجات استشعار الموضع
نشاط إضافي: قم بتكوين SensorBug لمخرجات استشعار الموضع
نشاط إضافي: قم بتكوين SensorBug لمخرجات استشعار الموضع
نشاط إضافي: قم بتكوين SensorBug لمخرجات استشعار الموضع

من الممكن تكوين SensorBug على Android لإخراج استشعار الموضع ، بالنسبة لاستشعار تغيير الموضع ، ما يسمى باب المرآب. الاستشعار ، سوف يكتشف SensorBug ما إذا كان الجهاز يقف في وضع مستقيم أو مستلقٍ ، وعندما يكون الجهاز مسطحًا ، تكون القيمة المسجلة هي 0x20 أثناء وقوف الجهاز في وضع مستقيم ، تكون القيمة 0x02 ولا تفرق إذا كان الموضع X أو Y لأعلى ، طالما أن المحور Z ليس لأعلى أو لأسفل ، وأسهل طريقة للقيام بذلك هي استخدام تطبيق LightBlue. يجب أن يظهر SensorBug في قائمة الفحص. حدد الجهاز الذي ترغب في تكوينه ، انتقل إلى خصائص GATT لتكوين مقياس التسارع UUID: 9DC84838-7619-4F09-A1CE-DDCF63225B11

انظر الصورة: اكتب سلسلة تكوين جديدة:

010d3f02020000002d00000002 أعد قراءة سلسلة التكوين لتأكيد الكتابة ، مما يتيح مقياس التسارع لاستشعار الموضع.

موصى به: