Table des matières:

Surveiller et enregistrer la température avec Bluetooth LE et RaspberryPi : 9 étapes (avec photos)
Surveiller et enregistrer la température avec Bluetooth LE et RaspberryPi : 9 étapes (avec photos)

Vidéo: Surveiller et enregistrer la température avec Bluetooth LE et RaspberryPi : 9 étapes (avec photos)

Vidéo: Surveiller et enregistrer la température avec Bluetooth LE et RaspberryPi : 9 étapes (avec photos)
Vidéo: 5 MEILLEURS Projets Raspberry Pi !! GENIAUX !! Home Assistant, OSMC, RecalBox, AdGuard, NextCloud 2024, Novembre
Anonim
Surveiller et enregistrer la température avec Bluetooth LE et RaspberryPi
Surveiller et enregistrer la température avec Bluetooth LE et RaspberryPi
Surveiller et enregistrer la température avec Bluetooth LE et RaspberryPi
Surveiller et enregistrer la température avec Bluetooth LE et RaspberryPi

Cette instructable explique comment mettre en place un système de surveillance de la température multi-nœuds avec le bogue du capteur Bluetooth LE de Blue Radios (BLEHome) et RaspberryPi 3BTgrâce au développement de la norme Bluetooth LE, il existe maintenant des capteurs sans fil basse consommation facilement disponibles sur le marché pour un coût très bas et peut fonctionner sur une seule pile bouton pendant des mois à la fois. L'un de ces capteurs que j'ai récupéré provient de Blue Radio, appelé Sensor Bugs. Coûtant environ 25 $ sur Amazon, il s'agit d'un appareil Bluetooth LE avec capteur de température, capteur de lumière et accéromètre, tous intégrés dans une petite unité qui peut communiquer sans fil. C'est un match parfait pour Raspberry Pi 3B, qui prend en charge la radio Bluetooth LE.

Étape 1: Configurer Raspberry Pi

La première étape consiste à obtenir une configuration Raspberry Pi fonctionnelle. Suivez les instructions du site Web de Raspberry Pi, chargez Raspbian sur une carte SD, insérez-le dans Raspberry Pi et démarrez-le. fuseau horaire au fuseau horaire actuel au lieu de UTC. Vous pouvez le faire via la commande: $ sudo dpkg-reconfigure tzdataLe reste de l'instruction suppose que la configuration est effectuée via l'interface de ligne de commande.

Étape 2: Configuration de MySQL sur Raspberry Pi

Il est utile d'avoir une base de données installée localement pour stocker toutes les données capturées. L'installation de MySQL sur Raspberry Pi est super facile. Il n'est pas non plus difficile de modifier le script pour se connecter à un serveur SQL en externe, vous pouvez sauter cette étape si vous souhaitez utiliser un serveur SQL sur le réseau. Il existe de nombreuses instructions sur le net, je vous suggère ceci:https:// www.stewright.me/2014/06/tutorial-install-…

Une fois le serveur SQL installé, vous pouvez utiliser le client MySQL CLI pour créer un utilisateur, une base de données et une table. Pour entrer dans MySQL CLI, utilisez la commande:

$ sudo mysql -uroot-pD'abord, créez un utilisateur local pour insérer les données capturées: > CREATE USER 'datasrc'@'localhost' IDENTIFYED BY 'datasrc000';Ensuite, créez une base de données et une table: > CREATE DATABASE SensorBug;Configuration de l'utilisateur permission: > ACCORDER TOUS LES PRIVILÈGES SUR SensorBug.* À 'datasrc'@'localhost';Ajoutez maintenant une nouvelle table à la base de données. Pour cet exemple, je vais ajouter un tableau avec les colonnes suivantes: DATE, HEURE, ADRESSE, LOCATION, TEMPERATURE et ACCEROMETRE

  • DATE/HEURE - C'est la date et l'heure auxquelles les données sont enregistrées
  • ADRESSE - Il s'agit du MAC du SensorBug à partir duquel le message est capturé
  • EMPLACEMENT - Une chaîne lisible par l'homme pour indiquer où se trouve le capteur
  • TEMPÉRATURE - C'est la température enregistrée
  • ACCELE - C'est la valeur de la sortie de l'accéléromètre, utile pour enregistrer la position du capteur (si activé)

La commande qui fait cela est: > USE SensorBug; > CREATE TABLE data (date DATE, time TIME, address TINYTEXT, location TINYTEXT, temperature FLOAT, accele INT); Maintenant que la base de données est prête, nous pouvons passer à la configuration des sensorBugs.

Étape 3: Configuration des SensorBugs

Les bugs de capteur sont de petits appareils plutôt chouettes. Malheureusement, le fabricant n'a fourni que l'application IOS pour la programmation. Néanmoins, il est toujours possible de travailler avec si vous n'avez qu'un appareil Android. Première étape, couplez l'appareil avec un téléphone. Sans coupler l'appareil, le SensorBug ne publiera pas de données. J'ai essayé de voir si je pouvais le faire directement avec RaspberryPi, malheureusement, il semble que le pilote Bluetooth LE sur RaspberryPi soit encore expérimental et contienne des bogues pour l'empêcher de se coupler avec des appareils Bluetooth LE. La future version du pilote blueZ pourrait résoudre ce problème, mais à l'heure actuelle, il n'y a aucun moyen de coupler le SensorBug avec RaspberryPi. Heureusement, nous n'avons pas besoin de coupler l'appareil pour capturer ses données annoncées. La seule chose dont nous avons besoin est un téléphone pour configurer le SensorBug. Par défaut, le SensorBug commencera à publier les données de température à un intervalle de 1 s une fois qu'il sera associé à un appareil. Pour capturer les données de température, c'est tout ce qui est nécessaire. Si vous envisagez d'étendre pour utiliser le capteur de position ou de lumière, la configuration de l'appareil sera nécessaire. Pour commencer, nous allons coupler l'appareil et le déconnecter. Ce sera assez bon pour la capture de la température. Commencez par appuyer sur les deux boutons du SensorBug. Le voyant bleu/vert clignote, ce qui indique qu'il est sous tension. Appuyez sur l'un des boutons, la LED verte doit s'allumer, indiquer que l'appareil est sous tension. Si le voyant vert n'est pas allumé, appuyez sur les deux boutons pour essayer de rallumer l'appareil. Appuyez et maintenez enfoncé l'un des boutons jusqu'à ce que le voyant bleu commence à clignoter. Cela mettra l'appareil en mode paire. Allez dans le menu de configuration Bluetooth sur le téléphone et recherchez l'appareil SensorBug. Une fois qu'il apparaît, sélectionnez-le pour le coupler avec l'appareil. C'est tout, maintenant le SensorBug est alimenté et affiche les données de température

Étape 4: Installation du wrapper Python Bluetooth LE

Ensuite, nous devons installer la bibliothèque pour python pour parler à la pile Bluetooth LE. Les instructions peuvent être trouvées ici: https://github.com/IanHarvey/bluepyPour Python 2.7, il suffit de saisir les commandes suivantes:

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

Étape 5: Scannez et trouvez l'adresse du SensorBug

Pour connaître l'adresse MAC de SensorBug, utilisez cette commande: $ sudo hcitool lescan Vous devriez voir une sortie comme:

EC:FE:7E:10:B1:92 (inconnu) Si vous avez beaucoup d'appareils Bluetooth LE à proximité, il peut être difficile de savoir à qui vous parlez. Vous pouvez essayer bluetoothctl qui donne plus de détails:

$ 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 Valeur ManufacturerData: 0x02 [CHG] Appareil EC:FE:7E:10:B1:92 Valeur ManufacturerData: 0x00 [CHG] Appareil EC:FE:7E:10:B1:92 Valeur ManufacturerData: 0x3c [CHG] Appareil EC:FE:7E:10:B1:92 Valeur ManufacturerData: 0x25 [CHG] Appareil EC:FE:7E:10:B1:92 Valeur ManufacturerData: 0x09 [CHG] Appareil EC:FE:7E:10:B1:92 Valeur ManufacturerData: 0x41 [CHG] Appareil EC:FE:7E:10:B1:92 Valeur ManufacturerData: 0x02 [CHG] Appareil EC:FE:7E:10:B1:92 Valeur ManufacturerData: 0x02 [CHG] Appareil EC:FE:7E:10:B1:92 Valeur ManufacturerData: 0x43 [CHG] Appareil EC:FE:7E:10:B1:92 Valeur ManufacturerData: 0x0b [CHG] Appareil EC:FE:7E:10:B1:92 ManufacturerData Valeur: 0x01 [CHG] Appareil EC:FE:7E:10:B1:92 Valeur ManufacturerData: 0x6f

Enregistrez l'adresse MAC, elle devra être entrée dans le script python pour filtrer les appareils Bluetooth LE indésirables

Étape 6: ajouter le script Python

Une copie du script Python est disponible sur:

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

Voici le même fichier, attention à l'indentation lors de la copie:

Mettez également à jour l'adresse MAC dans le fichier python pour qu'elle corresponde à l'adresse du capteur obtenue à partir du résultat de l'analyse.

# Ce programme est un logiciel libre: vous pouvez le redistribuer et/ou modifier

# sous les termes de la licence publique générale GNU telle que publiée par

# la Free Software Foundation, soit la version 3 de la Licence, soit

# (à votre choix) toute version ultérieure.

#

# Ce programme est distribué dans l'espoir qu'il sera utile, # mais SANS AUCUNE GARANTIE; sans même la garantie implicite de

# COMMERCIALISATION ou ADÉQUATION À UN USAGE PARTICULIER. Voir le

# Licence publique générale GNU pour plus de détails.

#

# Vous devriez avoir reçu une copie de la licence publique générale GNU

# avec ce programme. Sinon, voir.

# bscan.py - Scanner et extracteur de données Bluetooth LE simple

à partir de bluepy.btle import Scanner, DefaultDelegate

heure d'importation

importer pymysql

structure d'importation

nom d'hôte = 'localhost'

nom d'utilisateur = 'datasrc'

mot de passe = 'datasrc000'

base de données = 'SensorBug'

#Entrez l'adresse MAC du capteur du lescan

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

SENSOR_LOCATION = ["Garage", "Extérieur"]

classe DecodeErrorException(Exception):

def _init_(self, valeur):

self.value = valeur

def _str_(self):

return repr(self.value)

classe ScanDelegate(DefaultDelegate):

def _init_(self):

DefaultDelegate._init_(self)

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

si estNouveauDev:

print "Périphérique découvert", dev.addr

elif isNewData:

print "Nouvelles données reçues de", dev.addr

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

La table #blesensor est la date, l'heure, l'adresse, l'emplacement, la température, l'accéro

cur = conn.cursor()

dostr = 'INSÉRER DANS LES VALEURS DE données (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)

ManuDonnéesHex =

ReadLoop = True

essayer:

tandis que (ReadLoop):

appareils = scanner.scan(2.0)

ManuDonnées = ""

pour le développement dans les appareils:

entrée = 0

AccéroDonnées = 0

AccéroType = 0

DonnéesTemp = 0

pour saddr dans SENSOR_ADDRESS:

entrée += 1

if (dev.addr == saddr):

print "Périphérique %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType, dev.rssi)

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION[entry-1]

pour (type d'annonce, desc, valeur) dans dev.getScanData():

imprimer " %s = %s" % (desc, valeur)

if (desc == "Fabricant"):

ManuData = valeur

if (ManuData == ""):

print "Aucune donnée reçue, terminer le décodage"

Continuez

#print ManuData

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

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

#Commencer à décoder les données brutes du fabricant

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

print "Octet d'en-tête 0x0085 trouvé"

autre:

print "Octet d'en-tête 0x0085 introuvable, arrêt du décodage"

Continuez

#Ignorer Majeur/Mineur

#Index 5 est 0x3c, indiquez le niveau de batterie et la configuration #

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

BatteryLevel = ManuDataHex[5]

ConfigCounter = ManuDataHex[6]

idx = 7

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

tandis que (idx < len(ManuDataHex)):

#print "Idx: " + str(idx)

#print "Données: " + hex(ManuDataHex[idx])

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

#Données d'accéromètre

idx += 1

AcceleroType = ManuDataHex[idx]

AcceleroData = ManuDataHex[idx+1]

idx += 2

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

#Données de température

idx += 1

TempData = ManuDataHex[idx]

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

TempData = TempData * 0,0625

idx += 2

autre:

idx += 1

print « Adresse du périphérique: » + CurrentDevAddr

print "Emplacement de l'appareil: " + CurrentDevLoc

print "Niveau de la batterie: " + str(BatteryLevel) + "%"

print "Config Counter: " + str(ConfigCounter)

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

print "Données Temp: " + str(DonnéesTemp)

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

ReadLoop = Faux

sauf DecodeErrorException:

passe

Étape 7: testez le script Python

Le script doit être exécuté en root, donc:

$ sudo python bscan.pyDiscovered device ec:6e:7e:10:b1:92 Device ec:6e:7e:10:b1:92 (public), RSSI=-80 dB Flags = 06 Incomplet 16b Services = 0a18 Fabricant = 850002003c25094102024309016f Octet d'en-tête 0x0085 trouvé Adresse de l'appareil: ec:6e:7e:10:b1:92 Emplacement de l'appareil: Garage Niveau de batterie: 37% Compteur de configuration: 9 Données Accero: 0x2 Données de température 0x2: 16,5625

Étape 8: ajouter le script Python à la crontab

Le script python doit être exécuté à la racine, donc si vous souhaitez capturer les données automatiquement, il devra être ajouté à la crontab de la racine. Pour cet exemple, j'exécute le script toutes les 20 minutes Utilisez la commande:

$ sudo crontab -e

# Modifiez ce fichier pour introduire les tâches à exécuter par cron.

# # Chaque tâche à exécuter doit être définie sur une seule ligne # indiquant avec différents champs quand la tâche sera exécutée # et quelle commande exécuter pour la tâche # # Pour définir le temps, vous pouvez fournir des valeurs concrètes pour # minute (m), heure (h), jour du mois (dom), mois (mon), # et jour de la semaine (dow) ou utilisez '*' dans ces champs (pour 'any').# # Notez que les tâches seront démarrées basé sur la notion d'heure et de fuseaux horaires du système # du démon cron. # # La sortie des tâches crontab (y compris les erreurs) est envoyée par # e-mail à l'utilisateur auquel appartient le fichier crontab (sauf s'il est redirigé). # # Par exemple, vous pouvez exécuter une sauvegarde de tous vos comptes utilisateurs # à 5 heures du matin chaque semaine avec: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # Pour plus d'informations consultez le pages de manuel de crontab(5) et cron(8) # # mh dom mon dow commande 0 * * * * python /home/pi/bscan.py 20 * * * * python /home/pi/bscan.py 40 * * * * python /home/pi/bscan.py

C'est ça. Le script python sera exécuté à intervalles réguliers et recodera la sortie dans la base de données SQL

Étape 9: Supplémentaire: Configurer le SensorBug pour la sortie de détection de position

Extra: configurer le SensorBug pour la sortie de détection de position
Extra: configurer le SensorBug pour la sortie de détection de position
Extra: configurer le SensorBug pour la sortie de détection de position
Extra: configurer le SensorBug pour la sortie de détection de position

Il est possible de configurer le SensorBug sur Android pour la sortie de détection de position. tandis que si l'appareil est debout, la valeur est 0x02Il ne différencie pas si la position X ou Y est en haut, tant que l'axe Z n'est pas en haut ou en bas. La façon la plus simple de le faire est d'utiliser l'application LightBlue. Le SensorBug devrait apparaître dans le menu de numérisation. Sélectionnez l'appareil que vous souhaitez configurer, accédez aux caractéristiques du GATT pour la configuration de l'accéléromètre UUID: 9DC84838-7619-4F09-A1CE-DDCF63225B11

Voir l'image: écrivez une nouvelle chaîne de configuration:

010d3f020200000002d00000002Lisez la chaîne de configuration pour confirmer l'écriture. Cela active l'accéléromètre pour la détection de position.

Conseillé: