Tabla de contenido:

Supervise y registre la temperatura con Bluetooth LE y RaspberryPi: 9 pasos (con imágenes)
Supervise y registre la temperatura con Bluetooth LE y RaspberryPi: 9 pasos (con imágenes)

Video: Supervise y registre la temperatura con Bluetooth LE y RaspberryPi: 9 pasos (con imágenes)

Video: Supervise y registre la temperatura con Bluetooth LE y RaspberryPi: 9 pasos (con imágenes)
Video: Arduino desde cero en Español - Capítulo 75 - Nano 33 BLE Sense Introducción y Bluetooth LE 2024, Mes de julio
Anonim
Supervise y registre la temperatura con Bluetooth LE y RaspberryPi
Supervise y registre la temperatura con Bluetooth LE y RaspberryPi
Supervise y registre la temperatura con Bluetooth LE y RaspberryPi
Supervise y registre la temperatura con Bluetooth LE y RaspberryPi

Este instructivo trata sobre cómo armar un sistema de monitoreo de temperatura de múltiples nodos con el error del sensor Bluetooth LE de Blue Radios (BLEHome) y RaspberryPi 3B Gracias al desarrollo del estándar Bluetooth LE, ahora hay sensores inalámbricos de baja potencia fácilmente disponibles en el mercado a un costo muy bajo y puede funcionar con una sola celda de botón durante meses. Uno de estos sensores que recogí es de Blue Radio llamado Sensor Bugs. Con un costo de alrededor de $ 25 en Amazon, es un dispositivo Bluetooth LE con sensor de temperatura, sensor de luz y acelerómetro, todo integrado en una pequeña unidad que puede comunicarse de forma inalámbrica. Esta es una combinación perfecta para Raspberry Pi 3B, que tiene soporte integrado para radio Bluetooth LE.

Paso 1: Configurar Raspberry Pi

El primer paso es conseguir una configuración de Raspberry Pi que funcione. Siga las instrucciones del sitio web de Raspberry Pi, cargue Raspbian en una tarjeta SD, insértela en Raspberry Pi y arranque. Configuré mi sistema con Raspbian Stretch Lite (Sin GUI) versión Nov 2017. Configure WiFi si es necesario, prefiero ajustar el zona horaria a la zona horaria actual en lugar de UTC. Puede hacer esto a través del comando: $ sudo dpkg-reconfigure tzdata El resto de la instrucción asume que la configuración se realiza a través de la interfaz de línea de comandos.

Paso 2: Configurar MySQL en Raspberry Pi

Es útil tener una base de datos instalada localmente para almacenar todos los datos capturados. Instalar MySQL en Raspberry Pi es muy fácil. Tampoco es difícil modificar el script para conectarse a un servidor SQL externamente, puede omitir este paso si desea utilizar un servidor SQL en la red. Hay muchas instrucciones en la red, sugiero esto: https:// www.stewright.me/2014/06/tutorial-install-…

Una vez que el servidor SQL está instalado, puede usar el cliente CLI de MySQL para crear un usuario, una base de datos y una tabla. Para ingresar a la CLI de MySQL, use el comando:

$ sudo mysql -uroot-p Primero, cree un usuario local para insertar los datos capturados:> CREAR USUARIO 'datasrc' @ 'localhost' IDENTIFICADO POR 'datasrc000'; A continuación, cree una base de datos y una tabla:> CREAR BASE DE DATOS SensorBug; Configurando el usuario permiso:> OTORGAR TODOS LOS PRIVILEGIOS EN SensorBug. * A 'datasrc' @ 'localhost'; Ahora agregue una nueva tabla a la base de datos. Para este ejemplo, voy a agregar una tabla con las siguientes columnas: FECHA, HORA, DIRECCIÓN, UBICACIÓN, TEMPERATURA y ACCERÓMETRO

  • FECHA / HORA: esta es la fecha y hora en que se registran los datos
  • DIRECCIÓN: esta es la MAC del SensorBug desde el que se captura el mensaje
  • UBICACIÓN: una cadena legible por humanos para indicar dónde se encuentra el sensor
  • TEMPERATURA: esta es la temperatura registrada
  • ACCELE: este es el valor de la salida del acelerómetro, útil para registrar la posición del sensor (si está habilitado)

El comando que hace esto es:> USE SensorBug; > CREAR TABLA de datos (fecha FECHA, hora HORA, dirección TINYTEXT, ubicación TINYTEXT, temperatura FLOAT, aceleración INT); Ahora que la base de datos está lista, podemos pasar a configurar los sensorBugs.

Paso 3: Configuración de SensorBugs

Los errores del sensor son pequeños dispositivos bastante geniales. Desafortunadamente, el fabricante solo proporcionó la aplicación IOS para programarlo. Sin embargo, aún es posible trabajar con él si solo tiene un dispositivo Android. Primer paso, empareje el dispositivo con un teléfono. Sin emparejar el dispositivo, el SensorBug no publicará datos. Traté de ver si puedo hacer esto directamente con RaspberryPi, desafortunadamente, parece que el controlador Bluetooth LE en RaspberryPi todavía es experimental y contiene errores para evitar que se empareje con dispositivos Bluetooth LE. La versión futura del controlador blueZ podría solucionar este problema, pero como la escritura actual, no hay forma de emparejar el SensorBug con RaspberryPi. Afortunadamente, no necesitamos emparejar el dispositivo para capturar los datos anunciados. Lo único que necesitamos es un teléfono para configurar el SensorBug. De forma predeterminada, el SensorBug comenzará a anunciar los datos de temperatura en un intervalo de 1 segundo una vez que esté emparejado con un dispositivo. Para capturar datos de temperatura, eso es todo lo que se necesita. Si planea expandirse para usar el sensor de posición o de luz, será necesario configurar el dispositivo. Para empezar, emparejaremos el dispositivo y lo desconectaremos. Esto será lo suficientemente bueno para fines de captura de temperatura. Comience presionando ambos botones en el SensorBug. El LED azul / verde parpadeará, lo que indica que está encendido. Presione uno de los botones, el LED verde debe encenderse, indica que la energía está encendida. Si el LED verde no está encendido, presione ambos botones para intentar encender el dispositivo nuevamente. Presione y mantenga presionado uno de los botones hasta que el LED azul comience a parpadear. Esto pondrá el dispositivo en modo de emparejamiento. Vaya al menú de configuración de Bluetooth en el teléfono y busque el dispositivo SensorBug. Una vez que aparezca, selecciónelo para emparejarlo con el dispositivo. Eso es todo, ahora el SensorBug está encendido y anuncia los datos de temperatura.

Paso 4: Instalación de la envoltura de Python Bluetooth LE

A continuación, debemos instalar la biblioteca para que Python hable con la pila Bluetooth LE. Las instrucciones se pueden encontrar aquí: https://github.com/IanHarvey/bluepy Para Python 2.7, es tan simple como ingresar los siguientes comandos:

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

Paso 5: escanee y averigüe la dirección del SensorBug

Para averiguar la dirección MAC de SensorBug, use este comando: $ sudo hcitool lescan Debería ver un resultado como:

EC: FE: 7E: 10: B1: 92 (desconocido) Si tiene muchos dispositivos Bluetooth LE, puede ser difícil saber con cuál está hablando. Puede probar bluetoothctl que brinda más detalles:

$ 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 Valor de ManufacturerData: 0x02 [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 Valor de ManufacturerData: 0x00 [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 Valor de ManufacturerData: 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 Valor: 0x43 [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 ManufacturerData Valor: 0x0b [CHG] Dispositivo EC: FE: 7E: 10: B1: 92 ManufacturerData Valor: 0x01 [CHG] EC del dispositivo: FE: 7E: 10: B1: 92 Valor de datos del fabricante: 0x6f

Registre la dirección MAC, será necesario ingresarla en el script de Python para filtrar los dispositivos Bluetooth LE no deseados

Paso 6: agregue la secuencia de comandos de Python

Una copia de la secuencia de comandos de Python está disponible en:

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

Aquí está el mismo archivo, cuide la sangría al copiar:

Además, actualice la dirección MAC en el archivo Python para que coincida con la dirección del sensor obtenida del resultado del escaneo.

# Este programa es software libre: puedes redistribuirlo y / o modificar

# bajo los términos de la Licencia Pública General GNU publicada por

# la Free Software Foundation, ya sea la versión 3 de la Licencia, o

# (a su elección) cualquier versión posterior.

#

# Este programa se distribuye con la esperanza de que sea útil, # pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de

# COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO EN PARTICULAR. Ver el

# Licencia pública general GNU para más detalles.

#

# Debería haber recibido una copia de la Licencia Pública General GNU

# junto con este programa. Si no, mira.

# bscan.py - Extractor de datos y escáner Bluetooth LE simple

desde bluepy.btle import Scanner, DefaultDelegate

tiempo de importación

importar pymysql

importar estructura

nombre de host = 'localhost'

nombre de usuario = 'datasrc'

contraseña = 'datasrc000'

base de datos = 'SensorBug'

#Introduzca la dirección MAC del sensor del lescan

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

SENSOR_LOCATION = ["Garaje", "Exterior"]

clase DecodeErrorException (Excepción):

def _init _ (self, value):

self.value = valor

def _str _ (yo):

return repr (valor propio)

clase ScanDelegate (DefaultDelegate):

def _init _ (yo):

DefaultDelegate._ init _ (auto)

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

si esNewDev:

imprimir "Dispositivo descubierto", dev.addr

elif isNewData:

imprimir "Nuevos datos recibidos de", dev.addr

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

La tabla #blesensor es fecha, hora, dirección, ubicación, temperatura, acceso

cur = conn.cursor ()

dostr = 'INSERT INTO data VALUES (FECHA_CURRENTE (), AHORA (),% s,% s,% s,% s);'

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

conn.commit ()

escáner = Escáner (). withDelegate (ScanDelegate ())

myConnection = pymysql.connect (host = nombre de host, usuario = nombre de usuario, contraseña = contraseña, db = base de datos)

ManuDataHex =

ReadLoop = True

tratar:

while (ReadLoop):

dispositivos = scanner.scan (2.0)

ManuData = ""

para desarrollo en dispositivos:

entrada = 0

AcceroData = 0

AcceroType = 0

TempData = 0

para saddr en SENSOR_ADDRESS:

entrada + = 1

si (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) en dev.getScanData ():

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

if (desc == "Fabricante"):

ManuData = valor

si (ManuData == ""):

imprimir "No se han recibido datos, finalizar la decodificación"

Seguir

#print ManuData

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

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

# Comience a decodificar los datos brutos del fabricante

si ((ManuDataHex [0] == 0x85) y (ManuDataHex [1] == 0x00)):

imprimir "Byte de encabezado 0x0085 encontrado"

demás:

imprimir "Byte de encabezado 0x0085 no encontrado, decodificación detenida"

Seguir

# Saltar Mayor / Menor

# El índice 5 es 0x3c, indica el nivel de la batería y el # de configuración

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

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

#Datos del acelerómetro

idx + = 1

AcceleroType = ManuDataHex [idx]

AcceleroData = ManuDataHex [idx + 1]

idx + = 2

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

# Datos de temperatura

idx + = 1

TempData = ManuDataHex [idx]

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

TempData = TempData * 0.0625

idx + = 2

demás:

idx + = 1

imprimir "Dirección del dispositivo:" + CurrentDevAddr

imprimir "Ubicación del dispositivo:" + CurrentDevLoc

imprimir "Nivel de batería:" + str (BatteryLevel) + "%"

imprimir "Config Contador:" + str (ConfigCounter)

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

imprimir "Datos temporales:" + str (TempData)

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

ReadLoop = False

excepto DecodeErrorException:

aprobar

Paso 7: Pruebe el script de Python

El script debe ejecutarse en la raíz, por lo que:

$ sudo python bscan.py Dispositivo descubierto ec: 6e: 7e: 10: b1: 92 Dispositivo ec: 6e: 7e: 10: b1: 92 (público), RSSI = -80 dB Banderas = 06 Incompleto 16b Servicios = 0a18 Fabricante = 850002003c25094102024309016f Se encontró el byte de encabezado 0x0085 Dirección del dispositivo: ec: 6e: 7e: 10: b1: 92 Ubicación del dispositivo: Garaje Nivel de batería: 37% Contador de configuración: 9 Datos de Accero: 0x2 0x2 Datos de temperatura: 16.5625

Paso 8: agregue Python Scrip a Crontab

El script de Python debe ejecutarse en la raíz, por lo que si desea capturar los datos automáticamente, deberá agregarlo al crontab de la raíz. Para este ejemplo, ejecuto el script cada 20 minutos Use el comando:

$ sudo crontab -e

# Edite este archivo para introducir las tareas que debe ejecutar cron.

# # Cada tarea a ejecutar debe definirse a través de una sola línea # indicando con diferentes campos cuándo se ejecutará la tarea # y qué comando ejecutar para la tarea # # Para definir el tiempo puede proporcionar valores concretos para # minuto (m), hora (h), día del mes (dom), mes (mon), # y día de la semana (dow) o use '*' en estos campos (para 'cualquier'). # # Observe que las tareas se iniciarán basado en la noción de tiempo y zonas horarias del # daemon del sistema Cron. # # La salida de los trabajos crontab (incluidos los errores) se envía por # correo electrónico al usuario al que pertenece el archivo crontab (a menos que se redirija). # # Por ejemplo, puede ejecutar una copia de seguridad de todas sus cuentas de usuario # a las 5 am cada semana con: # 0 5 * * 1 tar -zcf /var/backups/home.tgz / home / # # Para obtener más información, consulte el páginas de manual de crontab (5) y 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

Eso es todo. La secuencia de comandos de Python se ejecutará a intervalos regulares y recodificará la salida en la base de datos SQL.

Paso 9: Extra: Configure el SensorBug para la salida de detección de posición

Extra: Configure el SensorBug para la salida de detección de posición
Extra: Configure el SensorBug para la salida de detección de posición
Extra: Configure el SensorBug para la salida de detección de posición
Extra: Configure el SensorBug para la salida de detección de posición

Es posible configurar el SensorBug en Android para la salida de detección de posición Para la detección de cambio de posición, la llamada detección de puerta de garaje, el SensorBug detectará si el dispositivo está de pie o acostado en posición horizontal. Cuando el dispositivo está plano, el valor registrado es 0x20 mientras que si el dispositivo está en posición vertical, el valor es 0x02 No diferencia si la posición X o Y está hacia arriba, siempre que el eje Z no esté hacia arriba o hacia abajo. La forma más fácil de hacerlo es usar la aplicación LightBlue. El SensorBug debería aparecer en el menú de escaneo Seleccione el dispositivo que desea configurar, vaya a las características GATT para la configuración del acelerómetro UUID: 9DC84838-7619-4F09-A1CE-DDCF63225B11

Ver imagen: Escriba una nueva cadena de configuración:

010d3f02020000002d00000002 Vuelve a leer la cadena de configuración para confirmar la escritura. Esto habilita el acelerómetro para la detección de posición.

Recomendado: