INHOUDSOPGAWE:

Monitor en teken temperatuur op met Bluetooth LE en RaspberryPi: 9 stappe (met foto's)
Monitor en teken temperatuur op met Bluetooth LE en RaspberryPi: 9 stappe (met foto's)

Video: Monitor en teken temperatuur op met Bluetooth LE en RaspberryPi: 9 stappe (met foto's)

Video: Monitor en teken temperatuur op met Bluetooth LE en RaspberryPi: 9 stappe (met foto's)
Video: Mini-pc op Intel N100 - AC8-N, krachtig ventilatorloos platform, Home Assistant OS-installatie 2024, November
Anonim
Monitor en teken temperatuur op met Bluetooth LE en RaspberryPi
Monitor en teken temperatuur op met Bluetooth LE en RaspberryPi
Monitor en teken temperatuur op met Bluetooth LE en RaspberryPi
Monitor en teken temperatuur op met Bluetooth LE en RaspberryPi

Hierdie instruksie handel oor die samestelling van 'n multi-node temperatuurmoniteringstelsel met Bluetooth LE-sensorfout van Blue Radios (BLEHome) en RaspberryPi 3B Danksy die ontwikkeling van die Bluetooth LE-standaard, is daar nou maklik draadlose sensors met lae krag beskikbaar op die mark teen baie lae koste en kan maande op 'n slag op 'n enkele muntsel werk. Een van hierdie sensors wat ek opgetel het, is van Blue Radio genaamd Sensor Bugs. Dit kos ongeveer $ 25 op Amazon, dit is 'n Bluetooth LE -toestel met temperatuursensor, ligsensor en versnellingsmeter, alles ingebou in 'n klein eenheid wat draadloos kan kommunikeer..

Stap 1: Stel Raspberry Pi op

Die eerste stap is om 'n werkende Raspberry Pi -opstelling te kry. Volg die instruksies van die webwerf van Raspberry Pi, laai Raspbian op 'n SD -kaart, steek dit in Raspberry Pi en begin dit. Ek stel my stelsel op met Raspbian Stretch Lite (geen GUI) weergawe November 2017. Stel WiFi op indien nodig, ek verkies om die tydsone na die huidige tydsone in plaas van UTC. U kan dit doen alhoewel die opdrag: $ sudo dpkg-reconfigure tzdataRes van die instruksie veronderstel dat die opstelling gedoen is deur die opdragreëlkoppelvlak.

Stap 2: Die opstel van MySQL op Raspberry Pi

Dit is nuttig om 'n databasis plaaslik te laat installeer om al die vasgelegde data te stoor. MySQL op Raspberry Pi is baie maklik om te installeer. Dit is ook nie moeilik om die script aan te pas om ekstern aan 'n SQL -bediener te koppel nie; u kan hierdie stap oorslaan as u 'n SQL -bediener op die netwerk wil gebruik. Daar is baie instruksies op die internet, ek stel dit voor: https:// www.stewright.me/2014/06/tutorial-install-…

Sodra die SQL -bediener geïnstalleer is, kan u MySQL CLI -kliënt gebruik om gebruikers, databasis en tabel te skep. Om MySQL CLI in te voer, gebruik die opdrag:

$ sudo mysql -uroot -p Skep eerstens 'n plaaslike gebruiker om vasgelegde data in te voeg:> CREATE USER 'datasrc'@'localhost' IDENTIFYED BY 'datasrc000'; Maak dan 'n databasis en tabel:> CREATE DATABASE SensorBug; Stel die gebruiker op toestemming:> GEEN ALLE VOORREGTE OP SensorBug.* TO 'datasrc'@'localhost'; Voeg nou 'n nuwe tabel by die databasis. Vir hierdie voorbeeld gaan ek 'n tabel byvoeg met die volgende kolomme: DATUM, TYD, ADRES, LIGGING, TEMPERATUUR en ACCEROMETER

  • DATUM/TYD - Dit is die datum en tyd waarop die data aangeteken is
  • ADRES - Dit is die MAC van die SensorBug waarvan die boodskap afgeneem is
  • LIGGING - 'n Menslike leesbare string om aan te dui waar die sensor geleë is
  • TEMPERATUUR - Dit is die geregistreerde temperatuur
  • ACCELE - Dit is die waarde van die versnellingsmeteruitset, nuttig om sensorposisie op te neem (indien geaktiveer)

Die opdrag wat dit doen is:> GEBRUIK SensorBug; > SKEP TAFEL data (datum DATUM, tyd TYD, adres TINYTEXT, ligging TINYTEXT, temperatuur FLOAT, accele INT); Nou is die databasis gereed, ons kan voortgaan met die opstel van die sensor Bugs.

Stap 3: Die opstel van die SensorBugs

Die sensorbugs is redelik netjiese toestelle. Ongelukkig het die vervaardiger slegs 'n IOS -program verskaf om dit te programmeer. Desondanks is dit steeds moontlik om daarmee te werk as u slegs 'n Android -toestel het. Koppel die toestel in die eerste plek met 'n telefoon. Sonder om die toestel te koppel, sal die SensorBug geen data adverteer nie. Ek het probeer kyk of ek dit direk met RaspberryPi kan doen, maar dit lyk ongelukkig asof die Bluetooth LE -bestuurder op RaspberryPi nog steeds eksperimenteel is en foute bevat om te voorkom dat dit met Bluetooth LE -toestelle koppel. Toekomstige weergawe van die blueZ -bestuurder kan dit moontlik regstel, maar soos die huidige skrywe is, is daar geen manier om die SensorBug met RaspberryPi te koppel nie. Gelukkig hoef ons nie die toestel te koppel om die geadverteerde data op te neem nie. Die enigste ding wat ons nodig het, is 'n telefoon om die SensorBug op te stel. Die SensorBug sal standaard temperatuurdata met 1s interval begin adverteer sodra dit met 'n toestel gekoppel is. Dit is alles wat nodig is vir die vaslegging van temperatuurdata. As u van plan is om uit te brei om die posisie of ligsensor te gebruik, is die toestel nodig as die konfigurasie. Om mee te begin, koppel ons die toestel en ontkoppel. Dit sal goed genoeg wees vir temperatuuropname. Begin deur op beide knoppies op die SensorBug te druk. Die blou/groen LED sal flikker, wat aandui dat dit aangeskakel is. Druk op een van die knoppies, die groen LED moet brand, dui aan dat die krag aan is. As die groen LED nie brand nie, druk beide knoppies om die toestel weer aan te skakel. Hou een van die knoppies ingedruk totdat die blou LED begin knip. Dit bring die toestel in 'n paar -modus. Gaan na die Bluetooth -konfigurasie -kieslys op die telefoon en soek die SensorBug -toestel. Sodra dit verskyn, kies dit om met die toestel te koppel.

Stap 4: Installeer die Bluetooth LE Python Wrapper

Vervolgens moet ons die biblioteek installeer vir python om met Bluetooth LE stack te praat. Die instruksie kan hier gevind word: https://github.com/IanHarvey/bluepy Vir Python 2.7 is dit so eenvoudig soos om die volgende opdragte in te voer:

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

Stap 5: Skandeer en vind die adres van die SensorBug uit

Om die SensorBug MAC -adres uit te vind, gebruik hierdie opdrag: $ sudo hcitool lescan U moet uitset sien soos:

EC: FE: 7E: 10: B1: 92 (onbekend) As u baie Bluetooth LE -toestelle in die omgewing het, kan dit moeilik wees om uit te vind met watter een u praat. U kan bluetoothctl probeer wat meer besonderhede gee:

$ sudo bluetoothctl [bluetooth]# scan op [NEW] Device EC: FE: 7E: 10: B1: 92 SensorBug10B192 [CHG] Device EC: FE: 7E: 10: B1: 92 Manufacturer Data Key: 0x0085 [CHG] Device EC: FE: 7E: 10: B1: 92 Vervaardiger Data Waarde: 0x02 [CHG] Toestel EC: FE: 7E: 10: B1: 92 Vervaardiger Data Waarde: 0x00 [CHG] Toestel EC: FE: 7E: 10: B1: 92 Vervaardiger Data Waarde: 0x3c [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x25 [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x09 [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x41 [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x02 [CHG] Device EC: FE: 7E: 10: B1: 92 Manufacturer Data Value: 0x02 [CHG] Device EC: FE: 7E: 10: B1: 92 VervaardigerGegevenswaarde: 0x43 [CHG] Toestel EC: FE: 7E: 10: B1: 92 Vervaardigersdata Waarde: 0x0b [CHG] Toestel EC: FE: 7E: 10: B1: 92 Vervaardigerdata Waarde: 0x01 [CHG] Toestel EC: FE: 7E: 10: B1: 92 Vervaardiger Data Waarde: 0x6f

Teken die MAC -adres op, dit moet in die python -script ingevoer word om ongewenste Bluetooth LE -toestelle uit te filter

Stap 6: Voeg die Python Script by

'N Afskrif van die Python -skrif is beskikbaar by:

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

Hier is dieselfde lêer, let op die inspringing wanneer u kopieer:

Werk ook die MAC -adres in die python -lêer by sodat dit pas by die sensoradres wat uit die skanderingsresultaat verkry is.

# Hierdie program is gratis sagteware: u kan dit herversprei en/of verander

# dit onder die voorwaardes van die GNU General Public License soos gepubliseer deur

# die Free Software Foundation, óf weergawe 3 van die lisensie, óf

# (na u keuse) enige latere weergawe.

#

# Hierdie program word versprei in die hoop dat dit nuttig sal wees, # maar SONDER ENIGE GARANTIE; sonder selfs die geïmpliseerde waarborg van

# VERKOOPBAARHEID of GESKIKTHEID VIR 'N BESONDERE DOEL. Sien die

# GNU General Public License vir meer besonderhede.

#

# U moes 'n afskrif van die GNU General Public License ontvang het

# saam met hierdie program. Indien nie, kyk.

# bscan.py - Eenvoudige Bluetooth LE -skandeerder en data -extractor

vanaf bluepy.btle invoer skandeerder, DefaultDelegate

invoer tyd

voer pymysql in

invoerstruktuur

hostname = 'localhost'

gebruikersnaam = 'datasrc'

password = 'datasrc000'

database = 'SensorBug'

#Voer die MAC -adres van die sensor van die lescan in

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

SENSOR_LOCATION = ["Garage", "Exterior"]

klas DecodeErrorException (Uitsondering):

def _init _ (self, waarde):

self.waarde = waarde

def _str _ (self):

retoer repr (self.waarde)

klas ScanDelegate (DefaultDelegate):

def _init _ (self):

DefaultDelegate._ init _ (self)

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

as is NewDev:

druk "Ontdekte toestel", dev.addr

elif isNewData:

print "Ontvang nuwe data van", dev.addr

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

#blesensortabel is datum, tyd, adres, ligging, temp, accero

cur = conn.cursor ()

dostr = 'INVOER IN GEGEVENSWAARDES (CURRENT_DATE (), NOU (), %s, %s, %s, %s);'

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

conn.commit ()

skandeerder = skandeerder (). metDelegate (ScanDelegate ())

myConnection = pymysql.connect (host = gasheernaam, gebruiker = gebruikersnaam, passwd = wagwoord, db = databasis)

ManuDataHex =

ReadLoop = Waar

probeer:

terwyl (ReadLoop):

toestelle = skandeerder.scan (2.0)

ManuData = ""

vir toestelle:

inskrywing = 0

AcceroData = 0

AcceroType = 0

TempData = 0

vir saddr in SENSOR_ADDRESS:

inskrywing += 1

as (dev.addr == saddr):

druk "Toestel %s (%s), RSSI = %d dB" %(dev.addr, dev.addrType, dev.rssi)

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION [entry-1]

vir (adtype, desc, value) in dev.getScanData ():

druk " %s = %s" %(desc, waarde)

if (desc == "Vervaardiger"):

ManuData = waarde

as (ManuData == ""):

druk "Geen data ontvang nie, einde dekodering"

aanhou

#afdruk ManuData

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

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

#Begin met die dekodering van die rou vervaardigerdata

as ((ManuDataHex [0] == 0x85) en (ManuDataHex [1] == 0x00)):

druk "Header byte 0x0085 gevind"

anders:

druk "Kop -byte 0x0085 nie gevind nie, dekodering stop"

aanhou

#Skip Major/Minor

#Index 5 is 0x3c, dui batteryvlak aan en konfigureer #

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

BatteryLevel = ManuDataHex [5]

ConfigCounter = ManuDataHex [6]

idx = 7

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

terwyl (idx <len (ManuDataHex)):

#print "Idx:" + str (idx)

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

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

#Accerometer data

idx += 1

AcceleroType = ManuDataHex [idx]

AcceleroData = ManuDataHex [idx+1]

idx += 2

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

#Temperatuurdata

idx += 1

TempData = ManuDataHex [idx]

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

TempData = TempData * 0.0625

idx += 2

anders:

idx += 1

druk "Toesteladres:" + CurrentDevAddr

druk "Toestelligging:" + CurrentDevLoc

druk "Battery Level:" + str (BatteryLevel) + "%"

druk "Config Counter:" + str (ConfigCounter)

druk "Accelero Data:" + hex (AcceleroType) + "" + hex (AcceleroData)

druk "Temp Data:" + str (TempData)

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

ReadLoop = Onwaar

behalwe DecodeErrorException:

slaag

Stap 7: Toets die Python -script

Die script moet in root uitgevoer word, dus:

$ sudo python bscan.py Ontdekte toestel ec: 6e: 7e: 10: b1: 92 Toestel ec: 6e: 7e: 10: b1: 92 (publiek), RSSI = -80 dB Flags = 06 Onvolledige 16b-dienste = 0a18 Vervaardiger = 850002003c25094102024309016f Kopbyte 0x0085 gevind Toesteladres: ec: 6e: 7e: 10: b1: 92 Toestelplek: Garage -batteryniveau: 37% Config Counter: 9 Accero Data: 0x2 0x2 Temp Data: 16.5625

Stap 8: Voeg die Python Scrip by die Crontab

Die python -script moet in die wortel uitgevoer word, dus as u die data outomaties wil opneem, moet dit by die wortel se crontab gevoeg word. Vir hierdie voorbeeld voer ek elke 20 minute die script uit. Gebruik die opdrag:

$ sudo crontab -e

# Wysig hierdie lêer om take voor te stel wat deur cron uitgevoer moet word.

# # Elke taak wat uitgevoer moet word, moet deur 'n enkele reël gedefinieer word # wat met verskillende velde aandui wanneer die taak uitgevoer gaan word # en watter opdrag om vir die taak uit te voer # # Om die tyd te definieer, kan u konkrete waardes vir # minuut (m), uur (h), dag van maand (dom), maand (ma), # en dag van die week (dow) of gebruik '*' in hierdie velde (vir 'enige'). # # Let op dat take begin sal word gebaseer op die cron -stelsel # daemon se idee van tyd en tydsones. # # Uitset van die crontab -take (insluitend foute) word per # e -pos gestuur aan die gebruiker aan wie die crontab -lêer behoort (tensy dit herlei word). # # U kan byvoorbeeld elke week om 5 uur 'n rugsteun van al u gebruikersrekeninge voer met: # 0 5 * * 1 tar -zcf /var/backups/home.tgz/home/ # # Vir meer inligting, sien die handleiding bladsye van crontab (5) en 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

Dis dit. Die python -skrip word gereeld uitgevoer en die uitvoer na die SQL -databasis herkodeer

Stap 9: Ekstra: Stel die SensorBug op vir posisiesensor -uitvoer

Ekstra: Stel die SensorBug op vir posisiesensor -uitvoer
Ekstra: Stel die SensorBug op vir posisiesensor -uitvoer
Ekstra: Stel die SensorBug op vir posisiesensor -uitvoer
Ekstra: Stel die SensorBug op vir posisiesensor -uitvoer

Dit is moontlik om die SensorBug op Android te konfigureer vir posisiesensoruitset Vir posverandering -waarneming, die sogenaamde garagedeur. Sensor, sal die SensorBug opspoor of die toestel regop staan of plat lê. As die toestel plat is, is die aangetekende waarde 0x20 terwyl die toestel regop staan, is die waarde 0x02 Dit maak nie onderskeid as die X- of Y -posisie omhoog is nie, solank die Z -as nie op of af is nie. Die maklikste manier om dit te doen, is deur die LightBlue -app te gebruik. Die SensorBug moet in die skanderingskieslys verskyn. Kies die toestel wat u wil konfigureer, gaan na die GATT-eienskappe vir die versnelling van die versneller UUID: 9DC84838-7619-4F09-A1CE-DDCF63225B11

Sien prent: Skryf 'n nuwe konfigurasiestring:

010d3f02020000002d00000002Lees die konfigurasiestring terug om die skryf te bevestig.

Aanbeveel: