Inhoudsopgave:

Temperatuur bewaken en opnemen met Bluetooth LE en RaspberryPi 9 stappen (met afbeeldingen) Antwoorden op al uw "Hoe?"
Temperatuur bewaken en opnemen met Bluetooth LE en RaspberryPi 9 stappen (met afbeeldingen) Antwoorden op al uw "Hoe?"

Video: Temperatuur bewaken en opnemen met Bluetooth LE en RaspberryPi 9 stappen (met afbeeldingen) Antwoorden op al uw "Hoe?"

Video: Temperatuur bewaken en opnemen met Bluetooth LE en RaspberryPi 9 stappen (met afbeeldingen) Antwoorden op al uw
Video: 💦Blackview BV9200 EERLIJKE schokbestendige BEOORDELING 2024, Juli-
Anonim
Bewaak en registreer de temperatuur met Bluetooth LE en RaspberryPi
Bewaak en registreer de temperatuur met Bluetooth LE en RaspberryPi
Bewaak en registreer de temperatuur met Bluetooth LE en RaspberryPi
Bewaak en registreer de temperatuur met Bluetooth LE en RaspberryPi

Deze instructable gaat over het samenstellen van een multi-node temperatuurbewakingssysteem met Bluetooth LE-sensorbug van Blue Radios (BLEHome) en RaspberryPi 3B Dankzij de ontwikkeling van de Bluetooth LE-standaard zijn er nu direct beschikbare draadloze sensoren met laag vermogen op de markt voor zeer lage kosten en kan maandenlang op een enkele knoopcel draaien. Een van deze sensoren die ik heb opgepikt, is van Blue Radio genaamd Sensor Bugs. Het kost ongeveer $ 25 op Amazon en is een Bluetooth LE-apparaat met temperatuursensor, lichtsensor en accerometer, allemaal ingebouwd in een kleine eenheid die draadloos kan communiceren. Dit is een perfecte match voor Raspberry Pi 3B, die ingebouwde ondersteuning heeft voor Bluetooth LE-radio.

Stap 1: Stel Raspberry Pi in

De eerste stap is om een werkende Raspberry Pi-setup te krijgen. Volg de instructies van de Raspberry Pi-website, laad Raspbian op een SD-kaart, steek hem in de Raspberry Pi en start hem op. tijdzone naar de huidige tijdzone in plaats van UTC. U kunt dit doen via de opdracht: $ sudo dpkg-reconfigure tzdata Rest van de instructie neemt aan dat de installatie wordt uitgevoerd via de opdrachtregelinterface.

Stap 2: MySQL instellen op Raspberry Pi

Het is handig om lokaal een database te hebben geïnstalleerd om alle vastgelegde gegevens op te slaan. Het installeren van MySQL op Raspberry Pi is supereenvoudig. Het is ook niet moeilijk om het script aan te passen om extern verbinding te maken met een SQL-server, u kunt deze stap overslaan als u een SQL-server op het netwerk wilt gebruiken. Er zijn veel instructies op het net, ik stel dit voor:https:// www.stewright.me/2014/06/tutorial-install-…

Nadat de SQL-server is geïnstalleerd, kunt u de MySQL CLI-client gebruiken om een gebruiker, database en tabel te maken. Om MySQL CLI in te voeren, gebruikt u de opdracht:

$ sudo mysql -uroot-pMaak eerst een lokale gebruiker om vastgelegde gegevens in te voegen: > CREER GEBRUIKER 'datasrc'@'localhost' IDENTIFYED BY 'datasrc000';Maak vervolgens een database en tabel: > CREATE DATABASE SensorBug;De gebruiker instellen toestemming: > VERLENEN ALLE PRIVILEGES OP SensorBug.* AAN 'datasrc'@'localhost';Voeg nu een nieuwe tabel toe aan de database. Voor dit voorbeeld ga ik een tabel toevoegen met de volgende kolommen: DATUM, TIJD, ADRES, LOCATIE, TEMPERATUUR en ACCEROMETER

  • DATUM/TIJD - Dit is de datum en tijd waarop de gegevens zijn vastgelegd
  • ADRES - Dit is de MAC van de SensorBug waarvan het bericht is vastgelegd
  • LOCATIE - Een door mensen leesbare string om aan te geven waar de sensor zich bevindt
  • TEMPERATUUR - Dit is de geregistreerde temperatuur
  • ACCELE - Dit is de waarde van de uitgang van de versnellingsmeter, handig voor het opnemen van de sensorpositie (indien ingeschakeld)

Het commando dat dit doet is: > USE SensorBug; > CREATE TABLE-gegevens (datum DATUM, tijd TIJD, adres TINYTEXT, locatie TINYTEXT, temperatuur FLOAT, accele INT); Nu de database klaar is, kunnen we doorgaan met het instellen van de sensorBugs.

Stap 3: De SensorBugs instellen

De sensorbugs zijn behoorlijk nette kleine apparaten. Helaas heeft de fabrikant alleen de IOS-app geleverd om het te programmeren. Desalniettemin is het nog steeds mogelijk om ermee te werken als je alleen een Android-apparaat hebt. Eerste stap, koppel het apparaat met een telefoon. Zonder het apparaat te koppelen, zal de SensorBug geen gegevens adverteren. Ik heb geprobeerd te zien of ik dit rechtstreeks met RaspberryPi kan doen, helaas lijkt het erop dat het Bluetooth LE-stuurprogramma op RaspberryPi nog steeds experimenteel is en bugs bevat om te voorkomen dat het wordt gekoppeld aan Bluetooth LE-apparaten. Toekomstige versie van het blueZ-stuurprogramma kan dit oplossen, maar zoals het huidige schrijven, is er geen manier om de SensorBug te koppelen met RaspberryPi. Gelukkig hoeven we het apparaat niet te koppelen om de geadverteerde gegevens vast te leggen. Het enige dat we nodig hebben is een telefoon om de SensorBug te configureren. Standaard zal de SensorBug beginnen met het adverteren van temperatuurgegevens met een interval van 1 s zodra deze is gekoppeld aan een apparaat. Voor het vastleggen van temperatuurgegevens is dat alles wat nodig is. Als u van plan bent om uit te breiden om de positie- of lichtsensor te gebruiken, dan is configuratie van het apparaat nodig. Om te beginnen zullen we het apparaat koppelen en ontkoppelen. Dit is goed genoeg voor het vastleggen van de temperatuur. Begin door op beide knoppen op de SensorBug te drukken. De blauw/groene LED knippert, wat aangeeft dat hij is ingeschakeld. Druk op een van de knoppen, de groene LED moet oplichten om aan te geven dat de stroom is ingeschakeld. Als de groene LED niet brandt, drukt u op beide knoppen om het apparaat opnieuw in te schakelen. Houd een van de knoppen ingedrukt totdat de blauwe LED begint te knipperen. Hierdoor wordt het apparaat in de koppelmodus gezet. Ga naar het Bluetooth-configuratiemenu op de telefoon en zoek naar het SensorBug-apparaat. Zodra het verschijnt, selecteert u het om te koppelen met het apparaat. Dat is het, nu wordt de SensorBug van stroom voorzien en adverteert hij met de temperatuurgegevens

Stap 4: De Bluetooth LE Python Wrapper installeren

Vervolgens moeten we de bibliotheek voor python installeren om met Bluetooth LE-stack te praten. De instructie is hier te vinden: https://github.com/IanHarvey/bluepy Voor Python 2.7 is het zo eenvoudig als het invoeren van de volgende opdrachten:

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

Stap 5: Scan en ontdek het adres van de SensorBug

Gebruik deze opdracht om het MAC-adres van SensorBug te achterhalen: $ sudo hcitool lescan U zou de uitvoer moeten zien zoals:

EC:FE:7E:10:B1:92 (onbekend)Als je veel bluetooth LE-apparaten in de buurt hebt, kan het moeilijk zijn om erachter te komen met welk apparaat je praat. U kunt bluetoothctl proberen, die meer details geeft:

$ sudo bluetoothctl[bluetooth]# scan op [NIEUW] Apparaat EC:FE:7E:10:B1:92 SensorBug10B192 [CHG] Apparaat EC:FE:7E:10:B1:92 Fabrikantgegevenssleutel: 0x0085 [CHG] Apparaat EC: FE:7E:10:B1:92 FabrikantData Waarde: 0x02 [CHG] Apparaat EC:FE:7E:10:B1:92 FabrikantData Waarde: 0x00 [CHG] Apparaat EC:FE:7E:10:B1:92 FabrikantData Waarde: 0x3c [CHG] Apparaat EC:FE:7E:10:B1:92 FabrikantData Waarde: 0x25 [CHG] Apparaat EC:FE:7E:10:B1:92 FabrikantData Waarde: 0x09 [CHG] Apparaat EC:FE:7E:10:B1:92 FabrikantData Waarde: 0x41 [CHG] Apparaat EC:FE:7E:10:B1:92 FabrikantData Waarde: 0x02 [CHG] Apparaat EC:FE:7E:10:B1:92 FabrikantData Waarde: 0x02 [CHG] Apparaat EC:FE:7E:10:B1:92 Fabrikantgegevens Waarde: 0x43 [CHG] Apparaat EC:FE:7E:10:B1:92 FabrikantData Waarde: 0x0b [CHG] Apparaat EC:FE:7E:10:B1:92 Fabrikantgegevens Waarde: 0x01 [CHG] Apparaat EC:FE:7E:10:B1:92 FabrikantData Waarde: 0x6f

Noteer het MAC-adres, dit moet worden ingevoerd in het python-script om ongewenste Bluetooth LE-apparaten eruit te filteren

Stap 6: Voeg het Python-script toe

Een kopie van het Python-script is verkrijgbaar bij:

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

Hier is hetzelfde bestand, let bij het kopiëren op de inspringing:

Werk ook het MAC-adres in het python-bestand bij zodat het overeenkomt met het sensoradres dat is verkregen uit het scanresultaat.

# Dit programma is gratis software: u kunt het herdistribueren en/of wijzigen

# het onder de voorwaarden van de GNU General Public License zoals gepubliceerd door

# de Free Software Foundation, ofwel versie 3 van de licentie, of

# (naar uw keuze) een latere versie.

#

# Dit programma wordt verspreid in de hoop dat het nuttig zal zijn, # maar ZONDER ENIGE GARANTIE; zonder zelfs de impliciete garantie van

# VERKOOPBAARHEID of GESCHIKTHEID VOOR EEN BEPAALD DOEL. Zie de

# GNU General Public License voor meer details.

#

# U zou een kopie van de GNU General Public License moeten hebben ontvangen

# samen met dit programma. Zo niet, zie.

# bscan.py - Eenvoudige bluetooth LE-scanner en gegevensextractor

van bluepy.btle import Scanner, DefaultDelegate

import tijd

importeer pymysql

import structuur

hostnaam = 'lokale host'

gebruikersnaam = 'datasrc'

wachtwoord = 'datasrc000'

database = 'SensorBug'

#Voer het MAC-adres van de sensor uit de lescan in

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

SENSOR_LOCATION = ["Garage", "Exterieur"]

klasse DecodeErrorException (uitzondering):

def _init_(zelf, waarde):

zelf.waarde = waarde

def _str_(zelf):

return repr(self.value)

klasse ScanDelegate (DefaultDelegate):

def _init_(zelf):

StandaardDelegeren._init_(zelf)

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

als isNewDev:

print "Ontdekt apparaat", dev.addr

elif isNieuweData:

print "Nieuwe gegevens ontvangen van", dev.addr

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

#blesensor tabel is datum, tijd, adres, locatie, temp, accero

cur = conn.cursor()

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 (host=hostnaam, gebruiker=gebruikersnaam, passwd=wachtwoord, db=database)

ManuDataHex =

ReadLoop = True

proberen:

terwijl (ReadLoop):

apparaten = scanner.scan(2.0)

ManuData = ""

voor dev in-apparaten:

invoer = 0

AcceroData = 0

AcceroType = 0

TempData = 0

voor saddr in SENSOR_ADDRESS:

invoer += 1

if (dev.addr == saddr):

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

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION[entry-1]

for (advertentietype, desc, waarde) in dev.getScanData():

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

if (desc == "Fabrikant"):

ManuData = waarde

if (ManuData == ""):

print "Geen gegevens ontvangen, einde decodering"

doorgaan met

#print ManuData

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

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

#Start met het decoderen van de onbewerkte gegevens van de fabrikant

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

print "Headerbyte 0x0085 gevonden"

anders:

print "Headerbyte 0x0085 niet gevonden, decodering stop"

doorgaan met

#Skip Major/Minor

#Index 5 is 0x3c, geef batterijniveau en configuratie aan #

if (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 "Data: " + hex(ManuDataHex[idx])

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

#Accerometergegevens

idx += 1

AcceleroType = ManuDataHex[idx]

AcceleroData = ManuDataHex[idx+1]

idx += 2

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

#Temperatuurgegevens

idx += 1

TempData = ManuDataHex[idx]

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

TempData = TempData * 0.0625

idx += 2

anders:

idx += 1

print "Apparaatadres: " + CurrentDevAddr

print "Apparaatlocatie: " + CurrentDevLoc

print "Batterijniveau: " + str(Batterijniveau) + "%"

print "Config Counter: " + str(ConfigCounter)

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

print "Temp Data: " + str(TempData)

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

ReadLoop = False

behalve DecodeErrorException:

doorgang

Stap 7: Test het Python-script uit

Het script moet in root worden uitgevoerd, dus:

$ 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 Fabrikant = 850002003c25094102024309016f Headerbyte 0x0085 gevonden Apparaatadres: ec:6e:7e:10:b1:92 Apparaatlocatie: Garage Batterijniveau: 37% Configuratieteller: 9 Accero-gegevens: 0x2 0x2 Temp-gegevens: 16.5625

Stap 8: Voeg het Python-script toe aan de Crontab

Het python-script moet in root worden uitgevoerd, dus als je de gegevens automatisch wilt vastleggen, moet het worden toegevoegd aan de crontab van de root. Voor dit voorbeeld voer ik het script elke 20 minuten uit. Gebruik de opdracht:

$ sudo crontab -e

# Bewerk dit bestand om taken te introduceren die door cron moeten worden uitgevoerd.

# # Elke uit te voeren taak moet worden gedefinieerd door een enkele regel # die met verschillende velden aangeeft wanneer de taak zal worden uitgevoerd # en welk commando voor de taak moet worden uitgevoerd # # Om de tijd te definiëren, kunt u concrete waarden opgeven voor # minuut (m), uur (h), dag van de maand (dom), maand (mon), # en dag van de week (dow) of gebruik '*' in deze velden (voor 'any').# # Merk op dat taken worden gestart gebaseerd op de cron's system # daemon's notie van tijd en tijdzones. # # Uitvoer van de crontab-taken (inclusief fouten) wordt via # e-mail verzonden naar de gebruiker waartoe het crontab-bestand behoort (tenzij omgeleid). # # U kunt bijvoorbeeld elke week een back-up maken van al uw gebruikersaccounts # om 5 uur 's ochtends met: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # Zie voor meer informatie de handleidingen van crontab(5) en cron(8) # # mh dom mon dow commando 0 * * * * python /home/pi/bscan.py 20 * * * * python /home/pi/bscan.py 40 * * * * python /home/pi/bscan.py

Dat is het. Het python-script wordt met regelmatige tussenpozen uitgevoerd en de uitvoer wordt opnieuw gecodeerd in de SQL-database

Stap 9: Extra: Configureer de SensorBug voor Positiedetectie-uitgang

Extra: Configureer de SensorBug voor Positiedetectie-uitgang
Extra: Configureer de SensorBug voor Positiedetectie-uitgang
Extra: Configureer de SensorBug voor Positiedetectie-uitgang
Extra: Configureer de SensorBug voor Positiedetectie-uitgang

Het is mogelijk om de SensorBug op Android te configureren voor positiedetectie-uitvoer. Voor positieveranderingsdetectie, zogenaamde garagedeurdetectie, detecteert de SensorBug of het apparaat rechtop staat of plat ligt. Als het apparaat plat is, is de geregistreerde waarde 0x20 terwijl als het apparaat rechtop staat, de waarde 0x02 is. Het maakt geen onderscheid of de X- of Y-positie omhoog is, zolang de Z-as niet omhoog of omlaag is. De eenvoudigste manier om dit te doen is door de LightBlue-app te gebruiken. De SensorBug zou in het scanmenu moeten verschijnen. Selecteer het apparaat dat u wilt configureren, ga naar de GATT-kenmerken voor configuratie van de versnellingsmeter UUID:9DC84838-7619-4F09-A1CE-DDCF63225B11

Zie afbeelding:Schrijf een nieuwe configuratiestring:

010d3f02020000002d00000002Lees de configuratiereeks terug om het schrijven te bevestigen. Hierdoor kan de versnellingsmeter positiebepaling uitvoeren.

Aanbevolen: