Indholdsfortegnelse:

Overvåg og registrer temperatur med Bluetooth LE og RaspberryPi: 9 trin (med billeder)
Overvåg og registrer temperatur med Bluetooth LE og RaspberryPi: 9 trin (med billeder)

Video: Overvåg og registrer temperatur med Bluetooth LE og RaspberryPi: 9 trin (med billeder)

Video: Overvåg og registrer temperatur med Bluetooth LE og RaspberryPi: 9 trin (med billeder)
Video: Garmin Fenix 7 Pro обзор + учебник 2024, November
Anonim
Overvåg og registrer temperatur med Bluetooth LE og RaspberryPi
Overvåg og registrer temperatur med Bluetooth LE og RaspberryPi
Overvåg og registrer temperatur med Bluetooth LE og RaspberryPi
Overvåg og registrer temperatur med Bluetooth LE og RaspberryPi

Denne instruktive handler om, hvordan man sammensætter et multi-node temperaturovervågningssystem med Bluetooth LE-sensorfejl fra Blue Radios (BLEHome) og RaspberryPi 3B Takket være udviklingen af Bluetooth LE-standarden er der nu let tilgængelige laveffekt trådløse sensorer på markedet til meget lave omkostninger og kan køre på en enkelt møntcelle i flere måneder ad gangen. En af disse sensorer, jeg hentede, er fra Blue Radio kaldet Sensor Bugs. Det koster omkring $ 25 på Amazon, det er en Bluetooth LE -enhed med temperatursensor, lyssensor og accerometer, der alle er bygget ind i en lille enhed, der kan kommunikere trådløst. Dette er et perfekt match til Raspberry Pi 3B, som har indbygget understøttelse af Bluetooth LE -radio.

Trin 1: Konfigurer Raspberry Pi

Første trin er at få en fungerende Raspberry Pi -opsætning. Følg instruktionerne fra Raspberry Pi's websted, indlæs Raspbian på et SD -kort, indsæt i Raspberry Pi og start det op. Jeg konfigurerer mit system med Raspbian Stretch Lite (No GUI) version november 2017. Konfigurer WiFi, hvis det er nødvendigt, foretrækker jeg at justere tidszone til den aktuelle tidszone i stedet for UTC. Du kan gøre dette selvom kommandoen: $ sudo dpkg-reconfigure tzdataRest af instruktionen antager, at opsætningen er udført, selvom kommandolinjegrænsefladen.

Trin 2: Opsætning af MySQL på Raspberry Pi

Det er nyttigt at have en database installeret lokalt for at gemme alle de fangede data. Installation af MySQL på Raspberry Pi er super let. Det er heller ikke svært at ændre scriptet for at oprette forbindelse til en SQL -server eksternt, du kan springe dette trin over, hvis du ønsker at bruge en SQL -server på netværket. Der er mange instruktioner på nettet, jeg foreslår dette: https:// www.stewright.me/2014/06/tutorial-install-…

Når SQL -serveren er installeret, kan du bruge MySQL CLI -klienten til at oprette bruger, database og tabel. For at indtaste MySQL CLI skal du bruge kommandoen:

$ sudo mysql -uroot -pFørst skal du oprette en lokal bruger for at indsætte fangede data:> Opret bruger 'datasrc'@'localhost' IDENTIFICERET MED 'datasrc000'; Opret derefter en database og tabel:> CREATE DATABASE SensorBug; Opsætning af brugeren tilladelse:> GIV ALLE PRIVILEGER PÅ SensorBug.* TIL 'datasrc'@'localhost'; Tilføj nu en ny tabel til databasen. I dette eksempel tilføjer jeg en tabel med følgende kolonner: DATE, TIME, ADDRESS, LOCATION, TEMPERATURE og ACCEROMETER

  • DATO/TID - Dette er dato og klokkeslæt, hvor dataene registreres
  • ADRESSE - Dette er MAC for SensorBug, meddelelsen hentes fra
  • LOCATION - En streng, der kan læses af mennesker for at angive, hvor sensoren er placeret
  • TEMPERATUR - Dette er den registrerede temperatur
  • ACCELE - Dette er værdien af accelerometerudgangen, nyttig til registrering af sensorposition (hvis aktiveret)

Kommandoen, der gør dette, er:> BRUG SensorBug; > Opret tabeldata (dato DATO, tid TID, adresse TINYTEXT, placering TINYTEXT, temperatur FLOAT, accele INT); Nu er databasen klar, vi kan gå videre til opsætning af sensorBugs.

Trin 3: Opsætning af SensorBugs

Sensorfejlene er ret pæne små enheder. Desværre leverede producenten kun IOS -app til programmering af den. Ikke desto mindre er det stadig muligt at arbejde med det, hvis du kun har en Android -enhed. Første trin skal du parre enheden med en telefon. Uden parring af enheden vil SensorBug ikke annoncere data. Jeg forsøgte at se, om jeg kan gøre dette direkte med RaspberryPi, desværre ser det ud til, at Bluetooth LE -driveren på RaspberryPi stadig er eksperimentel og indeholder fejl for at forhindre, at den parres med Bluetooth LE -enheder. Fremtidig version af blueZ -driveren kan muligvis løse dette, men som den nuværende skrivning er der ingen måde at parre SensorBug med RaspberryPi. Heldigvis behøver vi ikke at parre enheden for at fange dens annoncerede data. Det eneste, vi har brug for, er en telefon til at konfigurere SensorBug. Som standard starter SensorBug reklame for temperaturdata med 1s interval, når den er parret med en enhed. Til registrering af temperaturdata er det alt, hvad der er nødvendigt. Hvis du planlægger at udvide til at bruge positionen eller lyssensoren, vil enheden være nødvendig end konfiguration. Til start parrer vi enheden og afbryder forbindelsen. Dette vil være godt nok til temperaturregistrering. Start med at trykke på begge knapper på SensorBug. Den blå/grønne LED blinker, hvilket angiver, at den er tændt. Tryk på en af knappen, den grønne LED skal lyse, angive, at strømmen er tændt. Hvis den grønne LED ikke lyser, skal du trykke på begge knapper for at prøve at tænde enheden igen. Tryk på en af knapperne, og hold den nede, indtil den blå LED begynder at blinke. Dette sætter enheden i parret tilstand. Gå ind i Bluetooth -konfigurationsmenuen på telefonen og kig efter SensorBug -enheden. Når den dukker op, skal du vælge den for at parre med enheden. Det er det, nu er SensorBug tændt og annoncerer temperaturdataene

Trin 4: Installation af Bluetooth LE Python Wrapper

Dernæst skal vi installere biblioteket, så python kan tale med Bluetooth LE -stakken. Instruktionen kan findes her: https://github.com/IanHarvey/bluepyFor Python 2.7 er det så simpelt som at indtaste følgende kommandoer:

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

Trin 5: Scan og find adressen på SensorBug

For at finde ud af SensorBug MAC -adressen skal du bruge denne kommando: $ sudo hcitool lescan Du skal se output som:

EC: FE: 7E: 10: B1: 92 (ukendt) Hvis du har mange Bluetooth LE -enheder i nærheden, kan det være svært at finde ud af, hvilken en du taler med. Du kan prøve bluetoothctl, som giver flere detaljer:

$ sudo bluetoothctl [bluetooth]# scan på [NEW] Enhed EC: FE: 7E: 10: B1: 92 SensorBug10B192 [CHG] Enhed EC: FE: 7E: 10: B1: 92 Producent Datanøgle: 0x0085 [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x02 [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x00 [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 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 ManufacturerData Value: 0x43 [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x0b [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Værdi: 0x01 [CHG] Enhed EC: FE: 7E: 10: B1: 92 ProducentData Værdi: 0x6f

Registrer MAC -adressen, dette skal indtastes i python -scriptet for at filtrere uønskede Bluetooth LE -enheder ud

Trin 6: Tilføj Python -scriptet

En kopi af Python -scriptet er tilgængelig fra:

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

Her er den samme fil, pas på indrykningen, når du kopierer:

Opdater også MAC -adressen i python -filen, så den matcher sensoradressen fra scanningsresultatet.

# Dette program er gratis software: du kan omfordele det og/eller ændre

# det under vilkårene i GNU General Public License som udgivet af

# Free Software Foundation, enten version 3 af licensen eller

# (efter eget valg) enhver senere version.

#

# Dette program distribueres i håb om, at det vil være nyttigt, # men UDEN NOGEN GARANTI; uden selv den underforståede garanti af

# SALGSMÆSSIGHED eller egnethed til et særligt formål. Se

# GNU General Public License for flere detaljer.

#

# Du skulle have modtaget en kopi af GNU General Public License

# sammen med dette program. Hvis ikke, se.

# bscan.py - Enkel Bluetooth LE -scanner og dataudtræk

fra bluepy.btle import Scanner, DefaultDelegate

importtid

import pymysql

import struktur

hostname = 'localhost'

brugernavn = 'datasrc'

password = 'datasrc000'

database = 'SensorBug'

#Indtast sensorens MAC -adresse fra lescan

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

SENSOR_LOCATION = ["Garage", "Udvendig"]

klasse DecodeErrorException (Undtagelse):

def _init _ (selv, værdi):

self.value = værdi

def _str _ (selv):

return repr (selvværdi)

klasse ScanDelegate (StandardDelegate):

def _init _ (selv):

DefaultDelegate._ init _ (self)

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

hvis isNewDev:

print "Opdaget enhed", dev.addr

elif isNewData:

print "Modtog nye data fra", dev.addr

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

#blesensortabellen er dato, klokkeslæt, addr, placering, temp, accero

cur = konn. markør ()

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

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

conn.commit ()

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

myConnection = pymysql.connect (vært = værtsnavn, bruger = brugernavn, passwd = adgangskode, db = database)

ManuDataHex =

ReadLoop = True

prøve:

mens (ReadLoop):

enheder = scanner.scan (2.0)

ManuData = ""

til udviklingsenheder:

indtastning = 0

AcceroData = 0

AcceroType = 0

TempData = 0

for saddr i SENSOR_ADDRESS:

indtastning += 1

hvis (dev.addr == saddr):

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

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION [post-1]

for (adtype, desc, værdi) i dev.getScanData ():

print " %s = %s" %(desc, værdi)

hvis (desc == "Producent"):

ManuData = værdi

hvis (ManuData == ""):

print "Ingen data modtaget, afslut afkodning"

Blive ved

#print ManuData

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

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

#Start afkodning af de rå producentdata

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

print "Header byte 0x0085 fundet"

andet:

print "Header byte 0x0085 ikke fundet, afkodningsstop"

Blive ved

#Skip major/mindre

#Index 5 er 0x3c, angiv batteriniveau og konfiguration #

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):

#Accerometer 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

andet:

idx += 1

print "Enhedsadresse:" + CurrentDevAddr

print "Enhedens placering:" + CurrentDevLoc

print "Batteriniveau:" + str (BatteryLevel) + "%"

print "Config Counter:" + str (ConfigCounter)

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

udskriv "Temp Data:" + str (TempData)

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

ReadLoop = Falsk

undtagen DecodeErrorException:

passere

Trin 7: Test Python -scriptet

Scriptet skal køres i root, så:

$ sudo python bscan.pyOpdaget enhed ec: 6e: 7e: 10: b1: 92 Device ec: 6e: 7e: 10: b1: 92 (offentlig), RSSI = -80 dB Flag = 06 Ufuldstændige 16b Services = 0a18 Producent = 850002003c25094102024309016f Header -byte 0x0085 fundet Enhedsadresse: ec: 6e: 7e: 10: b1: 92 Enhedens placering: Garage Batteriniveau: 37% Config Counter: 9 Accero Data: 0x2 0x2 Temp Data: 16.5625

Trin 8: Tilføj Python Scrip til Crontab

Python -scriptet skal køres i root, så hvis du vil fange dataene automatisk, skal det føjes til rodens crontab. I dette eksempel kører jeg scriptet hvert 20. minut Brug kommandoen:

$ sudo crontab -e

# Rediger denne fil for at introducere opgaver, der skal køres af cron.

# # Hver opgave, der skal køres, skal defineres gennem en enkelt linje # angiver med forskellige felter, hvornår opgaven skal køres # og hvilken kommando, der skal køres for opgaven # # For at definere tiden kan du angive konkrete værdier i # minut (m), time (h), dag i måneden (dom), måned (man), # og ugedag (dow) eller brug '*' i disse felter (for 'enhver'). # # Bemærk, at opgaver vil blive startet baseret på crons system # dæmons forestilling om tid og tidszoner. # # Output af crontab -jobene (inklusive fejl) sendes via # e -mail til den bruger, crontab -filen tilhører (medmindre den omdirigeres). # # For eksempel kan du køre en sikkerhedskopi af alle dine brugerkonti # kl. 5 hver uge med: # 0 5 * * 1 tar -zcf /var/backups/home.tgz/home/ # # For flere oplysninger se manuelle sider af 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 -scriptet køres med regelmæssigt interval og omkoder output til SQL -databasen

Trin 9: Ekstra: Konfigurer SensorBug til positionsføleroutput

Ekstra: Konfigurer SensorBug til positionsføleroutput
Ekstra: Konfigurer SensorBug til positionsføleroutput
Ekstra: Konfigurer SensorBug til positionsføleroutput
Ekstra: Konfigurer SensorBug til positionsføleroutput

Det er muligt at konfigurere SensorBug på Android til positionsfølerudgang For positionsændringsføling, såkaldt garageport. Sensor, registrerer SensorBug, om enheden står oprejst eller ligger fladt ned. Når enheden er flad, er den registrerede værdi 0x20 mens hvis enheden står oprejst, er værdien 0x02Det adskiller sig ikke, hvis X- eller Y -positionen er oppe, så længe Z -aksen ikke er op eller ned. Den letteste måde at gøre dette på er at bruge LightBlue App. SensorBug skal dukke op i scanningsmenuen. Vælg den enhed, du vil konfigurere, gå til GATT-egenskaberne for Accelerometer-konfiguration UUID: 9DC84838-7619-4F09-A1CE-DDCF63225B11

Se billede: Skriv en ny konfigurationsstreng:

010d3f02020000002d00000002Læs konfigurationsstrengen tilbage for at bekræfte skrivningen. Dette muliggør accelerometeret til positionsmåling.

Anbefalede: