Índice:

Monitore e registre a temperatura com Bluetooth LE e RaspberryPi: 9 etapas (com imagens)
Monitore e registre a temperatura com Bluetooth LE e RaspberryPi: 9 etapas (com imagens)

Vídeo: Monitore e registre a temperatura com Bluetooth LE e RaspberryPi: 9 etapas (com imagens)

Vídeo: Monitore e registre a temperatura com Bluetooth LE e RaspberryPi: 9 etapas (com imagens)
Vídeo: doubling the drop every time the PC survives #shorts 2024, Novembro
Anonim
Monitore e registre a temperatura com Bluetooth LE e RaspberryPi
Monitore e registre a temperatura com Bluetooth LE e RaspberryPi
Monitore e registre a temperatura com Bluetooth LE e RaspberryPi
Monitore e registre a temperatura com Bluetooth LE e RaspberryPi

Este instrutivo é sobre como montar um sistema de monitoramento de temperatura de vários nós com bug do sensor Bluetooth LE da Blue Radios (BLEHome) e RaspberryPi 3B. Graças ao desenvolvimento do padrão Bluetooth LE, agora existem sensores sem fio de baixa potência prontamente disponíveis no mercado por um custo muito baixo e pode ser executado em uma única célula tipo moeda por meses a fio. Um desses sensores que peguei é da Blue Radio, chamado Sensor Bugs. Custando cerca de US $ 25 na Amazon, é um dispositivo Bluetooth LE com sensor de temperatura, sensor de luz e acelerômetro, todos integrados em uma pequena unidade que pode se comunicar sem fio. É uma combinação perfeita para Raspberry Pi 3B, que tem suporte integrado para rádio Bluetooth LE.

Etapa 1: configurar o Raspberry Pi

O primeiro passo é obter uma configuração do Raspberry Pi funcional. Siga as instruções do site do Raspberry Pi, carregue o Raspbian em um cartão SD, insira no Raspberry Pi e inicialize-o. Eu configurei meu sistema com Raspbian Stretch Lite (Sem GUI) versão de novembro de 2017. Configure o WiFi, se necessário, prefiro ajustar o fuso horário para o fuso horário atual em vez de UTC. Você pode fazer isso por meio do comando: $ sudo dpkg-reconfigure tzdataRest da instrução assume que a configuração é feita por meio da interface de linha de comando.

Etapa 2: configurar o MySQL no Raspberry Pi

É útil ter um banco de dados instalado localmente para armazenar todos os dados capturados. Instalar o MySQL no Raspberry Pi é muito fácil. Também não é difícil modificar o script para se conectar a um servidor SQL externamente, você pode pular esta etapa se desejar usar um servidor SQL na rede. Existem muitas instruções na rede, sugiro isto: https:// www.stewright.me/2014/06/tutorial-install-…

Depois que o servidor SQL estiver instalado, você pode usar o cliente MySQL CLI para criar usuário, banco de dados e tabela. Para entrar no MySQL CLI, use o comando:

$ sudo mysql -uroot-pFirst, crie um usuário local para inserir os dados capturados:> CRIAR USUÁRIO 'datasrc' @ 'localhost' IDENTIFICADO POR 'datasrc000'; Em seguida, crie um banco de dados e uma tabela:> CREATE DATABASE SensorBug; Configurando o usuário permissão:> GRANT ALL PRIVILEGES ON SensorBug. * TO 'datasrc' @ 'localhost'; Agora adicione uma nova tabela ao banco de dados. Para este exemplo, vou adicionar uma tabela com as seguintes colunas: DATA, HORA, ENDEREÇO, LOCALIZAÇÃO, TEMPERATURA e ACERÔMETRO

  • DATA / HORA - Esta é a data e hora em que os dados são gravados
  • ENDEREÇO - Este é o MAC do SensorBug do qual a mensagem é capturada
  • LOCALIZAÇÃO - Uma string legível para indicar onde o sensor está localizado
  • TEMPERATURA - Esta é a temperatura registrada
  • ACCELE - Este é o valor da saída do acelerômetro, útil para registrar a posição do sensor (se habilitado)

O comando que faz isso é:> USE SensorBug; > CREATE TABLE data (data DATE, time TIME, endereço TINYTEXT, localização TINYTEXT, temperatura FLOAT, accele INT); Agora o banco de dados está pronto, podemos passar a configurar os sensoresBugs.

Etapa 3: Configurando os SensorBugs

Os bugs do sensor são pequenos dispositivos muito legais. Infelizmente, o fabricante forneceu apenas um aplicativo IOS para programá-lo. No entanto, ainda é possível trabalhar com ele se você tiver apenas um dispositivo Android. Primeiro passo, emparelhe o dispositivo com um telefone. Sem emparelhar o dispositivo, o SensorBug não anunciará dados. Tentei ver se posso fazer isso diretamente com o RaspberryPi, infelizmente, parece que o driver Bluetooth LE no RaspberryPi ainda é experimental e contém bugs para impedir que seja emparelhado com dispositivos Bluetooth LE. A versão futura do driver blueZ pode consertar isso, mas conforme a escrita atual, não há como emparelhar o SensorBug com RaspberryPi. Felizmente, não precisamos emparelhar o dispositivo para capturar seus dados anunciados. A única coisa que precisamos é de um telefone para configurar o SensorBug. Por padrão, o SensorBug começará a anunciar os dados de temperatura em intervalos de 1s, uma vez que seja emparelhado com um dispositivo. Para capturar dados de temperatura, isso é tudo o que é necessário. Se você planeja expandir para usar o sensor de posição ou luz, então a configuração do dispositivo será necessária. Para começar, vamos emparelhar o dispositivo e desconectar. Isso será bom o suficiente para fins de captura de temperatura. Comece pressionando os dois botões no SensorBug. O LED azul / verde piscará, indicando que está ligado. Pressione um dos botões, o LED verde deve acender, indicando que a alimentação está ligada. Se o LED verde não estiver aceso, pressione os dois botões para tentar ligar o dispositivo novamente. Pressione e segure um dos botões até que o LED azul comece a piscar. Isso colocará o dispositivo em modo de emparelhamento. Vá para o menu de configuração do Bluetooth no telefone e procure o dispositivo SensorBug. Assim que aparecer, selecione-o para emparelhar com o dispositivo. É isso, agora o SensorBug está ligado e anunciando os dados de temperatura

Etapa 4: Instalando o Wrapper Bluetooth LE Python

Em seguida, precisamos instalar a biblioteca para python para falar com a pilha Bluetooth LE. A instrução pode ser encontrada aqui: https://github.com/IanHarvey/bluepyFor Python 2.7, é tão simples quanto inserir os seguintes comandos:

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

Etapa 5: Faça a varredura e descubra o endereço do SensorBug

Para descobrir o endereço MAC do SensorBug, use este comando: $ sudo hcitool lescan Você deve ver uma saída como:

EC: FE: 7E: 10: B1: 92 (desconhecido) Se você tiver muitos dispositivos Bluetooth LE por perto, pode ser difícil descobrir com qual deles você está falando. Você pode tentar o bluetoothctl, que fornece mais detalhes:

$ sudo bluetoothctl [bluetooth] # scan on [NEW] Dispositivo EC: FE: 7E: 10: B1: 92 SensorBug10B192 [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 FabricanteChave de dados: 0x0085 [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 Valor de dados do fabricante: 0x02 [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 Valor de dados do fabricante: 0x00 [CHG] EC do dispositivo: FE: 7E: 10: B1: 92 Valor de dados do fabricante: 0x3c [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 Valor de dados do fabricante: 0x25 [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 Valor de dados do fabricante: 0x09 [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 Valor de dados do fabricante: 0x41 [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 Valor de dados do fabricante: 0x02 [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 Valor de dados do fabricante: 0x02 [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 Valor dos dados do fabricante: 0x43 [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 Valor dos dados do fabricante: 0x0b [CHG] EC do dispositivo: FE: 7E: 10: B1: 92 Dados do fabricante Valor: 0x01 [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 FabricanteData Valor: 0x6f

Registre o endereço MAC, ele precisará ser inserido no script python para filtrar dispositivos Bluetooth LE indesejados

Etapa 6: adicione o script Python

Uma cópia do script Python está disponível em:

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

Aqui está o mesmo arquivo, tome cuidado com o recuo ao copiar:

Além disso, atualize o endereço MAC no arquivo python para corresponder ao endereço do sensor obtido do resultado da varredura.

# Este programa é um software livre: você pode redistribuí-lo e / ou modificar

# sob os termos da GNU General Public License conforme publicada por

# a Free Software Foundation, seja a versão 3 da Licença, ou

# (à sua escolha) qualquer versão posterior.

#

# Este programa é distribuído na esperança de ser útil, # mas SEM QUALQUER GARANTIA; sem mesmo a garantia implícita de

# COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM. Veja o

# GNU General Public License para mais detalhes.

#

# Você deve ter recebido uma cópia da GNU General Public License

# junto com este programa. Se não, veja.

# bscan.py - Leitor e extrator de dados bluetooth LE simples

de bluepy.btle import Scanner, DefaultDelegate

tempo de importação

importar pymysql

importar estrutura

hostname = 'localhost'

username = 'datasrc'

senha = 'datasrc000'

banco de dados = 'SensorBug'

# Digite o endereço MAC do sensor do lescan

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

SENSOR_LOCATION = ["Garagem", "Exterior"]

classe DecodeErrorException (Exception):

def _init _ (self, value):

self.value = value

def _str _ (self):

return repr (self.value)

classe ScanDelegate (DefaultDelegate):

def _init _ (self):

DefaultDelegate._ init _ (self)

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

if isNewDev:

imprimir "Dispositivo descoberto", dev.addr

elif isNewData:

print "Recebidos novos dados de", dev.addr

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

#blesensor table is date, time, addr, location, 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 = hostname, user = username, passwd = password, db = database)

ManuDataHex =

ReadLoop = True

Experimente:

while (ReadLoop):

devices = scanner.scan (2.0)

ManuData = ""

para dev em dispositivos:

entrada = 0

AcceroData = 0

AcceroType = 0

TempData = 0

para saddr em SENSOR_ADDRESS:

entrada + = 1

if (dev.addr == saddr):

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

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION [entrada-1]

para (adtype, desc, value) em dev.getScanData ():

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

if (desc == "Fabricante"):

ManuData = valor

if (ManuData == ""):

imprimir "Nenhum dado recebido, finalizar a decodificação"

Prosseguir

#print ManuData

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

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

# Comece a decodificar os dados brutos do fabricante

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

imprimir "Cabeçalho byte 0x0085 encontrado"

outro:

print "Cabeçalho byte 0x0085 não encontrado, parada de decodificação"

Prosseguir

#Skip Major / Minor

#Index 5 é 0x3c, indica o nível da bateria e config #

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

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

#Accerometer data

idx + = 1

AcceleroType = ManuDataHex [idx]

AcceleroData = ManuDataHex [idx + 1]

idx + = 2

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

#Temperature data

idx + = 1

TempData = ManuDataHex [idx]

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

TempData = TempData * 0,0625

idx + = 2

outro:

idx + = 1

imprimir "Endereço do dispositivo:" + CurrentDevAddr

imprimir "Localização do dispositivo:" + CurrentDevLoc

imprimir "Nível da bateria:" + str (BatteryLevel) + "%"

imprimir "Contador de configuração:" + str (ConfigCounter)

imprimir "Dados Accelero:" + hex (AcceleroType) + "" + hex (AcceleroData)

imprimir "Temp Data:" + str (TempData)

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

ReadLoop = False

exceto DecodeErrorException:

passar

Etapa 7: teste o script Python

O script deve ser executado na raiz, então:

$ sudo python bscan.pyDiscovered device ec: 6e: 7e: 10: b1: 92 Dispositivo ec: 6e: 7e: 10: b1: 92 (público), RSSI = -80 dB Sinalizadores = 06 Incompleto 16b Services = 0a18 Fabricante = 850002003c25094102024309016f Byte do cabeçalho 0x0085 encontrado Endereço do dispositivo: ec: 6e: 7e: 10: b1: 92 Localização do dispositivo: Nível da bateria da garagem: 37% Contador de configuração: 9 Dados Accero: 0x2 0x2 Dados Temp: 16.5625

Etapa 8: adicione o script Python ao Crontab

O script python deve ser executado na raiz, portanto, se você quiser capturar os dados automaticamente, será necessário adicioná-los ao crontab da raiz. Para este exemplo, eu executo o script a cada 20 minutos Use o comando:

$ sudo crontab -e

# Edite este arquivo para apresentar as tarefas a serem executadas pelo cron.

# # Cada tarefa a ser executada deve ser definida através de uma única linha # indicando com diferentes campos quando a tarefa será executada # e qual comando executar para a tarefa # # Para definir o tempo você pode fornecer valores concretos para # minuto (m), hora (h), dia do mês (dom), mês (mon), # e dia da semana (dow) ou use '*' nestes campos (para 'qualquer'). # # Observe que as tarefas serão iniciadas com base na noção do # daemon do sistema cron de tempo e fusos horários. # # A saída dos jobs do crontab (incluindo erros) é enviada por meio de # e-mail ao usuário ao qual o arquivo crontab pertence (a menos que seja redirecionado). # # Por exemplo, você pode executar um backup de todas as suas contas de usuário # às 5h todas as semanas com: # 0 5 * * 1 tar -zcf /var/backups/home.tgz / home / # # Para obter mais informações, consulte o páginas de manual de crontab (5) e 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

É isso. O script python será executado em intervalos regulares e recodificará a saída no banco de dados SQL

Etapa 9: Extra: Configurar o SensorBug para saída de detecção de posição

Extra: Configure o SensorBug para saída de detecção de posição
Extra: Configure o SensorBug para saída de detecção de posição
Extra: Configure o SensorBug para saída de detecção de posição
Extra: Configure o SensorBug para saída de detecção de posição

É possível configurar o SensorBug no Android para saída de detecção de posição. Para detecção de mudança de posição, chamada de porta de garagem. Detecção, o SensorBug detectará se o dispositivo está em pé ou deitado. Quando o dispositivo está plano, o valor registrado é 0x20 enquanto se o dispositivo estiver em pé, o valor é 0x02Não diferencia se a posição X ou Y está para cima, desde que o eixo Z não esteja para cima ou para baixo. A maneira mais fácil de fazer isso é usar o aplicativo LightBlue. O SensorBug deve aparecer no menu de varredura. Selecione o dispositivo que deseja configurar, vá para as características do GATT para configuração do acelerômetro UUID: 9DC84838-7619-4F09-A1CE-DDCF63225B11

Veja a imagem: Escreva uma nova string de configuração:

010d3f02020000002d00000002Reia a string de configuração para confirmar a gravação. Isso ativa o acelerômetro para detecção de posição.

Recomendado: