Innholdsfortegnelse:

Overvåk og registrer temperatur med Bluetooth LE og RaspberryPi: 9 trinn (med bilder)
Overvåk og registrer temperatur med Bluetooth LE og RaspberryPi: 9 trinn (med bilder)

Video: Overvåk og registrer temperatur med Bluetooth LE og RaspberryPi: 9 trinn (med bilder)

Video: Overvåk og registrer temperatur med Bluetooth LE og RaspberryPi: 9 trinn (med bilder)
Video: Zigbee датчик освещенности, температуры и влажности с экраном на электронных чернилах Moes 2024, Juli
Anonim
Overvåk og registrer temperatur med Bluetooth LE og RaspberryPi
Overvåk og registrer temperatur med Bluetooth LE og RaspberryPi
Overvåk og registrer temperatur med Bluetooth LE og RaspberryPi
Overvåk og registrer temperatur med Bluetooth LE og RaspberryPi

Denne instruksen handler om hvordan du setter sammen et multi-node temperaturovervåkingssystem med Bluetooth LE-sensorfeil fra Blue Radios (BLEHome) og RaspberryPi 3B Takket være utviklingen av Bluetooth LE-standarden, er det nå lett tilgjengelige trådløse sensorer på markedet på markedet for svært lave kostnader og kan kjøres på en enkelt myntcelle i flere måneder om gangen. En av disse sensorene jeg hentet er fra Blue Radio kalt Sensor Bugs. Det koster omtrent $ 25 på Amazon, det er en Bluetooth LE -enhet med temperatursensor, lyssensor og akserometer som alle er bygd inn i en liten enhet som kan kommunisere trådløst. Dette er en perfekt match for Raspberry Pi 3B, som har innebygd støtte for Bluetooth LE -radio.

Trinn 1: Sett opp Raspberry Pi

Første trinn er å få et fungerende Raspberry Pi -oppsett. Følg instruksjonene fra Raspberry Pi -nettstedet, last Raspbian på et SD -kort, sett det inn i Raspberry Pi og start det opp. tidssonen til gjeldende tidssone i stedet for UTC. Du kan gjøre dette om kommandoen: $ sudo dpkg-omkonfigurer tzdata Resten av instruksjonen antar at oppsettet er utført gjennom kommandolinjegrensesnittet.

Trinn 2: Konfigurere MySQL på Raspberry Pi

Det er nyttig å ha en database installert lokalt for å lagre alle fangede data. Det er superenkelt å installere MySQL på Raspberry Pi. Det er heller ikke vanskelig å endre skriptet for å koble til en SQL -server eksternt, du kan hoppe over dette trinnet hvis du ønsker å bruke en SQL -server på nettverket. Det er mange instruksjoner på nettet, jeg foreslår dette: https:// www.stewright.me/2014/06/tutorial-install-…

Når SQL -serveren er installert, kan du bruke MySQL CLI -klienten til å opprette bruker, database og tabell. For å gå inn i MySQL CLI, bruk kommandoen:

$ sudo mysql -uroot -pFørst må du opprette en lokal bruker for å sette inn fangede data:> CREATE USER 'datasrc'@'localhost' IDENTIFISERT AV 'datasrc000'; Lag deretter en database og tabell:> CREATE DATABASE SensorBug; Konfigurere brukeren tillatelse:> TILBUD ALLE PRIVILEGER PÅ SensorBug.* TIL 'datasrc'@'localhost'; Legg nå til en ny tabell i databasen. I dette eksemplet skal jeg legge til en tabell med følgende kolonner: DATE, TIME, ADDRESS, LOCATION, TEMPERATURE og ACCEROMETER

  • DATE/TIME - Dette er datoen og klokkeslettet da dataene blir registrert
  • ADRESSE - Dette er MAC -en til SensorBug meldingen hentes fra
  • LOCATION - En lesbar streng for å indikere hvor sensoren er plassert
  • TEMPERATUR - Dette er den registrerte temperaturen
  • ACCELE - Dette er verdien av akselerometerutgangen, nyttig for registrering av sensorposisjon (hvis aktivert)

Kommandoen som gjør dette er:> BRUK SensorBug; > CREATE TABLE data (dato DATE, time TIME, address TINYTEXT, location TINYTEXT, temperature FLOAT, accele INT); Nå er databasen klar, vi kan gå videre til å sette opp sensorBugs.

Trinn 3: Konfigurere SensorBugs

Sensorbuggene er ganske fine små enheter. Dessverre ga produsenten bare IOS -app for å programmere den. Ikke desto mindre er det fortsatt mulig å jobbe med det hvis du bare har en Android -enhet. Første trinn, par enheten med en telefon. Uten paring av enheten vil SensorBug ikke annonsere data. Jeg prøvde å se om jeg kan gjøre dette direkte med RaspberryPi, dessverre virker det som om Bluetooth LE -driveren på RaspberryPi fremdeles er eksperimentell og inneholder feil for å forhindre at den kobles til Bluetooth LE -enheter. Fremtidig versjon av blueZ -driveren kan fikse dette, men som det er skrevet nå, er det ingen måte å koble SensorBug til RaspberryPi. Heldigvis trenger vi ikke å koble enheten for å fange de annonserte dataene. Det eneste vi trenger er en telefon for å konfigurere SensorBug. Som standard vil SensorBug begynne å annonsere temperaturdata med 1 sekunders intervall når den er paret med en enhet. For å fange temperaturdata er det alt som trengs. Hvis du planlegger å utvide for å bruke posisjonen eller lyssensoren, vil enheten være nødvendig enn konfigurasjon. For start starter vi sammen enheten og kobler fra. Dette vil være bra nok for temperaturregistrering. Start med å trykke på begge knappene på SensorBug. Den blå/grønne LED -en blinker, noe som indikerer at den er slått på. Trykk på en av knappene, den grønne lysdioden skal lyse, indikere at strømmen er på. Hvis den grønne LED -lampen ikke lyser, trykker du på begge knappene for å prøve å slå på enheten igjen. Trykk og hold inne en av knappene til den blå LED -en begynner å blinke. Dette setter enheten i paremodus. Gå til Bluetooth -konfigurasjonsmenyen på telefonen og se etter SensorBug -enheten. Når den vises, velger du den for å koble til enheten. Det er det, nå blir SensorBug aktivert og annonserer temperaturdataene

Trinn 4: Installere Bluetooth LE Python Wrapper

Deretter må vi installere biblioteket for at python skal snakke med Bluetooth LE -stabel. Instruksjonene finner du her: https://github.com/IanHarvey/bluepy For Python 2.7 er det så enkelt som å skrive inn følgende kommandoer:

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

Trinn 5: Skann og finn ut adressen til SensorBug

For å finne ut SensorBug MAC -adressen, bruk denne kommandoen: $ sudo hcitool lescan Du bør se utdata som:

EC: FE: 7E: 10: B1: 92 (ukjent) Hvis du har mange Bluetooth LE -enheter rundt deg, kan det være vanskelig å finne ut hvilken du snakker med. Du kan prøve bluetoothctl som gir flere detaljer:

$ sudo bluetoothctl [bluetooth]# scan on [NEW] Device EC: FE: 7E: 10: B1: 92 SensorBug10B192 [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Key: 0x0085 [CHG] Device EC: FE: 7E: 10: B1: 92 ProdusentDataverdi: 0x02 [CHG] Enhet EC: FE: 7E: 10: B1: 92 ProdusentDataverdi: 0x00 [CHG] Enhet EC: FE: 7E: 10: B1: 92 Produsentdataverdi: 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 ManufacturerData Value: 0x02 [CHG] Device EC: FE: 7E: 10: B1: 92 ProdusentData Verdi: 0x43 [CHG] Enhet EC: FE: 7E: 10: B1: 92 ProdusentData Verdi: 0x0b [CHG] Enhet EC: FE: 7E: 10: B1: 92 ProdusentData Verdi: 0x01 [CHG] Enhet EC: FE: 7E: 10: B1: 92 Produsent Data Verdi: 0x6f

Registrer MAC -adressen, dette må skrives inn i python -skriptet for å filtrere ut uønskede Bluetooth LE -enheter

Trinn 6: Legg til Python Script

En kopi av Python -skriptet er tilgjengelig fra:

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

Her er den samme filen, ta vare på innrykket når du kopierer:

Oppdater også MAC -adressen i python -filen slik at den samsvarer med sensoradressen fra skanneresultatet.

# Dette programmet er gratis programvare: du kan distribuere det og/eller endre det

# det under vilkårene i GNU General Public License som utgitt av

# Free Software Foundation, enten versjon 3 av lisensen, eller

# (etter eget valg) en hvilken som helst senere versjon.

#

# Dette programmet distribueres i håp om at det vil være nyttig, # men UTEN NOEN GARANTI; uten selv den underforståtte garantien til

# SALGSOMHET eller egnethet for et spesifikt formål. Se

# GNU General Public License for flere detaljer.

#

# Du burde ha mottatt en kopi av GNU General Public License

# sammen med dette programmet. Hvis ikke, se.

# bscan.py - Enkel Bluetooth LE -skanner og dataekstraktor

fra bluepy.btle importskanner, DefaultDelegate

importtid

importer pymysql

importere struktur

hostname = 'localhost'

brukernavn = 'datasrc'

password = 'datasrc000'

database = 'SensorBug'

#Skriv inn MAC -adressen til sensoren fra lescan

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

SENSOR_LOCATION = ["Garasje", "Utvendig"]

klasse DecodeErrorException (Unntak):

def _init _ (selv, verdi):

self.value = verdi

def _str _ (self):

retur repr (egenverdi)

klasse ScanDelegate (StandardDelegate):

def _init _ (self):

DefaultDelegate._ init _ (self)

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

if isNewDev:

print "Oppdaget enhet", dev.addr

elif isNewData:

print "Mottatt nye data fra", dev.addr

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

#blesensortabell er dato, klokkeslett, addr, plassering, temp, accero

cur = konn. markør ()

dostr = 'SETT INN I DATAVERDIER (CURRENT_DATE (), NOW (), %s, %s, %s, %s);'

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

conn.commit ()

skanner = Skanner (). withDelegate (ScanDelegate ())

myConnection = pymysql.connect (vert = vertsnavn, bruker = brukernavn, passwd = passord, db = database)

ManuDataHex =

ReadLoop = True

prøve:

mens (ReadLoop):

enheter = scanner.scan (2.0)

ManuData = ""

for enheter i enheter:

oppføring = 0

AcceroData = 0

AcceroType = 0

TempData = 0

for saddr i SENSOR_ADDRESS:

oppføring += 1

hvis (dev.addr == saddr):

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

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION [oppføring-1]

for (adtype, desc, value) i dev.getScanData ():

print " %s = %s" %(desc, verdi)

if (desc == "Produsent"):

ManuData = verdi

if (ManuData == ""):

print "Ingen data mottatt, avslutt dekoding"

Fortsette

#print ManuData

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

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

#Start dekoding av råprodusentdata

hvis ((ManuDataHex [0] == 0x85) og (ManuDataHex [1] == 0x00)):

print "Header byte 0x0085 funnet"

ellers:

print "Header byte 0x0085 ikke funnet, dekodingsstopp"

Fortsette

#Hopp over major/mindre

#Index 5 er 0x3c, angi batterinivå og konfigurasjonsnummer

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

BatteryLevel = ManuDataHex [5]

ConfigCounter = ManuDataHex [6]

idx = 7

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

mens (idx <len (ManuDataHex)):

#print "Idx:" + str (idx)

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

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

#Akserometer -data

idx += 1

AcceleroType = ManuDataHex [idx]

AcceleroData = ManuDataHex [idx+1]

idx += 2

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

#Temperaturdata

idx += 1

TempData = ManuDataHex [idx]

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

TempData = TempData * 0,0625

idx += 2

ellers:

idx += 1

print "Enhetsadresse:" + CurrentDevAddr

print "Enhetsplassering:" + CurrentDevLoc

print "Batterinivå:" + str (BatteryLevel) + "%"

print "Config Counter:" + str (ConfigCounter)

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

print "Temp Data:" + str (TempData)

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

ReadLoop = Falsk

unntatt DecodeErrorException:

sende

Trinn 7: Test ut Python -skriptet

Skriptet må kjøres i root, så:

$ sudo python bscan.pyDiscovered device ec: 6e: 7e: 10: b1: 92 Device ec: 6e: 7e: 10: b1: 92 (public), RSSI = -80 dB Flags = 06 Incomplete 16b Services = 0a18 Produsent = 850002003c25094102024309016f Header -byte 0x0085 funnet Enhetsadresse: ec: 6e: 7e: 10: b1: 92 Enhetsplassering: Garasjebatterinivå: 37% Konfig teller: 9 Accero Data: 0x2 0x2 Temp Data: 16.5625

Trinn 8: Legg til Python Scrip i Crontab

Python -skriptet må kjøres i root, så hvis du vil fange dataene automatisk, må det legges til rotens crontab. For dette eksemplet kjører jeg skriptet hvert 20. minutt Bruk kommandoen:

$ sudo crontab -e

# Rediger denne filen for å introdusere oppgaver som skal kjøres av cron.

# # Hver oppgave som skal kjøres må defineres gjennom en enkelt linje # som angir med forskjellige felt når oppgaven skal kjøres # og hvilken kommando som skal kjøres for oppgaven # # For å definere tiden kan du angi konkrete verdier i # minutt (m), time (h), dag i måneden (dom), måned (man), # og ukedag (dow) eller bruk '*' i disse feltene (for 'noen'). # # Legg merke til at oppgaver vil bli startet basert på crons system # daemons forestilling om tid og tidssoner. # # Utdata fra crontab -jobbene (inkludert feil) sendes via # e -post til brukeren crontab -filen tilhører (med mindre den blir omdirigert). # # For eksempel kan du kjøre en sikkerhetskopi av alle brukerkontoene dine # kl. 5 hver uke med: # 0 5 * * 1 tar -zcf /var/backups/home.tgz/home/ # # For mer informasjon, se manuelle sider med crontab (5) og cron (8) # # mh dom mon dow kommando 0 * * * * python /home/pi/bscan.py 20 * * * * python /home/pi/bscan.py 40 * * * * python /home/pi/bscan.py

Det er det. Python -skriptet kjøres med jevne mellomrom og koder utgangen til SQL -databasen

Trinn 9: Ekstra: Konfigurer SensorBug for posisjonsfølende utgang

Ekstra: Konfigurer SensorBug for posisjonsfølende utgang
Ekstra: Konfigurer SensorBug for posisjonsfølende utgang
Ekstra: Konfigurer SensorBug for posisjonsfølende utgang
Ekstra: Konfigurer SensorBug for posisjonsfølende utgang

Det er mulig å konfigurere SensorBug på Android for posisjonsfølende utgang For posisjonsendringssensing, såkalt garasjeport. Sensor, vil SensorBug oppdage om enheten står oppreist eller legger seg flat. Når enheten er flat, er verdien som er registrert 0x20 mens hvis enheten står oppreist, er verdien 0x02Det skiller ikke om X- eller Y -stillingen er oppe, så lenge Z -aksen ikke er opp eller ned. Den enkleste måten å gjøre dette på er å bruke LightBlue App. SensorBug skal vises i skannemenyen. Velg enheten du vil konfigurere, gå til GATT-egenskapene for Accelerometer-konfigurasjon UUID: 9DC84838-7619-4F09-A1CE-DDCF63225B11

Se bildet: Skriv en ny konfigurasjonsstreng:

010d3f02020000002d00000002 Les konfigurasjonsstrengen tilbake for å bekrefte skrivingen. Dette gjør at akselerometeret kan måle posisjon.

Anbefalt: