Innehållsförteckning:

Övervaka och registrera temperatur med Bluetooth LE och RaspberryPi: 9 steg (med bilder)
Övervaka och registrera temperatur med Bluetooth LE och RaspberryPi: 9 steg (med bilder)

Video: Övervaka och registrera temperatur med Bluetooth LE och RaspberryPi: 9 steg (med bilder)

Video: Övervaka och registrera temperatur med Bluetooth LE och RaspberryPi: 9 steg (med bilder)
Video: HELA NATTLEN MED POLTERGEIST I LÄGENHETSBYGGAN filmade jag den läskiga aktiviteten. 2024, Juni
Anonim
Övervaka och registrera temperaturen med Bluetooth LE och RaspberryPi
Övervaka och registrera temperaturen med Bluetooth LE och RaspberryPi
Övervaka och registrera temperaturen med Bluetooth LE och RaspberryPi
Övervaka och registrera temperaturen med Bluetooth LE och RaspberryPi

Den här instruerbara handlingen handlar om hur man sätter ihop ett temperaturövervakningssystem med flera noder med Bluetooth LE-sensorbugg från Blue Radios (BLEHome) och RaspberryPi 3B Tack vare utvecklingen av Bluetooth LE-standarden finns det nu lätt tillgängliga trådlösa sensorer på marknaden på marknaden för mycket låg kostnad och kan köras på en enda myntcell i månader i taget. En av dessa sensorer jag plockade är från Blue Radio som kallas Sensor Bugs. Kostar cirka $ 25 på Amazon, det är en Bluetooth LE -enhet med temperatursensor, ljussensor och accerometer, alla inbyggda i en liten enhet som kan kommunicera trådlöst. Detta är en perfekt matchning för Raspberry Pi 3B, som har inbyggt stöd för Bluetooth LE -radio.

Steg 1: Konfigurera Raspberry Pi

Första steget är att få en fungerande Raspberry Pi -installation. Följ instruktionerna från Raspberry Pi: s webbplats, ladda Raspbian på ett SD -kort, sätt in i Raspberry Pi och starta upp det. Jag installerar mitt system med Raspbian Stretch Lite (No GUI) version november 2017. Konfigurera WiFi om det behövs, jag föredrar att justera tidszon till den aktuella tidszonen istället för UTC. Du kan göra detta även om kommandot: $ sudo dpkg-omkonfigurera tzdataRest av instruktionen antar att installationen är klar genom kommandoradsgränssnittet.

Steg 2: Konfigurera MySQL på Raspberry Pi

Det är användbart att ha en databas installerad lokalt för att lagra alla fångade data. Att installera MySQL på Raspberry Pi är superenkelt. Det är inte heller svårt att ändra skriptet för att ansluta till en SQL -server externt, du kan hoppa över det här steget om du vill använda en SQL -server i nätverket. Det finns många instruktioner på nätet, jag föreslår detta: https:// www.stewright.me/2014/06/tutorial-install-…

När SQL -servern är installerad kan du använda MySQL CLI -klienten för att skapa användare, databas och tabell. För att ange MySQL CLI, använd kommandot:

$ sudo mysql -uroot -pFörst skapar du en lokal användare för att infoga fångad data:> SKAPA ANVÄNDARE 'datasrc'@'localhost' IDENTIFIERAD MED 'datasrc000'; Skapa sedan en databas och tabell:> SKAPA DATABASE SensorBug; Ställ in användaren tillstånd:> bevilja alla PRIVILEGER PÅ SensorBug.* TILL 'datasrc'@'localhost'; Lägg nu till en ny tabell i databasen. I det här exemplet kommer jag att lägga till en tabell med följande kolumner: DATE, TIME, ADDRESS, LOCATION, TEMPERATURE och ACCEROMETER

  • DATUM/TID - Detta är datum och tid då data spelas in
  • ADRESS - Detta är MAC: n för SensorBug som meddelandet hämtas från
  • LOCATION - En människoläsbar sträng som anger var sensorn är placerad
  • TEMPERATUR - Detta är den registrerade temperaturen
  • ACCELE - Detta är värdet på accelerometerutgången, användbar för registrering av sensorposition (om aktiverad)

Kommandot som gör detta är:> ANVÄND SensorBug; > SKAPA TABELL -data (datum DATUM, tid TID, adress TINYTEXT, plats TINYTEXT, temperatur FLOAT, accele INT); Nu är databasen klar, vi kan gå vidare till att konfigurera sensorbuggarna.

Steg 3: Konfigurera SensorBugs

Sensorbuggarna är ganska snygga små enheter. Tyvärr gav tillverkaren bara IOS -app för att programmera den. Ändå är det fortfarande möjligt att arbeta med det om du bara har en Android -enhet. Första steget, para ihop enheten med en telefon. Utan att para ihop enheten kommer SensorBug inte att annonsera data. Jag försökte se om jag kan göra detta direkt med RaspberryPi, tyvärr verkar det som om Bluetooth LE -drivrutinen på RaspberryPi fortfarande är experimentell och innehåller buggar för att förhindra att den paras ihop med Bluetooth LE -enheter. Framtida version av blueZ -drivrutinen kan fixa detta, men som det nuvarande skrivandet finns det inget sätt att para SensorBug med RaspberryPi. Lyckligtvis behöver vi inte para ihop enheten för att fånga den annonserade data. Det enda vi behöver är en telefon för att konfigurera SensorBug. Som standard kommer SensorBug att börja annonsera temperaturdata med 1s intervall när den är ihopkopplad med en enhet. För att fånga temperaturdata är det allt som behövs. Om du planerar att expandera för att använda positionen eller ljussensorn kommer enheten att behövas än konfiguration. Till att börja med kopplar vi ihop enheten och kopplar bort. Detta är tillräckligt bra för temperaturmätning. Börja med att trycka på båda knapparna på SensorBug. Den blå/gröna lysdioden blinkar, vilket indikerar att den är påslagen. Tryck på en av knapparna, den gröna lysdioden ska tändas, ange att strömmen är på. Om den gröna lysdioden inte lyser, tryck på båda knapparna för att försöka slå på enheten igen. Håll ned en av knapparna tills den blå lysdioden börjar blinka. Detta kommer att sätta enheten i parningsläge. Gå till Bluetooth -konfigurationsmenyn på telefonen och leta efter SensorBug -enheten. När den dyker upp väljer du den för att para ihop med enheten. Det är det, nu är SensorBug strömförsörjd och annonserar temperaturdata

Steg 4: Installera Bluetooth LE Python Wrapper

Därefter måste vi installera biblioteket för att python ska kunna prata med Bluetooth LE -stacken. Instruktionen finns här: https://github.com/IanHarvey/bluepy För Python 2.7 är det så enkelt som att ange följande kommandon:

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

Steg 5: Skanna och ta reda på adressen till SensorBug

För att ta reda på SensorBug MAC -adressen, använd det här kommandot: $ sudo hcitool lescan Du bör se utdata som:

EC: FE: 7E: 10: B1: 92 (okänd) Om du har många Bluetooth LE -enheter i närheten kan det vara svårt att ta reda på vilken du pratar med. Du kan prova bluetoothctl som ger mer information:

$ sudo bluetoothctl [bluetooth]# skanning på [NY] Enhet EC: FE: 7E: 10: B1: 92 SensorBug10B192 [CHG] Enhet EC: FE: 7E: 10: B1: 92 Tillverkare Datanyckel: 0x0085 [CHG] Enhet 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ärde: 0x01 [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x6f

Spela in MAC -adressen, detta måste anges i python -skriptet för att filtrera bort oönskade Bluetooth LE -enheter

Steg 6: Lägg till Python Script

En kopia av Python -skriptet är tillgängligt från:

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

Här är samma fil, ta hand om indragningen när du kopierar:

Uppdatera också MAC -adressen i pythonfilen så att den matchar sensoradressen från skanningsresultatet.

# Detta program är gratis programvara: du kan omfördela det och/eller ändra

# det under villkoren i GNU General Public License som publicerats av

# Free Software Foundation, antingen version 3 av licensen eller

# (efter eget val) någon senare version.

#

# Detta program distribueras i hopp om att det kommer att vara användbart, # men UTAN NÅGON GARANTI; utan ens den underförstådda garantin av

# Säljbarhet eller lämplighet för ett särskilt syfte. Se

# GNU General Public License för mer information.

#

# Du borde ha fått en kopia av GNU General Public License

# tillsammans med detta program. Om inte, se.

# bscan.py - Enkel Bluetooth LE -skanner och datautdragare

från bluepy.btle importskanner, DefaultDelegate

importtid

importera pymysql

importera struktur

hostname = 'localhost'

användarnamn = 'datasrc'

password = 'datasrc000'

database = 'SensorBug'

#Ange sensorns MAC -adress från lescan

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

SENSOR_LOCATION = ["Garage", "Exteriör"]

klass DecodeErrorException (Undantag):

def _init _ (själv, värde):

self.value = värde

def _str _ (själv):

return repr (self.value)

klass ScanDelegate (StandardDelegate):

def _init _ (själv):

DefaultDelegate._ init _ (self)

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

if isNewDev:

print "Upptäckt enhet", dev.addr

elif isNewData:

print "Fått ny data från", dev.addr

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

#blesensortabell är datum, tid, addr, plats, temp, accero

cur = conn.cursor ()

dostr = 'SÄTT IN I data VÄRDEN (CURRENT_DATE (), NOW (), %s, %s, %s, %s);'

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

conn.commit ()

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

myConnection = pymysql.connect (värd = värdnamn, användare = användarnamn, passwd = lösenord, db = databas)

ManuDataHex =

ReadLoop = True

Prova:

medan (ReadLoop):

enheter = scanner.scan (2.0)

ManuData = ""

för enheter i enheter:

post = 0

AcceroData = 0

AcceroType = 0

TempData = 0

för saddr i SENSOR_ADDRESS:

post += 1

om (dev.addr == saddr):

skriv ut "Enhet %s (%s), RSSI = %d dB" %(dev.addr, dev.addrType, dev.rssi)

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION [post-1]

för (adtype, desc, value) i dev.getScanData ():

skriv ut " %s = %s" %(desc, värde)

if (desc == "Tillverkare"):

ManuData = värde

if (ManuData == ""):

print "Ingen data mottagen, avsluta avkodning"

Fortsätta

#print ManuData

för i, j i zip (ManuData [:: 2], ManuData [1:: 2]):

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

#Börja avkoda råa tillverkardata

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

skriva ut "Header byte 0x0085 hittat"

annan:

print "Header byte 0x0085 hittades inte, avkodningsstopp"

Fortsätta

#Hoppa över major/mindre

#Index 5 är 0x3c, ange batterinivå och konfigurera #

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

BatteryLevel = ManuDataHex [5]

ConfigCounter = ManuDataHex [6]

idx = 7

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

medan (idx <len (ManuDataHex)):

#print "Idx:" + str (idx)

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

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

#Accerometerdata

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

annan:

idx += 1

skriv ut "Enhetsadress:" + CurrentDevAddr

skriv ut "Enhetsplats:" + CurrentDevLoc

skriv ut "Batterinivå:" + str (BatteryLevel) + "%"

skriv ut "Config Counter:" + str (ConfigCounter)

skriv ut "Accelero Data:" + hex (AcceleroType) + "" + hex (AcceleroData)

skriv ut "Temp Data:" + str (TempData)

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

ReadLoop = Falskt

utom DecodeErrorException:

passera

Steg 7: Testa Python Script

Skriptet måste köras 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 Ofullständig 16b Services = 0a18 Tillverkare = 850002003c25094102024309016f Rubrikbyte 0x0085 hittad Enhetsadress: ec: 6e: 7e: 10: b1: 92 Enhetsplats: Garage Batterinivå: 37% Konfigurationsräknare: 9 Accero -data: 0x2 0x2 Tempdata: 16.5625

Steg 8: Lägg till Python Scrip i Crontab

Python -skriptet måste köras i root, så om du vill fånga data automatiskt måste det läggas till i rotens crontab. I det här exemplet kör jag skriptet var 20: e minut Använd kommandot:

$ sudo crontab -e

# Redigera den här filen för att introducera uppgifter som ska köras av cron.

# # Varje uppgift som ska köras måste definieras genom en enda rad # som anger med olika fält när uppgiften ska köras # och vilket kommando som ska köras för uppgiften # # För att definiera tiden kan du ange konkreta värden för # minut (m), timme (h), dag i månaden (dom), månad (mån), # och veckodag (dow) eller använd "*" i dessa fält (för "alla"). # # Observera att uppgifter startas baserat på crons system # daemons föreställning om tid och tidszoner. # # Utmatning av crontab -jobben (inklusive fel) skickas via # e -post till användaren som crontab -filen tillhör (om den inte omdirigeras). # # Till exempel kan du köra en säkerhetskopia av alla dina användarkonton # klockan 5 varje vecka med: # 0 5 * * 1 tar -zcf /var/backups/home.tgz/home/ # # Mer information finns i manuella sidor av crontab (5) och 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 är allt. Python -skriptet körs med regelbundna intervall och omkodar utdata till SQL -databasen

Steg 9: Extra: Konfigurera SensorBug för lägesavkänning

Extra: Konfigurera SensorBug för lägesavkänning
Extra: Konfigurera SensorBug för lägesavkänning
Extra: Konfigurera SensorBug för lägesavkänning
Extra: Konfigurera SensorBug för lägesavkänning

Det är möjligt att konfigurera SensorBug på Android för positionsavkänningsutmatning För positionsändringsavkänning, så kallad garageport. Sensor, detekterar SensorBug om enheten står upprätt eller lägger sig platt. När enheten är platt är värdet som registreras 0x20 medan om enheten står upprätt är värdet 0x02 Det skiljer sig inte om X- eller Y -läget är uppe, så länge Z -axeln inte är uppåt eller nedåt. Det enklaste sättet att göra detta är att använda LightBlue App. SensorBug ska visas i skanningsmenyn. Välj den enhet du vill konfigurera, gå till GATT-egenskaperna för accelerometerkonfiguration UUID: 9DC84838-7619-4F09-A1CE-DDCF63225B11

Se bild: Skriv en ny konfigurationssträng:

010d3f02020000002d00000002Läs tillbaka konfigurationssträngen för att bekräfta skrivningen. Detta möjliggör accelerometern för positionsavkänning.

Rekommenderad: