Sommario:

Monitora e registra la temperatura con Bluetooth LE e RaspberryPi: 9 passaggi (con immagini)
Monitora e registra la temperatura con Bluetooth LE e RaspberryPi: 9 passaggi (con immagini)

Video: Monitora e registra la temperatura con Bluetooth LE e RaspberryPi: 9 passaggi (con immagini)

Video: Monitora e registra la temperatura con Bluetooth LE e RaspberryPi: 9 passaggi (con immagini)
Video: Controllo di temperatura con un Raspberry Pi e Amazon AWS 2024, Luglio
Anonim
Monitora e registra la temperatura con Bluetooth LE e RaspberryPi
Monitora e registra la temperatura con Bluetooth LE e RaspberryPi
Monitora e registra la temperatura con Bluetooth LE e RaspberryPi
Monitora e registra la temperatura con Bluetooth LE e RaspberryPi

Questa istruzione riguarda come mettere insieme un sistema di monitoraggio della temperatura multi-nodo con bug del sensore Bluetooth LE di Blue Radios (BLEHome) e RaspberryPi 3BGrazie allo sviluppo dello standard Bluetooth LE, ora sul mercato sono facilmente disponibili sensori wireless a bassa potenza per un costo molto basso e può funzionare su una singola pila a bottone per mesi alla volta. Uno di questi sensori che ho preso è di Blue Radio chiamato Sensor Bugs. Con un costo di circa $ 25 su Amazon, è un dispositivo Bluetooth LE con sensore di temperatura, sensore di luce e accemetro, tutti integrati in una piccola unità in grado di comunicare in modalità wireless. Si tratta di un abbinamento perfetto per Raspberry Pi 3B, che ha il supporto integrato per la radio Bluetooth LE.

Passaggio 1: imposta Raspberry Pi

Il primo passo è ottenere una configurazione funzionante di Raspberry Pi. Segui le istruzioni dal sito Web di Raspberry Pi, carica Raspbian su una scheda SD, inseriscilo in Raspberry Pi e avvialo. Ho configurato il mio sistema con Raspbian Stretch Lite (senza GUI) versione novembre 2017. Imposta il WiFi se necessario, preferisco regolare il fuso orario al fuso orario corrente anziché UTC. Puoi farlo tramite il comando: $ sudo dpkg-reconfigure tzdata Il resto dell'istruzione presuppone che l'installazione venga eseguita tramite l'interfaccia della riga di comando.

Passaggio 2: configurazione di MySQL su Raspberry Pi

È utile avere un database installato localmente per memorizzare tutti i dati acquisiti. Installare MySQL su Raspberry Pi è semplicissimo. Inoltre non è difficile modificare lo script per connettersi a un server SQL esternamente, puoi saltare questo passaggio se desideri utilizzare un server SQL in rete. Ci sono molte istruzioni in rete, suggerisco questo: https:// www.stewright.me/2014/06/tutorial-install-…

Una volta installato il server SQL, è possibile utilizzare il client MySQL CLI per creare utente, database e tabella. Per accedere a MySQL CLI, utilizzare il comando:

$ sudo mysql -uroot-pPrima crea un utente locale per inserire i dati acquisiti: > CREATE USER 'datasrc'@'localhost' IDENTIFICATO DA 'datasrc000';Quindi, crea un database e una tabella: > CREATE DATABASE SensorBug;Impostazione dell'utente permesso: > CONCEDERE TUTTI I PRIVILEGI SU SensorBug.* A 'datasrc'@'localhost';Ora aggiungi una nuova tabella al database. Per questo esempio, aggiungerò una tabella con le seguenti colonne: DATA, ORA, INDIRIZZO, LUOGO, TEMPERATURA e ACCEROMETRO

  • DATA/ORA - Questa è la data e l'ora in cui i dati vengono registrati
  • INDIRIZZO - Questo è il MAC del SensorBug da cui viene catturato il messaggio
  • POSIZIONE - Una stringa leggibile dall'uomo per indicare dove si trova il sensore
  • TEMPERATURA - Questa è la temperatura registrata
  • ACCELE - E' il valore dell'uscita dell'accelerometro, utile per registrare la posizione del sensore (se abilitato)

Il comando che fa questo è: > USE SensorBug; > CREATE TABLE data (data DATE, time TIME, indirizzo TINYTEXT, location TINYTEXT, temperatura FLOAT, accele INT);Ora il database è pronto, possiamo passare alla configurazione dei sensorBugs.

Passaggio 3: configurazione dei SensorBugs

I bug del sensore sono piccoli dispositivi piuttosto carini. Sfortunatamente, il produttore ha fornito solo l'app IOS per programmarlo. Tuttavia, è ancora possibile utilizzarlo se si dispone solo di un dispositivo Android. Primo passo, associare il dispositivo a un telefono. Senza associare il dispositivo, SensorBug non pubblicizzerà i dati. Ho provato a vedere se posso farlo direttamente con RaspberryPi, sfortunatamente, sembra che il driver Bluetooth LE su RaspberryPi sia ancora sperimentale e contenga bug per impedirne l'associazione con i dispositivi Bluetooth LE. La versione futura del driver blueZ potrebbe risolvere questo problema, ma come la scrittura attuale, non c'è modo di accoppiare SensorBug con RaspberryPi. Fortunatamente, non abbiamo bisogno di accoppiare il dispositivo per acquisire i suoi dati pubblicizzati. L'unica cosa di cui abbiamo bisogno è un telefono per configurare il SensorBug. Per impostazione predefinita, SensorBug inizierà a pubblicizzare i dati sulla temperatura a intervalli di 1 secondo una volta che è stato associato a un dispositivo. Per acquisire i dati sulla temperatura, è tutto ciò che serve. Se si prevede di espandere per utilizzare il sensore di posizione o di luce, sarà necessaria la configurazione del dispositivo. Per cominciare, accoppieremo il dispositivo e disconnetteremo. Questo sarà abbastanza buono per l'acquisizione della temperatura. Inizia premendo entrambi i pulsanti sul SensorBug. Il LED blu/verde lampeggerà, indicando che è acceso. Premere uno dei pulsanti, il LED verde dovrebbe accendersi, indicare che l'alimentazione è attiva. Se il LED verde non è acceso, premere entrambi i pulsanti per provare a riaccendere il dispositivo. Tenere premuto uno dei pulsanti finché il LED blu non inizia a lampeggiare. Questo metterà il dispositivo in modalità di associazione. Vai nel menu di configurazione Bluetooth sul telefono e cerca il dispositivo SensorBug. Una volta visualizzato, selezionalo per accoppiarlo con il dispositivo. Ecco fatto, ora il SensorBug è alimentato e pubblicizza i dati sulla temperatura

Passaggio 4: installazione di Bluetooth LE Python Wrapper

Successivamente abbiamo bisogno di installare la libreria affinché Python parli con lo stack Bluetooth LE. Le istruzioni possono essere trovate qui: https://github.com/IanHarvey/bluepy Per Python 2.7, è semplice come inserire i seguenti comandi:

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

Passaggio 5: scansiona e scopri l'indirizzo del SensorBug

Per scoprire l'indirizzo MAC di SensorBug, usa questo comando: $ sudo hcitool lescan Dovresti vedere un output come:

EC:FE:7E:10:B1:92 (sconosciuto)Se hai molti dispositivi Bluetooth LE in giro, potrebbe essere difficile scoprire con quale stai parlando. Puoi provare bluetoothctl che fornisce maggiori dettagli:

$ 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 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] Dispositivo EC:FE:7E:10:B1:92 Valore ManufacturerData: 0x25 [CHG] Dispositivo EC:FE:7E:10:B1:92 Valore ManufacturerData: 0x09 [CHG] Dispositivo 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 Valore: 0x01 [CHG] Dispositivo EC:FE:7E:10:B1:92 Valore ManufacturerData: 0x6f

Registra l'indirizzo MAC, questo dovrà essere inserito nello script Python per filtrare i dispositivi Bluetooth LE indesiderati

Passaggio 6: aggiungi lo script Python

Una copia dello script Python è disponibile da:

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

Ecco lo stesso file, prenditi cura del rientro durante la copia:

Inoltre, aggiorna l'indirizzo MAC nel file python in modo che corrisponda all'indirizzo del sensore ottenuto dal risultato della scansione.

# Questo programma è un software gratuito: puoi ridistribuirlo e/o modificarlo

# secondo i termini della GNU General Public License come pubblicata da

# la Free Software Foundation, versione 3 della licenza, oppure

# (a tua scelta) qualsiasi versione successiva.

#

# Questo programma è distribuito nella speranza che possa essere utile, # ma SENZA ALCUNA GARANZIA; senza nemmeno la garanzia implicita di

# COMMERCIABILITÀ o IDONEITÀ PER UN PARTICOLARE SCOPO. Vedi il

# GNU General Public License per maggiori dettagli.

#

# Dovresti aver ricevuto una copia della GNU General Public License

# insieme a questo programma. Se no, vedi.

# bscan.py - Semplice scanner LE bluetooth ed estrattore di dati

da bluepy.btle import Scanner, DefaultDelegate

tempo di importazione

import pymysql

struttura di importazione

hostname = 'localhost'

nome utente = 'datasrc'

password = 'datasrc000'

database = 'SensorBug'

#Inserisci l'indirizzo MAC del sensore dal lescan

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

SENSOR_LOCATION = ["Garage", "Esterno"]

class DecodeErrorException (eccezione):

def _init_(self, valore):

self.value = valore

def _str_(self):

return repr(self.value)

class ScanDelegate(DefaultDelegate):

def _init_(self):

DefaultDelegate._init_(self)

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

se èNewDev:

print "Dispositivo rilevato", dev.addr

elif isNewData:

print "Nuovi dati ricevuti da", dev.addr

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

La tabella #blesensor è data, ora, indirizzo, posizione, temperatura, accero

cur = conn.cursor()

dostr = 'INSERIRE NEI VALORI dati (CURRENT_DATE(), NOW(), %s, %s, %s, %s);'

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

conn.commit()

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

myConnection = pymysql.connect (host=hostname, user=username, passwd=password, db=database)

ManuDataHex =

ReadLoop = True

Tentativo:

mentre (ReadLoop):

dispositivi = scanner.scan(2.0)

Dati manu = ""

per lo sviluppo nei dispositivi:

entrata = 0

AcceroData = 0

AcceroType = 0

TempData = 0

per saddr in SENSOR_ADDRESS:

entrata += 1

if (dev.addr == saddr):

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

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION[voce-1]

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

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

if (desc == "Produttore"):

ManuData = valore

if (ManuData == ""):

print "Nessun dato ricevuto, fine decodifica"

Continua

#print ManuData

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

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

#Inizia a decodificare i dati grezzi del produttore

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

print "Intestazione byte 0x0085 trovato"

altro:

print "Intestazione byte 0x0085 non trovato, decodifica interrotta"

Continua

#Salta maggiore/minore

#L'indice 5 è 0x3c, indica il livello della batteria e la configurazione #

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

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

#Dati dell'accerometro

idx += 1

AcceleroType = ManuDataHex[idx]

AcceleroData = ManuDataHex[idx+1]

idx += 2

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

#Dati di temperatura

idx += 1

TempData = ManuDataHex[idx]

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

TempData = TempData * 0,0625

idx += 2

altro:

idx += 1

print "Indirizzo dispositivo: " + CurrentDevAddr

print "Posizione dispositivo: " + CurrentDevLoc

print "Livello batteria: " + str(Livello batteria) + "%"

print "Contatore configurazione: " + str(Contaconfig)

print "Dati Accelero: " + hex(TipoAccelero) + " " + hex(DatiAccelero)

print "Temp Data: " + str(TempData)

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

ReadLoop = False

tranne DecodeErrorException:

passaggio

Passaggio 7: prova lo script Python

Lo script deve essere eseguito in root, quindi:

$ sudo python bscan.pyDispositivo rilevato ec:6e:7e:10:b1:92 Dispositivo ec:6e:7e:10:b1:92 (pubblico), RSSI=-80 dB Flag = 06 Incompleto 16b Servizi = 0a18 Produttore = 850002003c25094102024309016f Byte intestazione 0x0085 trovato Indirizzo dispositivo: ec:6e:7e:10:b1:92 Posizione dispositivo: Garage Livello batteria: 37% Contatore configurazione: 9 Dati Accero: 0x2 0x2 Dati temperatura: 16.5625

Passaggio 8: aggiungi lo script Python al Crontab

Lo script python deve essere eseguito in root, quindi se si desidera acquisire i dati automaticamente, sarà necessario aggiungerlo al crontab di root. Per questo esempio, eseguo lo script ogni 20 minuti Usa il comando:

$ sudo crontab -e

# Modifica questo file per introdurre le attività che devono essere eseguite da cron.

# # Ogni attività da eseguire deve essere definita attraverso una singola riga # indicando con campi diversi quando l'attività verrà eseguita # e quale comando eseguire per l'attività # # Per definire il tempo puoi fornire valori concreti per # minuto (m), ora (h), giorno del mese (dom), mese (mon), # e giorno della settimana (dow) o usa '*' in questi campi (per 'any').# # Nota che le attività verranno avviate basato sulla nozione di tempo e fusi orari del demone di sistema di cron. # # L'output dei lavori crontab (inclusi gli errori) viene inviato tramite # email all'utente a cui appartiene il file crontab (a meno che non venga reindirizzato). # # Ad esempio, puoi eseguire un backup di tutti i tuoi account utente # alle 5 del mattino ogni settimana con: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # Per maggiori informazioni consulta il pagine di manuale di crontab(5) e cron(8) # # mh dom mon dow comando 0 * * * * python /home/pi/bscan.py 20 * * * * python /home/pi/bscan.py 40 * * * * python /home/pi/bscan.py

Questo è tutto. Lo script Python verrà eseguito a intervalli regolari e ricodifica l'output nel database SQL

Passaggio 9: Extra: configurare il SensorBug per l'uscita di rilevamento della posizione

Extra: configura il SensorBug per l'uscita di rilevamento della posizione
Extra: configura il SensorBug per l'uscita di rilevamento della posizione
Extra: configura il SensorBug per l'uscita di rilevamento della posizione
Extra: configura il SensorBug per l'uscita di rilevamento della posizione

È possibile configurare il SensorBug su Android per l'uscita di rilevamento della posizione Per il rilevamento del cambiamento di posizione, il cosiddetto Garage door.sensing, il SensorBug rileverà se il dispositivo è in posizione verticale o disteso. Quando il dispositivo è piatto, il valore registrato è 0x20 mentre se il dispositivo è in posizione verticale, il valore è 0x02 Non fa differenza se la posizione X o Y è in alto, purché l'asse Z non sia in alto o in basso. Il modo più semplice per farlo è utilizzare l'app LightBlue. Il SensorBug dovrebbe apparire nel menu di scansione. Seleziona il dispositivo che desideri configurare, vai alle caratteristiche GATT per la configurazione dell'accelerometro UUID:9DC84838-7619-4F09-A1CE-DDCF63225B11

Vedi immagine: Scrivi una nuova stringa di configurazione:

010d3f02020000002d00000002Rileggere la stringa di configurazione per confermare la scrittura. Ciò abilita l'accelerometro per il rilevamento della posizione.

Consigliato: