Mundarija:

Bluetooth LE va RaspberryPi yordamida haroratni kuzatish va yozib olish: 9 qadam (rasmlar bilan)
Bluetooth LE va RaspberryPi yordamida haroratni kuzatish va yozib olish: 9 qadam (rasmlar bilan)

Video: Bluetooth LE va RaspberryPi yordamida haroratni kuzatish va yozib olish: 9 qadam (rasmlar bilan)

Video: Bluetooth LE va RaspberryPi yordamida haroratni kuzatish va yozib olish: 9 qadam (rasmlar bilan)
Video: Использование термопары MAX6675 с ESP32 Bluetooth 2024, Iyul
Anonim
Bluetooth LE va RaspberryPi yordamida haroratni kuzating va yozib oling
Bluetooth LE va RaspberryPi yordamida haroratni kuzating va yozib oling
Bluetooth LE va RaspberryPi yordamida haroratni kuzating va yozib oling
Bluetooth LE va RaspberryPi yordamida haroratni kuzating va yozib oling

Bluetooth LE standarti ishlab chiqilgani tufayli Blue LE (BLEHome) va RaspberryPi 3B Bluetooth LE sensori bilan ko'p tugunli haroratni nazorat qilish tizimini qanday o'rnatish kerakligi haqida ma'lumot berildi, hozirda bozorda kam quvvatli simsiz sensorlar mavjud. juda arzon narxda va bir vaqtning o'zida bir tanga katakchada ishlashi mumkin. Men olgan sensorlarimdan biri Blue Radio -dan Sensor Bugs deb nomlangan. Amazonda taxminan 25 dollar turadi, bu harorat sensori, yorug'lik sensori va akserometrli Bluetooth LE qurilmasi bo'lib, u simsiz aloqada bo'ladigan kichik qurilmaga aylanadi..

1 -qadam: Raspberry Pi -ni o'rnating

Birinchi qadam - Raspberry Pi -ni ishlaydigan sozlash. Raspberry Pi veb -saytidagi ko'rsatmalarni bajaring, Raspbian -ni SD -kartaga yuklang, Raspberry Pi -ga joylashtiring va uni ishga tushiring. Men o'z tizimimni Raspbian Stretch Lite (GUI yo'q) versiyasi bilan 2017 yil noyabrda sozlayman. Agar kerak bo'lsa, Wi -Fi -ni o'rnating. vaqt zonasi UTC o'rniga joriy vaqt mintaqasiga. Siz buni buyruq yordamida qilishingiz mumkin: $ sudo dpkg-reconfigure tzdataRest buyrug'i, sozlash buyruq qatori interfeysi orqali amalga oshirilgan deb hisoblaydi.

2 -qadam: Raspberry Pi -da MySQL -ni o'rnatish

Barcha olingan ma'lumotlarni saqlash uchun mahalliy ma'lumotlar bazasini o'rnatish foydali bo'ladi. MySQL -ni Raspberry Pi -ga o'rnatish juda oson. SQL serveriga tashqi tomondan ulanish uchun skriptni o'zgartirish ham qiyin emas, agar siz tarmoqdagi SQL serveridan foydalanmoqchi bo'lsangiz, bu bosqichni o'tkazib yuborishingiz mumkin. Tarmoqda ko'plab ko'rsatmalar mavjud, men buni taklif qilaman: https:// www.stewright.me/2014/06/tutorial-install-…

SQL serveri o'rnatilgandan so'ng, foydalanuvchi, ma'lumotlar bazasi va jadval yaratish uchun MySQL CLI mijozidan foydalanishingiz mumkin. MySQL CLI -ga kirish uchun buyruqdan foydalaning:

$ sudo mysql -uroot -pFirst, olingan ma'lumotlarni kiritish uchun mahalliy foydalanuvchi yarating:> CREATE USER 'datasrc'@'localhost' IDRIFYED BY 'datarc000'; Keyin, ma'lumotlar bazasi va jadval yarating:> CREATE DATABASE SensorBug; Foydalanuvchini sozlash ruxsat:> SensorBug -dagi barcha imtiyozlarni berish.* TO 'datasrc'@'localhost' ga; Endi ma'lumotlar bazasiga yangi jadval qo'shing. Bu misol uchun men quyidagi ustunlar bilan jadval qo'shmoqchiman: DATE, TIME, MANZIL, JOY, TEMPERATURA va ACCEROMETER

  • DATE/TIME - Bu ma'lumotlar yozilgan sana va vaqt
  • MANZIL - bu SensorBug MAC -dan xabar olinadi
  • JOYLASH - Sensor qaerda joylashganligini ko'rsatish uchun odam o'qiy oladigan satr
  • TEMPERATURA - Bu yozilgan harorat
  • ACCELE - bu sensorlar holatini yozib olish uchun foydali bo'lgan akselerometr chiqishining qiymati.

Buni bajaradigan buyruq:> USS SensorBug; > JADVAL ma'lumotlarini yarating (sana DATE, vaqt TIME, manzil TINYTEXT, joylashuvi TINYTEXT, harorat FLOAT, accele INT); Endi ma'lumotlar bazasi tayyor, biz sensorBugs -ni o'rnatishga o'tishimiz mumkin.

3 -qadam: SensorBugs -ni o'rnatish

Sensor xatolar - bu juda chiroyli qurilmalar. Afsuski, ishlab chiqaruvchi uni dasturlash uchun faqat IOS ilovasini taqdim etdi. Hech bo'lmaganda, agar sizda faqat Android qurilmasi bo'lsa, u bilan ishlash mumkin, birinchi navbatda, qurilmani telefon bilan ulang. Qurilmani ulamasdan SensorBug ma'lumotlarni reklama qilmaydi. Men buni to'g'ridan -to'g'ri RaspberryPi bilan qila olamanmi, demoqchi bo'ldim, afsuski, RaspberryPi -dagi Bluetooth LE drayveri hali ham eksperimental bo'lib ko'rinadi va Bluetooth LE qurilmalari bilan bog'lanishiga yo'l qo'ymaslik uchun xatolar mavjud. BlueZ drayverining kelgusi versiyasi buni tuzatishi mumkin edi, lekin hozirgi yozuvga ko'ra, SensorBugni RaspberryPi bilan bog'lashning iloji yo'q. Bizga kerak bo'lgan yagona narsa - SensorBug -ni sozlash uchun telefon. Odatiy bo'lib, SensorBug qurilma bilan bog'langanidan keyin harorat ma'lumotlarini 1 soniya oralig'ida reklama qila boshlaydi. Harorat ma'lumotlarini olish uchun bu kerak. Agar siz joylashishni yoki yorug'lik sensorini kengaytirishni rejalashtirmoqchi bo'lsangiz, konfiguratsiyadan ko'ra qurilma kerak bo'ladi. Boshlash uchun biz qurilmani ulaymiz va uzamiz. Bu haroratni o'lchash uchun etarli bo'ladi. SensorBug -ning ikkala tugmachasini bosib boshlash. Ko'k/yashil LED yonadi, bu uning yoqilganligini ko'rsatadi. Tugmalardan birini bosing, yashil LED yonishi kerak, bu quvvat yoqilganligini bildiradi. Agar yashil LED yonmagan bo'lsa, qurilmani qayta yoqish uchun ikkala tugmani ham bosing. Bu qurilmani juftlik rejimiga o'tkazadi. Telefonning Bluetooth konfiguratsiya menyusiga o'ting va SensorBug qurilmasini qidiring. U paydo bo'lgandan so'ng, uni qurilmaga ulash uchun tanlang. Bu SensorBug quvvat manbai bo'lib, harorat ma'lumotlarini reklama qiladi.

4 -qadam: Bluetooth LE Python o'rash moslamasini o'rnatish

Python uchun Bluetooth LE stack bilan suhbatlashish uchun biz kutubxonani o'rnatishimiz kerak. Ko'rsatmani bu erda topishingiz mumkin: https://github.com/IanHarvey/bluepy Python 2.7 uchun quyidagi buyruqlarni kiritish oson:

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

5 -qadam: SensorBug manzilini skanerlang va toping

SensorBug MAC manzilini bilish uchun quyidagi buyruqni ishlating: $ sudo hcitool lescan Siz shunday chiqishni ko'rishingiz kerak:

EC: FE: 7E: 10: B1: 92 (noma'lum) Agar atrofingizda bluetooth LE qurilmalari ko'p bo'lsa, qaysi biri bilan gaplashayotganingizni aniqlash qiyin bo'lishi mumkin. Siz batafsil ma'lumot beradigan bluetoothctl -ni sinab ko'rishingiz mumkin:

$ sudo bluetoothctl [bluetooth]# skaner [YANGI] qurilmasi EC: FE: 7E: 10: B1: 92 SensorBug10B192 [CHG] Qurilma EC: FE: 7E: 10: B1: 92 Ishlab chiqaruvchi Ma'lumotlar kaliti: 0x0085 [CHG] EC qurilmasi: FE: 7E: 10: B1: 92 Ishlab chiqaruvchi ma'lumotlari qiymati: 0x02 [CHG] Qurilma EC: FE: 7E: 10: B1: 92 Ishlab chiqaruvchi Ma'lumotlar qiymati: 0x00 [CHG] Qurilma EC: FE: 7E: 10: B1: 92 Ishlab chiqaruvchi Ma'lumotlar qiymati: 0x3c [CHG] Qurilmasi EC: FE: 7E: 10: B1: 92 Ishlab chiqaruvchi Ma'lumotlar qiymati: 0x25 [CHG] EC: FE: 7E: 10: B1: 92 Ishlab chiqaruvchi Ma'lumotlari: 0x09 [CHG] Qurilmasi EC: FE: 7E: 10: B1: 92 Ishlab chiqaruvchi Ma'lumotlar qiymati: 0x41 [CHG] Qurilma EC: FE: 7E: 10: B1: 92 Ishlab chiqaruvchi Ma'lumotlar qiymati: 0x02 [CHG] Qurilma EC: FE: 7E: 10: B1: 92 Ishlab chiqaruvchi Ma'lumotlari: 0x02 [CHG] Qurilmasi EC: FE: 7E: 10: B1: 92 Ishlab chiqaruvchi Ma'lumotlar qiymati: 0x43 [CHG] Qurilma EC: FE: 7E: 10: B1: 92 Ishlab chiqaruvchi Ma'lumotlar qiymati: 0x0b [CHG] Qurilma EC: FE: 7E: 10: B1: 92 Ishlab chiqaruvchi Ma'lumotlari Qiymat: 0x01 [CHG] Qurilma EC: FE: 7E: 10: B1: 92 Ishlab chiqaruvchi Ma'lumotlar qiymati: 0x6f

MAC manzilini yozib oling, kiruvchi Bluetooth LE qurilmalarini filtrlash uchun uni python skriptiga kiritish kerak.

6 -qadam: Python skriptini qo'shing

Python skriptining nusxasi quyidagi manzilda mavjud:

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

Mana o'sha fayl, nusxa ko'chirishda indentga e'tibor bering:

Bundan tashqari, python faylidagi MAC manzilini skanerlash natijasidan olingan sensor manziliga mos keladigan tarzda yangilang.

# Bu dastur - bu bepul dasturiy ta'minot: uni qayta tarqatish va/yoki o'zgartirish mumkin

# tomonidan nashr etilgan GNU General Public License shartlariga muvofiq

# Bepul dasturiy ta'minot jamg'armasi, Litsenziyaning 3 -versiyasi yoki

# (sizning xohishingiz bo'yicha) har qanday keyingi versiya.

#

# Bu dastur foydali bo'ladi degan umidda tarqatilgan.

# lekin BARCHA KAFOLATSIZ; kafolatlanmagan holda ham

# MAXSUS MAQSADGA SOTISh yoki moslik. Ga qarang

Qo'shimcha ma'lumot olish uchun # GNU General Public License.

#

# Siz GNU General Public License litsenziyasining nusxasini olishingiz kerak edi

# bu dastur bilan birga. Agar yo'q bo'lsa, qarang.

# bscan.py - oddiy bluetooth LE skaneri va ma'lumotlar chiqaruvchisi

bluepy.btle import skaneridan, DefaultDelegate

import vaqti

pymysql import qilish

import tuzilmasi

xost nomi = "localhost"

foydalanuvchi nomi = "ma'lumotlar bazasi"

parol = "datarc000"

ma'lumotlar bazasi = 'SensorBug'

#Leskandan sensorning MAC manzilini kiriting

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

SENSOR_LOCATION = ["Garaj", "Tashqi"]

DecodeErrorException klassi (istisno):

def _init _ (o'zini, qiymati):

self.value = qiymat

def _str _ (o'zini):

qaytish qaytarish (o'z -o'zini baholash)

ScanDelegate klassi (DefaultDelegate):

def _init _ (o'zi):

DefaultDelegate._ init _ (o'zini)

def handleDiscovery (o'zini, dev, isNewDev, isNewData):

agar isNewDev:

"Kashf etilgan qurilma" ni chop eting, dev.addr

elif isNewData:

chop etish "Yangi ma'lumotlar olindi", dev.addr

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

#blesensor jadvali - bu sana, vaqt, manzil, manzil, temp, accero

cur = ulanish kursori ()

dostr = 'INSERT INTO data VALUES (CURRENT_DATE (), NOW (), %s, %s, %s, %s);'

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

ulanish.komitasi ()

skaner = Scanner (). withDelegate (ScanDelegate ())

myConnection = pymysql.connect (xost = xost nomi, foydalanuvchi = foydalanuvchi nomi, passwd = parol, db = ma'lumotlar bazasi)

ManuDataHex =

ReadLoop = To'g'ri

harakat qilib ko'ring:

while (ReadLoop):

qurilmalar = skaner.scan (2.0)

Manu ma'lumotlar = ""

qurilmalar uchun:

kirish = 0

AcceroData = 0

AcceroType = 0

TempData = 0

saddr uchun SENSOR_ADDRESS:

kirish += 1

agar (dev.addr == saddr):

"Qurilma %s (%s), RSSI = %d dB" %(dev.addr, dev.addrType, dev.rssi) chop eting

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION [kirish-1]

dev.getScanData () da (adtype, desc, value) uchun:

"%s = %s" %chop eting (kamayish, qiymat)

agar (tushum == "Ishlab chiqaruvchi"):

ManuData = qiymat

agar (ManuData == ""):

chop etish "Ma'lumotlar qabul qilinmadi, dekodlash tugadi"

davom ettirish

#ManuData -ni chop etish

i, j in zip uchun (ManuData [:: 2], ManuData [1:: 2]):

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

#Ishlab chiqaruvchi ma'lumotlarini dekodlashni boshlang

agar ((ManuDataHex [0] == 0x85) va (ManuDataHex [1] == 0x00)):

chop etish "0x0085 sarlavhali bayt topildi"

boshqa:

chop etish "0x0085 sarlavhali bayt topilmadi, dekodlash to'xtadi"

davom ettirish

#Katta/kichikni o'tkazib yuboring

#Index 5 - 0x3c, batareya quvvati va konfiguratsiyasini ko'rsating #

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

BatteryLevel = ManuDataHex [5]

ConfigCounter = ManuDataHex [6]

idx = 7

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

while (idx <len (ManuDataHex)):

#print "Idx:" + str (idx)

#print "Ma'lumotlar:" + olti burchakli (ManuDataHex [idx])

agar (ManuDataHex [idx] == 0x41):

#Akserometr ma'lumotlari

idx += 1

AcceleroType = ManuDataHex [idx]

AcceleroData = ManuDataHex [idx+1]

idx += 2

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

#Harorat ma'lumotlari

idx += 1

TempData = ManuDataHex [idx]

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

TempData = TempData * 0.0625

idx += 2

boshqa:

idx += 1

"Qurilma manzili:" + CurrentDevAddr -ni chop eting

"Qurilmaning joylashuvi:" + CurrentDevLoc -ni chop eting

"Batareya darajasi:" + str (BatteryLevel) + "%" ni chop eting.

chop etish "Config Counter:" + str (ConfigCounter)

"Accelero Data:" + hex (AcceleroType) + "" + hex (AcceleroData) ni chop eting

"Harorat ma'lumotlari:" + str (TempData) ni chop eting

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

ReadLoop = noto'g'ri

DecodeErrorExceptiondan tashqari:

o'tish

7 -qadam: Python skriptini sinab ko'ring

Skript ildizda ishlashi kerak, shuning uchun:

$ sudo python bscan.pyKashf etilgan qurilma ec: 6e: 7e: 10: b1: 92 qurilma ec: 6e: 7e: 10: b1: 92 (ommaviy), RSSI = -80 dB bayroqlar = 06 tugallanmagan 16b xizmatlar = 0a18 Ishlab chiqaruvchi = 850002003c25094102024309016f Sarlavha bayti 0x0085 topildi Qurilma manzili: ec: 6e: 7e: 10: b1: 92 Qurilmaning joylashuvi: Garaj batareyasi darajasi: 37% Konfiguratsiya hisoblagichi: 9 Accero Ma'lumotlari: 0x2 0x2 Temp Ma'lumotlari: 16.5625

8 -qadam: Python skriptini Crontab -ga qo'shing

Python skriptini root -da ishga tushirish kerak, shuning uchun agar siz ma'lumotlarni avtomatik ravishda yozib olishni xohlasangiz, uni root crontab -ga qo'shish kerak bo'ladi. Bu misol uchun men skriptni har 20 daqiqada ishga tushiraman: Buyruqdan foydalaning:

$ sudo crontab -e

# Cron tomonidan bajariladigan vazifalarni kiritish uchun ushbu faylni tahrirlang.

# # Har bir bajariladigan vazifa bitta satr orqali aniqlanishi kerak #, vazifa qachon bajarilishi va # # vazifasi uchun qaysi buyruq bajarilishi kerakligini ko'rsatib, vaqtni aniq belgilash uchun # daqiqa (m), soat (h), oy kuni (dom), oy (dushanba), # va haftaning kuni (dow) yoki bu sohalarda '*' dan foydalaning ("har qanday" uchun). # # Vazifalar boshlanishiga e'tibor bering cron tizimi # demonning vaqt va vaqt zonalari haqidagi tushunchasiga asoslangan. # # Crontab ishlarining natijalari (shu jumladan xatolar) crontab fayli tegishli bo'lgan foydalanuvchiga # elektron pochta orqali yuboriladi (qayta yo'naltirilmasa). # # Masalan, siz har hafta ertalab soat 5 da barcha foydalanuvchi hisoblaringizning zaxira nusxasini ishga tushirishingiz mumkin: # 0 5 * * 1 tar -zcf /var/backups/home.tgz/home/ # # Qo'shimcha ma'lumot olish uchun qarang. crontab (5) va cron (8) qo'lda sahifalari # # mh dom mon dow buyrug'i 0 * * * * python /home/pi/bscan.py 20 * * * * python /home/pi/bscan.py 40 * * * * python /home/pi/bscan.py

Bo'ldi shu. Python skripti ma'lum vaqt oralig'ida ishlaydi va chiqishni SQL ma'lumotlar bazasiga qayta yozadi

9 -qadam: Qo'shimcha: SensorBug -ni joylashishni aniqlash chiqishi uchun sozlang

Qo'shimcha: SensorBug -ni joylashishni aniqlash chiqishi uchun sozlang
Qo'shimcha: SensorBug -ni joylashishni aniqlash chiqishi uchun sozlang
Qo'shimcha: SensorBug -ni joylashishni aniqlash chiqishi uchun sozlang
Qo'shimcha: SensorBug -ni joylashishni aniqlash chiqishi uchun sozlang

Android -dagi SensorBug -ni joylashishni sezish chiqishi uchun sozlash mumkin. Garaj eshigi deb ataladigan pozitsiyani o'zgartirish uchun SensorBug qurilma tik turganini yoki tekis yotishini aniqlaydi. Qurilma tekis bo'lganda, yozilgan qiymat 0x20 bo'ladi. Agar qurilma tik turgan bo'lsa, bu qiymat 0x02, agar Z o'qi yuqoriga yoki pastga bo'lmasa, X yoki Y pozitsiyasi yuqoriligida farq qilmaydi, buning eng oson yo'li - LightBlue ilovasidan foydalanish. SensorBug skanerlash menyusida ko'rsatilishi kerak. Siz sozlamoqchi bo'lgan qurilmani tanlang, UUID Accelerometer konfiguratsiyasi uchun GATT xususiyatlariga o'ting: 9DC84838-7619-4F09-A1CE-DDCF63225B11

Rasmga qarang: Yangi konfiguratsiya qatorini yozing:

010d3f02020000002d00000002Yozishni tasdiqlash uchun konfiguratsiya satrini o'qing.

Tavsiya: