Taula de continguts:

Superviseu i registreu la temperatura amb Bluetooth LE i RaspberryPi: 9 passos (amb imatges)
Superviseu i registreu la temperatura amb Bluetooth LE i RaspberryPi: 9 passos (amb imatges)

Vídeo: Superviseu i registreu la temperatura amb Bluetooth LE i RaspberryPi: 9 passos (amb imatges)

Vídeo: Superviseu i registreu la temperatura amb Bluetooth LE i RaspberryPi: 9 passos (amb imatges)
Vídeo: Основы горизонтально масштабируемых вычислений Джеймса Каффа 2024, De novembre
Anonim
Superviseu i registreu la temperatura amb Bluetooth LE i RaspberryPi
Superviseu i registreu la temperatura amb Bluetooth LE i RaspberryPi
Superviseu i registreu la temperatura amb Bluetooth LE i RaspberryPi
Superviseu i registreu la temperatura amb Bluetooth LE i RaspberryPi

Aquest instructiu tracta sobre com muntar un sistema de monitorització de temperatura de diversos nodes amb un error del sensor Bluetooth LE de Blue Radios (BLEHome) i RaspberryPi 3B Gràcies al desenvolupament de l’estàndard Bluetooth LE, ara hi ha al mercat uns sensors sense fils de baixa potència disponibles. per un cost molt baix i pot funcionar amb una sola cel·la de moneda durant mesos alhora. Un d’aquests sensors que he recollit és de Blue Radio anomenat Sensor Bugs. Amb un cost d’uns 25 dòlars a Amazon, es tracta d’un dispositiu Bluetooth LE amb sensor de temperatura, sensor de llum i aceròmetre que es converteix en una petita unitat que es pot comunicar sense fils. És un partit perfecte per a Raspberry Pi 3B, que compta amb suport per a la ràdio Bluetooth LE.

Pas 1: configureu Raspberry Pi

El primer pas és aconseguir una configuració de Raspberry Pi que funcioni. Seguiu les instruccions del lloc web de Raspberry Pi, carregueu Raspbian en una targeta SD, inseriu-lo a Raspberry Pi i arrenceu-lo. Configuro el sistema amb la versió Raspbian Stretch Lite (sense GUI) de novembre de 2017. Configureu el WiFi si cal, prefereixo ajustar el zona horària a la zona horària actual en lloc de UTC. Podeu fer-ho mitjançant l'ordre: $ sudo dpkg-reconfigure tzdataRest de la instrucció suposem que la configuració es fa mitjançant la interfície de línia d'ordres.

Pas 2: Configuració de MySQL a Raspberry Pi

És útil tenir instal·lada una base de dades localment per emmagatzemar totes les dades capturades. Instal·lar MySQL a Raspberry Pi és molt fàcil. Tampoc no és difícil modificar l'script per connectar-vos externament a un servidor SQL, podeu ometre aquest pas si voleu utilitzar un servidor SQL a la xarxa. Hi ha moltes instruccions a la xarxa, us suggereixo: https:// www.stewright.me/2014/06/tutorial-install-…

Un cop instal·lat el servidor SQL, podeu utilitzar el client MySQL CLI per crear usuaris, bases de dades i taules. Per introduir MySQL CLI, utilitzeu l'ordre:

$ sudo mysql -uroot-pPrimer, creeu un usuari local per inserir les dades capturades:> CREA USUARI 'datasrc' @ 'localhost' IDENTIFICAT PER 'datasrc000'; A continuació, creeu una base de dades i una taula:> CREA BASE DE DATES SensorBug; Configuració de l'usuari permís:> CONCEDIU TOTS ELS PRIVILEGIS A SensorBug. * A 'datasrc' @ 'localhost'; ara afegiu una nova taula a la base de dades. Per a aquest exemple, afegiré una taula amb les columnes següents: DATA, HORA, ADREÇA, UBICACIÓ, TEMPERATURA i ACCEROMETRE

  • DATA / HORA: és la data i hora en què es registren les dades
  • ADREÇA: aquest és el MAC del SensorBug des del qual es captura el missatge
  • UBICACIÓ: una cadena llegible per humans per indicar on es troba el sensor
  • TEMPERATURA: és la temperatura registrada
  • ACCELE: aquest és el valor de la sortida de l’acceleròmetre, útil per enregistrar la posició del sensor (si està activat)

L'ordre que fa això és:> USAR SensorBug; > CREAR dades de TAULA (data DATA, hora HORA, adreça TINYTEXT, ubicació TINYTEXT, temperatura FLOAT, accele INT); Ara la base de dades està preparada, podem passar a configurar els sensorBugs.

Pas 3: Configuració de SensorBugs

Els errors del sensor són petits dispositius força curats. Malauradament, el fabricant només va proporcionar l'aplicació iOS per programar-la. Tot i això, encara és possible treballar-hi si només teniu un dispositiu Android. En primer lloc, vincleu el dispositiu amb un telèfon. Sense aparellar-lo, SensorBug no publicitarà dades. He intentat veure si puc fer-ho directament amb RaspberryPi, malauradament, sembla que el controlador Bluetooth LE de RaspberryPi encara és experimental i conté errors per evitar que s’aparellin amb dispositius Bluetooth LE. La futura versió del controlador blueZ podria solucionar-ho, però, com s’escriu actualment, no hi ha manera d’aparellar SensorBug amb RaspberryPi. Afortunadament, no necessitem aparellar el dispositiu per capturar les dades publicades. L’únic que necessitem és un telèfon per configurar SensorBug. Per defecte, SensorBug començarà a anunciar les dades de temperatura a un interval d’1 s un cop estigui emparellat amb un dispositiu. Per a la captura de dades de temperatura, això és tot el que cal. Si teniu previst expandir-vos per utilitzar el sensor de posició o llum, la configuració serà necessària. Per començar, aparellarem el dispositiu i el desconnectarem. Serà prou bo per capturar la temperatura. Comenceu prement els dos botons del SensorBug. El LED blau / verd parpellejarà, cosa que indica que està encès. Premeu un dels botons; el LED verd s'hauria d'encendre i indica que està encès. Si el LED verd no està encès, premeu els dos botons per tornar a engegar el dispositiu. Mantingueu premut un dels botons fins que el LED blau comenci a parpellejar. Això posarà el dispositiu en mode de parell. Aneu al menú de configuració de Bluetooth al telèfon i busqueu el dispositiu SensorBug. Un cop aparegui, seleccioneu-lo per emparellar-lo amb el dispositiu. Ja està, ara el SensorBug s’alimenta i anuncia les dades de temperatura.

Pas 4: Instal·lació del Bluetooth LE Python Wrapper

A continuació, hem d’instal·lar la biblioteca perquè Python parli amb la pila Bluetooth LE. Les instruccions es poden trobar aquí: https://github.com/IanHarvey/bluepy Per a Python 2.7, és tan senzill com introduir les ordres següents:

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

Pas 5: escanejar i esbrinar l'adreça de SensorBug

Per esbrinar l'adreça MAC de SensorBug, utilitzeu aquesta ordre: $ sudo hcitool lescan Hauríeu de veure una sortida com:

EC: FE: 7E: 10: B1: 92 (desconegut) Si teniu molts dispositius Bluetooth LE al voltant, pot ser difícil esbrinar amb quin parleu. Podeu provar bluetoothctl, que proporciona més detalls:

$ sudo bluetoothctl [bluetooth] # scan on [NOU] EC del dispositiu: FE: 7E: 10: B1: 92 SensorBug10B192 [CHG] EC del dispositiu: FE: 7E: 10: B1: 92 Clau de dades del fabricant: 0x0085 [CHG] EC del dispositiu: FE: 7E: 10: B1: 92 Valor de dades del fabricant: 0x02 [CHG] EC del dispositiu: FE: 7E: 10: B1: 92 Valor de dades del fabricant: 0x00 [CHG] EC del dispositiu: FE: 7E: 10: B1: 92 Valor de dades del fabricant: 0x3c [CHG] EC del dispositiu: FE: 7E: 10: B1: 92 Valor de dades del fabricant: 0x25 [CHG] EC del dispositiu: FE: 7E: 10: B1: 92 Valor de dades del fabricant: 0x09 [CHG] EC del dispositiu: FE: 7E: 10: B1: 92 Valor de dades del fabricant: 0x41 [CHG] EC del dispositiu: FE: 7E: 10: B1: 92 Valor de les dades del fabricant: 0x02 [CHG] EC del dispositiu: FE: 7E: 10: B1: 92 Valor de dades del fabricant: 0x02 [CHG] EC: FE: 7E: 10: B1: 92 Valor de dades del fabricant: 0x43 [CHG] EC del dispositiu: FE: 7E: 10: B1: 92 Valor de dades del fabricant: 0x0b [CHG] EC del dispositiu: FE: 7E: 10: B1: 92 Dades del fabricant Valor: 0x01 [CHG] EC del dispositiu: FE: 7E: 10: B1: 92 Valor de dades del fabricant: 0x6f

Registre l'adreça MAC; caldrà introduir-la a l'script python per filtrar els dispositius Bluetooth LE no desitjats

Pas 6: afegiu l'script Python

Hi ha disponible una còpia de l'script de Python a:

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

Aquí teniu el mateix fitxer, teniu cura del sagnat quan copieu:

A més, actualitzeu l'adreça MAC al fitxer python perquè coincideixi amb l'adreça del sensor obtinguda del resultat de l'escaneig.

# Aquest programa és programari lliure: el podeu redistribuir i / o modificar

# it sota els termes de la Llicència Pública General GNU tal com la publica

# Free Software Foundation, ja sigui la versió 3 de la llicència, o bé

# (a la vostra opció) qualsevol versió posterior.

#

# Aquest programa es distribueix amb l'esperança que sigui útil, # però SENSE CAP GARANTIA; sense ni tan sols la garantia implícita de

# COMERCIALITZACIÓ o IDONEITAT PER A UN PROPOSESIT PARTICULAR. Vegeu el

# GNU General Public License per obtenir més informació.

#

# Hauríeu d'haver rebut una còpia de la llicència pública general de GNU

# juntament amb aquest programa. Si no, vegeu.

# bscan.py: escàner de Bluetooth LE simple i extractor de dades

de bluepy.btle import Scanner, DefaultDelegate

temps d'importació

importació pymysql

importació d’estructures

hostname = 'localhost'

nom d'usuari = 'datasrc'

password = 'datasrc000'

database = "SensorBug"

# Introduïu l'adreça MAC del sensor des del làscan

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

SENSOR_LOCATION = ["Garatge", "Exterior"]

classe DecodeErrorException (excepció):

def _init _ (auto, valor):

self.value = valor

def _str _ (auto):

retorn repr (self.value)

classe ScanDelegate (DefaultDelegate):

def _init _ (auto):

DefaultDelegate._ init _ (auto)

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

si isNewDev:

imprimeix "Dispositiu descobert", dev.addr

elif isNewData:

imprimir "Noves dades rebudes de", dev.addr

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

La taula #blesensor és data, hora, addr, ubicació, temperatura, accer

cur = conn.cursor ()

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

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

conn.commit ()

escàner = Scanner (). withDelegate (ScanDelegate ())

myConnection = pymysql.connect (amfitrió = nom d'amfitrió, usuari = nom d'usuari, passwd = contrasenya, db = base de dades)

ManuDataHex =

ReadLoop = Cert

provar:

mentre que (ReadLoop):

dispositius = scanner.scan (2.0)

ManuData = ""

per a desenvolupadors en dispositius:

entrada = 0

AcceroData = 0

AcceroType = 0

TempData = 0

per saddr a SENSOR_ADDRESS:

entrada + = 1

if (dev.addr == saddr):

imprimeix "Dispositiu% s (% s), RSSI =% d dB"% (dev.addr, dev.addrType, dev.rssi)

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION [entrada-1]

per a (adtype, desc, value) a dev.getScanData ():

imprimeix "% s =% s"% (desc, valor)

if (desc == "Fabricant"):

ManuData = valor

if (ManuData == ""):

imprimir "No s'ha rebut cap dada, finalitza la descodificació"

continuar

#print ManuData

per a i, j en zip (ManuData [:: 2], ManuData [1:: 2]):

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

#Comenceu a descodificar les dades brutes del fabricant

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

imprimir "S'ha trobat un byte de capçalera 0x0085"

en cas contrari:

imprimir "Byte de capçalera 0x0085 no trobat, parada de descodificació"

continuar

# Saltar Major / Menor

#Index 5 és 0x3c, indiqueu el nivell de la bateria i configureu #

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 "Dades:" + hexadecimal (ManuDataHex [idx])

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

# Dades de l’acceleròmetre

idx + = 1

AcceleroType = ManuDataHex [idx]

AcceleroData = ManuDataHex [idx + 1]

idx + = 2

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

#Dades de temperatura

idx + = 1

TempData = ManuDataHex [idx]

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

TempData = TempData * 0,0625

idx + = 2

en cas contrari:

idx + = 1

imprimeix "Adreça del dispositiu:" + CurrentDevAddr

imprimeix "Ubicació del dispositiu:" + CurrentDevLoc

imprimeix "Nivell de bateria:" + str (BatteryLevel) + "%"

imprimeix "Config Counter:" + str (ConfigCounter)

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

imprimeix "Temp Data:" + str (TempData)

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

ReadLoop = Fals

excepte DecodeErrorException:

passar

Pas 7: proveu l'script Python

L'escriptura s'ha d'executar a l'arrel, de manera que:

$ sudo python bscan.py Ec del dispositiu descobert: 6e: 7e: 10: b1: 92 Ec del dispositiu: 6e: 7e: 10: b1: 92 (públic), RSSI = -80 dB Indicadors = 06 Incomplets 16b Serveis = 0a18 Fabricant = 850002003c25094102024309016f Byte de capçalera 0x0085 trobat Adreça del dispositiu: ec: 6e: 7e: 10: b1: 92 Ubicació del dispositiu: Nivell de bateria del garatge: 37% Comptador de configuració: 9 Dades d'accero: 0x2 0x2 Dades temporals: 16.5625

Pas 8: afegiu el Python Scrip al Crontab

L’escriptura python s’ha d’executar a root, de manera que si voleu capturar les dades automàticament, s’haurà d’afegir al crontab de l’arrel. Per a aquest exemple, executo l'script cada 20 minuts. Utilitzeu l'ordre:

$ sudo crontab -e

# Editeu aquest fitxer per introduir tasques que executarà cron.

# # Cada tasca que cal executar s'ha de definir a través d'una única línia # que indica amb camps diferents quan s'executarà la tasca # i quina ordre cal executar per a la tasca # # Per definir el temps que podeu proporcionar valors concrets durant # minut (m), hora (h), dia del mes (dom), mes (dilluns), # i dia de la setmana (dow) o utilitzeu "*" en aquests camps (per a "qualsevol"). # # Tingueu en compte que s'iniciaran les tasques. basat en la noció de temps i zones horàries del sistema daemon del cron. # # La sortida dels treballs crontab (inclosos els errors) s'envia mitjançant # correu electrònic a l'usuari al qual pertany el fitxer crontab (tret que es redirigeixi). # # Per exemple, podeu executar una còpia de seguretat de tots els vostres comptes d'usuari # a les 5 de la matinada cada setmana amb: # 0 5 * * 1 tar -zcf /var/backups/home.tgz / home / # # Per obtenir més informació, consulteu el pàgines manuals de crontab (5) i 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

Això és. L'escriptura python s'executarà a intervals regulars i recodificarà la sortida a la base de dades SQL

Pas 9: addicional: configureu SensorBug per a la sortida de detecció de posició

Extra: configureu SensorBug per a la sortida de detecció de posició
Extra: configureu SensorBug per a la sortida de detecció de posició
Extra: configureu SensorBug per a la sortida de detecció de posició
Extra: configureu SensorBug per a la sortida de detecció de posició

És possible configurar el SensorBug a Android per a la sortida de detecció de posició. Per a la detecció de canvis de posició, l’anomenat Garage door.sensing, el SensorBug detectarà si el dispositiu està en posició vertical o està pla. Quan el dispositiu està pla, el valor registrat és 0x20 mentre que si el dispositiu està en posició vertical, el valor és 0x02. No es diferencia si la posició X o Y està cap amunt, sempre que l'eix Z no estigui cap amunt o cap avall. La manera més senzilla de fer-ho és utilitzar l'aplicació LightBlue. El SensorBug apareixerà al menú d’escaneig. Seleccioneu el dispositiu que voleu configurar, aneu a les característiques GATT per a la configuració de l’acceleròmetre UUID: 9DC84838-7619-4F09-A1CE-DDCF63225B11

Veure imatge: Escriviu una nova cadena de configuració:

010d3f02020000002d00000002 Llegiu de nou la cadena de configuració per confirmar l’escriptura. Això permet que l’acceleròmetre permeti la detecció de posició.

Recomanat: