Talaan ng mga Nilalaman:

Subaybayan at Itala ang Temperatura Sa Bluetooth LE at RaspberryPi: 9 Mga Hakbang (na may Mga Larawan)
Subaybayan at Itala ang Temperatura Sa Bluetooth LE at RaspberryPi: 9 Mga Hakbang (na may Mga Larawan)

Video: Subaybayan at Itala ang Temperatura Sa Bluetooth LE at RaspberryPi: 9 Mga Hakbang (na may Mga Larawan)

Video: Subaybayan at Itala ang Temperatura Sa Bluetooth LE at RaspberryPi: 9 Mga Hakbang (na may Mga Larawan)
Video: 30 лучших советов и рекомендаций по Windows 10 на 2020 год 2024, Hulyo
Anonim
Subaybayan at Itala ang Temperatura Sa Bluetooth LE at RaspberryPi
Subaybayan at Itala ang Temperatura Sa Bluetooth LE at RaspberryPi
Subaybayan at Itala ang Temperatura Sa Bluetooth LE at RaspberryPi
Subaybayan at Itala ang Temperatura Sa Bluetooth LE at RaspberryPi

Ang itinuturo na ito ay tungkol sa kung paano pagsamahin ang isang multi-node temperatura monitoring system na may Bluetooth LE sensor bug mula sa Blue Radios (BLEHome) at RaspberryPi 3BThanks sa pagbuo ng pamantayang Bluetooth LE, madali na ngayong magagamit ang mga mababang power wireless sensor sa merkado. para sa napakababang gastos at maaaring tumakbo sa isang solong coin cell nang maraming buwan nang paisa-isa. Isa sa mga sensor na kinuha ko ay mula sa Blue Radio na tinatawag na Sensor Bugs. Nagkakahalaga ng humigit-kumulang na $ 25 sa Amazon, ito ay isang aparato na Bluetooth LE na may Temperatura sensor, light sensor at accerometer na lahat ay nabubuo sa isang maliit na yunit na maaaring makipag-usap nang walang wireless. Ito ay isang perpektong tugma para sa Raspberry Pi 3B, na bumuo ng suporta para sa Bluetooth LE radio.

Hakbang 1: I-setup ang Raspberry Pi

Ang unang hakbang ay upang makakuha ng isang gumaganang pag-setup ng Raspberry Pi. Sundin ang tagubilin mula sa website ng Raspberry Pi, i-load ang Raspbian sa isang SD card, ipasok sa Raspberry Pi at i-boot ito. Itinakda ko ang aking system sa bersyon ng Raspbian Stretch Lite (No GUI) Nob 2017. I-set up ang WiFi kung kinakailangan, mas gusto kong ayusin ang time zone sa kasalukuyang time zone sa halip na UTC. Maaari mong gawin ito kahit na ang utos: $ sudo dpkg-reconfigure tzdataRest ng tagubilin ipagpalagay na ang pag-set up ay tapos na kahit na ang linya ng command interface.

Hakbang 2: Pagse-set up ng MySQL sa Raspberry Pi

Kapaki-pakinabang na magkaroon ng isang lokal na database na naka-install upang maiimbak ang lahat ng mga nakuhang data. Ang pag-install ng MySQL sa Raspberry Pi ay napakadali. Hindi rin mahirap baguhin ang script upang kumonekta sa isang SQL server sa labas, maaari mong laktawan ang hakbang na ito kung nais mong gumamit ng isang SQL server sa network. Maraming mga tagubilin sa net, iminumungkahi ko ito: https:// www.stewright.me/2014/06/tutorial-install-…

Kapag na-install na ang SQL server, maaari mong gamitin ang MySQL CLI client upang lumikha ng gumagamit, database at talahanayan. Upang ipasok ang MySQL CLI, gamitin ang utos:

$ sudo mysql -uroot-pFirst, lumikha ng isang lokal na gumagamit upang magsingit ng nakuhang data:> GUMAWA NG USER 'datasrc' @ 'localhost' IDENTIFYED BY 'datasrc000'; Susunod, lumikha ng isang database at talahanayan:> GUMAWA NG DATABASE SensorBug; Pagse-set up ng gumagamit pahintulot:> bigyan ANG LAHAT NG PRIVILEGES SA SensorBug. * SA 'datasrc' @ 'localhost'; Ngayon magdagdag ng isang bagong talahanayan sa database. Para sa halimbawang ito, magdaragdag ako ng isang talahanayan na may mga sumusunod na haligi: DATE, TIME, ADDRESS, LOCATION, TEMPERATURE at ACCEROMETER

  • PETSA / PANAHON - Ito ang petsa at oras na naitala ang data
  • ADDRESS - Ito ang MAC ng SensorBug kung saan nakuha ang mensahe
  • LOKASYON - Isang nababasa na string ng tao upang ipahiwatig kung saan matatagpuan ang sensor
  • TEMPERATURE - Ito ang naitala na temperatura
  • ACCELE - Ito ang halaga ng output ng accelerometer, kapaki-pakinabang para sa pag-record ng posisyon ng sensor (kung pinagana)

Ang utos na ginagawa ito ay:> GAMITIN ang SensorBug; > GUMAWA ng data ng TABLE (petsa DATE, oras TIME, address TINYTEXT, lokasyon TINYTEXT, temperatura FLOAT, accele INT); Ngayon handa na ang database, maaari tayong magpatuloy sa pag-set up ng mga sensorBugs.

Hakbang 3: Pag-set up ng SensorBugs

Ang mga sensor bug ay medyo maayos na maliliit na aparato. Sa kasamaang palad, ang tagagawa ay nagbigay lamang ng IOS app para sa pag-program nito. Huwag kailanman mas kaunti, posible pa ring makipagtulungan dito kung mayroon ka lamang isang Android device. Unang hakbang, ipares ang aparato sa isang telepono. Nang walang pagpapares ng aparato, ang SensorBug ay hindi mag-a-advertise ng data. Sinubukan kong tingnan kung magagawa ko ito nang direkta sa RaspberryPi, sa kasamaang palad, tila ang driver ng Bluetooth LE sa RaspberryPi ay pang-eksperimento pa rin at naglalaman ng mga bug upang mapigilan ito mula sa pagpapares sa mga aparatong Bluetooth LE. Maaaring ayusin ito ng hinaharap na bersyon ng driver ng blueZ, ngunit tulad ng kasalukuyang pagsulat, walang paraan upang ipares ang SensorBug sa RaspberryPi. Sa kabutihang palad, hindi namin kailangang ipares ang aparato upang makuha ang nai-advertise nitong data. Ang tanging bagay na kailangan namin ay isang telepono upang mai-configure ang SensorBug. Bilang default, magsisimulang mag-advertise ang data ng temperatura ng SensorBug sa pagitan ng 1s sa sandaling ito ay ipinares sa isang aparato. Para sa data ng temperatura ng pagkuha, iyon lang ang kailangan. Kung balak mong palawakin upang magamit ang posisyon o light sensor, kaysa sa pagsasaayos ay kailangan ang aparato. Para sa nagsisimula, ipares namin ang aparato at idiskonekta. Ito ay magiging sapat para sa layunin ng pagkuha ng temperatura. Magsimula sa pamamagitan ng pagpindot sa parehong mga pindutan sa SensorBug. Ang asul / berde na LED ay magpikit, na nagpapahiwatig na ito ay pinalakas. Pindutin ang isa sa mga pindutan, ang berdeng LED ay dapat na ilaw, ipahiwatig na ang lakas ay nakabukas. Kung hindi naiilawan ang berdeng LED, pindutin ang parehong pindutan upang subukang muling buksan ang aparato. Pindutin nang matagal ang isa sa mga pindutan hanggang sa magsimulang kumurap ang asul na LED. Ilalagay nito ang aparato sa pares mode. Pumunta sa menu ng pagsasaayos ng Bluetooth sa telepono at hanapin ang SensorBug aparato. Kapag nagpakita ito, piliin ito upang ipares sa aparato. Iyon lang, ngayon ang SensorBug ay pinapagana at ina-advertise ang data ng temperatura

Hakbang 4: Pag-install ng Bluetooth LE Python Wrapper

Susunod na kailangan naming i-install ang library para sa python upang makipag-usap sa Bluetooth LE stack. Ang tagubilin ay matatagpuan dito: https://github.com/IanHarvey/bluepyFor Python 2.7, ito ay kasing simple ng pagpasok ng mga sumusunod na utos:

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

Hakbang 5: I-scan at Alamin ang Address ng SensorBug

Upang malaman ang SensorBug MAC address, gamitin ang utos na ito: $ sudo hcitool lescan Dapat mong makita ang output tulad ng:

EC: FE: 7E: 10: B1: 92 (hindi alam) Kung mayroon kang maraming mga aparato ng Bluetooth blu sa paligid, maaaring mahirap malaman kung alin ang kausap mo. Maaari mong subukan ang blu Bluetoothctl na nagbibigay ng higit pang mga detalye:

$ sudo bluetoothctl [bluetooth] # scan sa [BAGO] Device EC: FE: 7E: 10: B1: 92 SensorBug10B192 [CHG] Device EC: FE: 7E: 10: B1: 92 TagagawaData Key: 0x0085 [CHG] Device EC: FE: 7E: 10: B1: 92 TagagawaMga Halaga ng Data: 0x02 [CHG] Device EC: FE: 7E: 10: B1: 92 Halaga ng GumagawaData: 0x00 [CHG] Device EC: FE: 7E: 10: B1: 92 TagagawaMga Halaga ng Data: 0x3c [CHG] Device EC: FE: 7E: 10: B1: 92 Halaga ng GumagawaData: 0x25 [CHG] Device EC: FE: 7E: 10: B1: 92 Halaga ng GumagawaData: 0x09 [CHG] Device EC: FE: 7E: 10: B1: 92 TagagawaHalaga ng Data: 0x41 [CHG] Device EC: FE: 7E: 10: B1: 92 Halaga ng GumagawaData: 0x02 [CHG] Device EC: FE: 7E: 10: B1: 92 TagagawaMga Halaga ng Data: 0x02 [CHG] Device EC: FE: 7E: 10: B1: 92 Halaga ng GumagawaData: 0x43 [CHG] Device EC: FE: 7E: 10: B1: 92 Halaga ng GumagawaData: 0x0b [CHG] Device EC: FE: 7E: 10: B1: 92 TagagawaData Halaga: 0x01 [CHG] Device EC: FE: 7E: 10: B1: 92 TagagawaMga Halaga ng Data: 0x6f

Itala ang MAC address, kakailanganin itong ipasok sa script ng sawa upang salain ang mga hindi ginustong mga aparato ng Bluetooth LE

Hakbang 6: Idagdag ang Python Script

Ang isang kopya ng script ng Python ay magagamit mula sa:

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

Narito ang parehong file, alagaan ang indent kapag kumopya:

Gayundin, i-update ang MAC address sa python file upang maitugma ang sensor address na nakuha mula sa resulta ng pag-scan.

# Ang program na ito ay libre software: maaari mo itong ipamahagi muli at / o baguhin

# ito sa ilalim ng mga tuntunin ng GNU General Public Lisensya tulad ng nai-publish ng

# ang Libreng Software Foundation, alinman sa bersyon 3 ng Lisensya, o

# (sa iyong pagpipilian) anumang susunod na bersyon.

#

# Ang program na ito ay ipinamamahagi sa pag-asang ito ay magiging kapaki-pakinabang, # ngunit WALANG ANUMANG WARRANTY; nang hindi man ipinahiwatig ang warranty ng

# MERCHANTABILITY o FITNESS PARA SA ISANG KASUNDUAN NA LAYUNIN. Tingnan ang

# GNU Pangkalahatang Lisensya ng Publiko para sa higit pang mga detalye.

#

# Dapat nakatanggap ka ng isang kopya ng GNU General Public Lisensya

# kasama ang program na ito. Kung hindi, kita n'yo.

# bscan.py - Simpleng bluetooth LE scanner at pagkuha ng data

mula sa bluepy.btle import Scanner, DefaultDelegate

oras ng pag-import

i-import ang pymysql

import na istruktura

hostname = 'localhost'

username = 'datasrc'

password = 'datasrc000'

database = 'SensorBug'

# Ipasok ang MAC address ng sensor mula sa lescan

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

SENSOR_LOCATION = ["Garage", "Exterior"]

klase DecodeErrorException (Exception):

def _init _ (sarili, halaga):

self.value = halaga

def _str _ (sarili):

return repr (self.value)

klase ScanDelegate (DefaultDelegate):

def _init _ (sarili):

DefaultDelegate._ init _ (sarili)

def handleDiscovery (sarili, dev, isNewDev, ayNewData):

kung isNewDev:

i-print ang "Natuklasan na aparato", dev.addr

elif ayNewData:

i-print ang "Nakatanggap ng bagong data mula sa", dev.addr

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

Ang talahanayan ng #blesensor ay petsa, oras, addr, lokasyon, temp, accero

cur = conn.cursor ()

dostr = 'INSERT SA data VALUES (CURRENT_DATE (), NGAYON (),% s,% s,% s,% s);'

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

conn.commit ()

scanner = Scanner (). withDelegate (ScanDelegate ())

myConnection = pymysql.connect (host = hostname, user = username, passwd = password, db = database)

ManuDataHex =

ReadLoop = Tama

subukan:

habang (ReadLoop):

mga aparato = scanner.scan (2.0)

ManuData = ""

para sa dev sa mga aparato:

entry = 0

AcceroData = 0

AcceroType = 0

TempData = 0

para sa saddr sa SENSOR_ADDRESS:

entry + = 1

kung (dev.addr == saddr):

i-print ang "Device% s (% s), RSSI =% d dB"% (dev.addr, dev.addrType, dev.rssi)

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION [entry-1]

para sa (adtype, desc, halaga) sa dev.getScanData ():

i-print ang "% s =% s"% (pagbaba, halaga)

kung (desc == "Tagagawa"):

ManuData = halaga

kung (ManuData == ""):

i-print ang "Walang natanggap na data, tapusin ang pag-decode"

magpatuloy

#print ManuData

para sa i, j sa zip (ManuData [:: 2], ManuData [1:: 2]):

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

#Simulan ang pag-decode ng raw na data ng Tagagawa

kung ((ManuDataHex [0] == 0x85) at (ManuDataHex [1] == 0x00)):

i-print ang "Header byte 0x0085 found"

iba pa:

i-print ang "Hindi nahanap ang header byte 0x0085, pag-decode stop"

magpatuloy

#Skip Major / Minor

Ang #Index 5 ay 0x3c, ipahiwatig ang antas ng baterya at config #

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

BatteryLevel = ManuDataHex [5]

ConfigCounter = ManuDataHex [6]

idx = 7

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

habang (idx <len (ManuDataHex)):

#print "Idx:" + str (idx)

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

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

Data ng #Atometometro

idx + = 1

AcceleroType = ManuDataHex [idx]

AcceleroData = ManuDataHex [idx + 1]

idx + = 2

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

Data ng #Temperature

idx + = 1

TempData = ManuDataHex [idx]

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

TempData = TempData * 0.0625

idx + = 2

iba pa:

idx + = 1

i-print ang "Address ng Device:" + KasalukuyangDevAddr

i-print ang "Lokasyon ng Device:" + KasalukuyangDevLoc

i-print ang "Antas ng Baterya:" + str (BatteryLevel) + "%"

i-print ang "Config Counter:" + str (ConfigCounter)

i-print ang "Data ng Accelero:" + hex (AcceleroType) + "" + hex (AcceleroData)

i-print ang "Temp Data:" + str (TempData)

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

ReadLoop = Mali

maliban sa DecodeErrorException:

pumasa

Hakbang 7: Subukan ang Python Script

Ang script ay dapat na patakbuhin sa root, kaya:

$ sudo python bscan.pyDiskubre ang aparato ec: 6e: 7e: 10: b1: 92 Device ec: 6e: 7e: 10: b1: 92 (publiko), RSSI = -80 dB Mga Bandila = 06 Hindi kumpleto ang 16b Mga Serbisyo = 0a18 Tagagawa = 850002003c25094102024309016f Nakita ang header byte 0x0085 Address ng Device: ec: 6e: 7e: 10: b1: 92 Lokasyon ng Device: Antas ng Baterya ng Garage: 37% Config Counter: 9 Data ng Accero: 0x2 0x2 Temp Data: 16.5625

Hakbang 8: Idagdag ang Python Scrip sa Crontab

Ang script ng python ay dapat na patakbuhin sa ugat, kaya kung nais mong awtomatikong makuha ang data, kakailanganin itong idagdag sa crontab ng ugat. Para sa halimbawang ito, pinapatakbo ko ang script tuwing 20 minuto Gumamit ng utos:

$ sudo crontab -e

# I-edit ang file na ito upang ipakilala ang mga gawain na tatakbo sa pamamagitan ng cron.

# # Ang bawat gawain na tatakbo ay dapat na tinukoy sa pamamagitan ng isang solong linya # na nagpapahiwatig na may iba't ibang mga patlang kung kailan tatakbo ang gawain # at kung anong utos ang tatakbo para sa gawain # # Upang tukuyin ang oras na maaari kang magbigay ng mga kongkretong halaga para sa # minuto (m), oras (h), araw ng buwan (dom), buwan (mon), # at araw ng linggo (dow) o paggamit ng '*' sa mga patlang na ito (para sa 'anumang'). # # Pansinin na magsisimula ang mga gawain batay sa sistema ng cron na # daemon's paniwala ng oras at timezones. # # Output ng mga trabaho sa crontab (kabilang ang mga error) ay ipinadala sa pamamagitan ng # email sa gumagamit na ang crontab file ay kabilang (maliban kung nai-redirect). # # Halimbawa, maaari kang magpatakbo ng isang backup ng lahat ng iyong mga account ng gumagamit # alas-5 ng umaga bawat linggo kasama ang: # 0 5 * * 1 tar -zcf /var/backups/home.tgz / home / # # Para sa karagdagang impormasyon tingnan ang mga manu-manong pahina ng crontab (5) at cron (8) # # mh dom mon dow utos 0 * * * * python /home/pi/bscan.py 20 * * * * python /home/pi/bscan.py 40 * * * * python / home /pi /bscan.py

Ayan yun. Ang script ng sawa ay tatakbo sa regular na agwat at muling ibabalik ang output sa database ng SQL

Hakbang 9: Dagdag: I-configure ang SensorBug para sa Output ng Sensing ng Posisyon

Dagdag: I-configure ang SensorBug para sa Position Sensing Output
Dagdag: I-configure ang SensorBug para sa Position Sensing Output
Dagdag: I-configure ang SensorBug para sa Output ng Sensing ng Posisyon
Dagdag: I-configure ang SensorBug para sa Output ng Sensing ng Posisyon

Posibleng i-configure ang SensorBug sa Android para sa output sensing output Para sa pagbabago ng posisyon sa sensing, tinatawag ding Garage door.sensing, matutukoy ng SensorBug kung ang aparato ay nakatayo nang patayo o nahuhiga nang patag. Kapag ang aparato ay flat, ang halagang naitala ay 0x20 habang kung ang aparato ay nakatayo nang patayo, ang halaga ay 0x02 Hindi ito naiiba kung ang posisyon ng X o Y ay pataas, basta ang Z axis ay hindi pataas o pababa. Ang pinakamadaling paraan upang gawin ito ay ang paggamit ng LightBlue App. Dapat ipakita ang SensorBug sa menu ng pag-scan. Piliin ang aparato na nais mong i-configure, pumunta sa mga katangian ng GATT para sa pagsasaayos ng Accelerometer UUID: 9DC84838-7619-4F09-A1CE-DDCF63225B11

Tingnan ang imahe: Sumulat ng isang bagong string ng pagsasaayos:

010d3f02020000002d00000002Basahin muli ang string ng pagsasaayos upang kumpirmahin ang pagsulat. Nagbibigay-daan ito sa accelerometer para sa sensasyong posisyon.

Inirerekumendang: