Spisu treści:

Monitoruj i rejestruj temperaturę za pomocą Bluetooth LE i RaspberryPi: 9 kroków (ze zdjęciami)
Monitoruj i rejestruj temperaturę za pomocą Bluetooth LE i RaspberryPi: 9 kroków (ze zdjęciami)

Wideo: Monitoruj i rejestruj temperaturę za pomocą Bluetooth LE i RaspberryPi: 9 kroków (ze zdjęciami)

Wideo: Monitoruj i rejestruj temperaturę za pomocą Bluetooth LE i RaspberryPi: 9 kroków (ze zdjęciami)
Wideo: [Webinar] 2020/01/24 ADVANTECH - komputery przemysłowe 2024, Listopad
Anonim
Monitoruj i rejestruj temperaturę za pomocą Bluetooth LE i RaspberryPi
Monitoruj i rejestruj temperaturę za pomocą Bluetooth LE i RaspberryPi
Monitoruj i rejestruj temperaturę za pomocą Bluetooth LE i RaspberryPi
Monitoruj i rejestruj temperaturę za pomocą Bluetooth LE i RaspberryPi

Ta instrukcja dotyczy zestawienia wielowęzłowego systemu monitorowania temperatury z błędem czujnika Bluetooth LE od Blue Radios (BLEHome) i RaspberryPi 3BDzięki opracowaniu standardu Bluetooth LE, na rynku są teraz łatwo dostępne czujniki bezprzewodowe o niskim poborze mocy za bardzo niski koszt i może działać na jednej baterii monetowej przez wiele miesięcy. Jeden z tych czujników, które wybrałem, pochodzi z Blue Radio o nazwie Sensor Bugs. Kosztujące około 25 USD na Amazon, jest to urządzenie Bluetooth LE z czujnikiem temperatury, czujnikiem światła i akcelerometrem, które jest wbudowane w małe urządzenie, które może komunikować się bezprzewodowo. Jest to idealne dopasowanie do Raspberry Pi 3B, które ma wbudowaną obsługę radia Bluetooth LE.

Krok 1: Skonfiguruj Raspberry Pi

Pierwszym krokiem jest uzyskanie działającej konfiguracji Raspberry Pi. Postępuj zgodnie z instrukcjami ze strony Raspberry Pi, załaduj Raspbian na kartę SD, włóż do Raspberry Pi i uruchom go. Konfiguruję swój system z Raspbian Stretch Lite (bez GUI) w wersji listopad 2017. W razie potrzeby skonfiguruj WiFi, wolę dostosować strefę czasową do bieżącej strefy czasowej zamiast UTC. Możesz to zrobić za pomocą polecenia: $ sudo dpkg-reconfigure tzdata Pozostała część instrukcji zakłada, że konfiguracja jest wykonywana przez interfejs wiersza poleceń.

Krok 2: Konfiguracja MySQL na Raspberry Pi

Warto mieć lokalnie zainstalowaną bazę danych do przechowywania wszystkich przechwyconych danych. Instalacja MySQL na Raspberry Pi jest bardzo łatwa. Nie jest również trudno zmodyfikować skrypt, aby połączyć się z serwerem SQL zewnętrznie, możesz pominąć ten krok, jeśli chcesz korzystać z serwera SQL w sieci. W sieci jest wiele instrukcji, sugeruję: https:// www.stewright.me/2014/06/tutorial-install-…

Po zainstalowaniu serwera SQL możesz użyć klienta MySQL CLI do utworzenia użytkownika, bazy danych i tabeli. Aby wprowadzić MySQL CLI, użyj polecenia:

$ sudo mysql -uroot-pFirst, utwórz lokalnego użytkownika do wstawiania przechwyconych danych: > CREATE USER 'datasrc'@'localhost' IDENTIFYED BY 'datasrc000';Następnie stwórz bazę danych i tabelę: > CREATE DATABASE SensorBug;Konfiguracja użytkownika uprawnienie: > PRZYZNAJ WSZYSTKIE UPRAWNIENIA DLA SensorBug.* TO 'datasrc'@'localhost';Teraz dodaj nową tabelę do bazy danych. W tym przykładzie dodam tabelę z następującymi kolumnami: DATE, TIME, ADDRESS, LOCATION, TEMPERATURE i ACCEROMETER

  • DATA/CZAS - Jest to data i godzina zapisu danych
  • ADRES - jest to adres MAC czujnika SensorBug, z którego wiadomość została przechwycona
  • LOKALIZACJA - ciąg znaków czytelny dla człowieka wskazujący lokalizację czujnika
  • TEMPERATURA - To jest zarejestrowana temperatura
  • ACCELE - Jest to wartość wyjścia akcelerometru, przydatna do rejestrowania pozycji czujnika (jeśli jest włączony)

Polecenie, które to robi to: > USE SensorBug; > CREATE TABLE dane (data DATE, godzina TIME, adres TINYTEXT, lokalizacja TINYTEXT, temperatura FLOAT, accele INT); Teraz baza danych jest gotowa, możemy przejść do konfiguracji sensorBugs.

Krok 3: Konfiguracja SensorBugs

Błędy czujników to całkiem zgrabne małe urządzenia. Niestety producent udostępnił jedynie aplikację na IOS do jej programowania. Niemniej jednak nadal można z nim pracować, jeśli masz tylko urządzenie z systemem Android. Najpierw sparuj urządzenie z telefonem. Bez sparowania urządzenia SensorBug nie będzie reklamował danych. Próbowałem sprawdzić, czy mogę to zrobić bezpośrednio z RaspberryPi, niestety wygląda na to, że sterownik Bluetooth LE na RaspberryPi jest nadal eksperymentalny i zawiera błędy, które uniemożliwiają jego parowanie z urządzeniami Bluetooth LE. Przyszła wersja sterownika blueZ może to naprawić, ale w obecnej wersji nie ma możliwości sparowania SensorBug z RaspberryPi. Na szczęście nie musimy parować urządzenia, aby przechwytywać jego reklamowane dane. Jedyne czego potrzebujemy to telefon do konfiguracji SensorBug. Domyślnie SensorBug zacznie ogłaszać dane o temperaturze w odstępach 1s po sparowaniu z urządzeniem. Do przechwytywania danych o temperaturze to wszystko, co jest potrzebne. Jeśli planujesz rozbudować o wykorzystanie czujnika położenia lub światła, wówczas konfiguracja urządzenia będzie potrzebna. Na początek sparujemy urządzenie i rozłączymy. To wystarczy do pomiaru temperatury. Zacznij od wciśnięcia obu przycisków SensorBug. Niebiesko-zielona dioda LED zacznie migać, co oznacza, że urządzenie jest włączone. Naciśnij jeden z przycisków, zielona dioda LED powinna się zaświecić, wskazując, że zasilanie jest włączone. Jeśli zielona dioda LED nie świeci, naciśnij oba przyciski, aby spróbować ponownie włączyć urządzenie. Naciśnij i przytrzymaj jeden z przycisków, aż niebieska dioda LED zacznie migać. Spowoduje to przejście urządzenia w tryb parowania. Przejdź do menu konfiguracji Bluetooth w telefonie i poszukaj urządzenia SensorBug. Gdy się pojawi, wybierz go, aby sparować z urządzeniem. To wszystko, teraz SensorBug jest zasilany i wyświetla dane o temperaturze

Krok 4: Instalowanie opakowania Bluetooth LE Python

Następnie musimy zainstalować bibliotekę, aby python mógł komunikować się ze stosem Bluetooth LE. Instrukcję można znaleźć tutaj: https://github.com/IanHarvey/bluepyW przypadku Pythona 2.7 wystarczy wpisać następujące polecenia:

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

Krok 5: Skanuj i znajdź adres SensorBug

Aby znaleźć adres MAC SensorBug, użyj tego polecenia: $ sudo hcitool lescan Powinieneś zobaczyć dane wyjściowe takie jak:

EC:FE:7E:10:B1:92 (nieznane)Jeśli masz w pobliżu wiele urządzeń Bluetooth LE, może być trudno określić, z którym z nich rozmawiasz. Możesz spróbować bluetoothctl, które podają więcej szczegółów:

$ sudo bluetoothctl[bluetooth]# skanuj na [NOWOŚĆ] Urządzenie EC:FE:7E:10:B1:92 SensorBug10B192 [CHG] Urządzenie EC:FE:7E:10:B1:92 ManufacturerData Key: 0x0085 [CHG] Device EC: FE:7E:10:B1:92 ManufacturerData Wartość: 0x02 [CHG] Device EC:FE:7E:10:B1:92 ManufacturerData Wartość: 0x00 [CHG] Device EC:FE:7E:10:B1:92 ManufacturerData Wartość: 0x3c [CHG] EC urządzenia:FE:7E:10:B1:92 ManufacturerData Wartość: 0x25 [CHG] EC urządzenia:FE:7E:10:B1:92 ManufacturerData Wartość: 0x09 [CHG] EC urządzenia:FE:7E:10:B1:92 ManufacturerData Wartość: 0x41 [CHG] Urządzenie EC:FE:7E:10:B1:92 ManufacturerData Wartość: 0x02 [CHG] Urządzenie EC:FE:7E:10:B1:92 ManufacturerData Wartość: 0x02 [CHG] Urządzenie EC:FE:7E:10:B1:92 ManufacturerData Wartość: 0x43 [CHG] Urządzenie EC:FE:7E:10:B1:92 ManufacturerData Wartość: 0x0b [CHG] Urządzenie EC:FE:7E:10:B1:92 ManufacturerData Wartość: 0x01 [CHG] Urządzenie EC:FE:7E:10:B1:92 ManufacturerData Wartość: 0x6f

Zapisz adres MAC, który będzie musiał zostać wprowadzony do skryptu Pythona, aby odfiltrować niechciane urządzenia Bluetooth LE

Krok 6: Dodaj skrypt Pythona

Kopia skryptu Pythona jest dostępna pod adresem:

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

Oto ten sam plik, zadbaj o wcięcie podczas kopiowania:

Zaktualizuj również adres MAC w pliku Pythona, aby pasował do adresu czujnika uzyskanego z wyniku skanowania.

# Ten program jest darmowym oprogramowaniem: możesz go redystrybuować i/lub modyfikować

# na warunkach GNU General Public License opublikowanej przez

# Free Software Foundation, wersja 3 licencji lub

# (do wyboru) dowolna nowsza wersja.

#

# Ten program jest rozpowszechniany w nadziei, że będzie przydatny, # ale BEZ ŻADNEJ GWARANCJI; nawet bez dorozumianej gwarancji

# SPRZEDAWALNOŚĆ lub PRZYDATNOŚĆ DO OKREŚLONEGO CELU. Zobacz

# Powszechna Licencja Publiczna GNU, aby uzyskać więcej informacji.

#

# Powinieneś otrzymać kopię Powszechnej Licencji Publicznej GNU

# wraz z tym programem. Jeśli nie, zobacz.

# bscan.py - Prosty skaner Bluetooth LE i ekstraktor danych

z bluepy.btle import Scanner, DefaultDelegate

czas importu

importuj pymysql

importuj strukturę

nazwa hosta = 'host lokalny'

nazwa użytkownika = 'źródło danych'

hasło = 'datasrc000'

baza danych = 'SensorBug'

#Wprowadź adres MAC czujnika z lescan

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

SENSOR_LOCATION = ["Garaż", "Na zewnątrz"]

klasa DecodeErrorException(Wyjątek):

def _init_(self, wartość):

self.value = wartość

def _str_(samo):

return repr(self.value)

class ScanDelegate (DefaultDelegate):

def _init_(self):

DefaultDelegate._init_(self)

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

jeśli jest NoweDev:

print "Wykryte urządzenie", dev.addr

elif is NewData:

print "Otrzymano nowe dane od", dev.addr

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

Tabela #blesensor to data, godzina, adres, lokalizacja, temp, accero

cur = conn.cursor()

dostr = 'WSTAW W WARTOŚCI danych (BIEŻĄCA_DATA(), TERAZ(), %s, %s, %s, %s);'

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

poł.zatwierdzenie()

skaner = Scanner().withDelegate(ScanDelegate())

myConnection = pymysql.connect (host=nazwa hosta, użytkownik=nazwa użytkownika, hasło=hasło, db=baza danych)

ManuDataHex =

Pętla odczytu = Prawda

próbować:

podczas (ReadLoop):

urządzenia = scan.scan(2.0)

Dane ręczne = ""

dla urządzeń deweloperskich:

wpis = 0

AcceroData = 0

AcceroType = 0

Dane temp. = 0

dla saddr w SENSOR_ADDRESS:

wpis += 1

if (dev.addr == saddr):

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

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION[entry-1]

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

drukuj " %s = %s" % (opis, wartość)

if (opis == "Producent"):

ManuData = wartość

jeśli (ManuData == ""):

print "Nie odebrano danych, zakończ dekodowanie"

kontyntynuj

#drukuj dane manu

dla i, j w zip (ManuData[::2], ManuData[1::2]):

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

#Rozpocznij dekodowanie surowych danych producenta

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

print "Znaleziono bajt nagłówka 0x0085"

w przeciwnym razie:

print "Nie znaleziono bajtu nagłówka 0x0085, zatrzymanie dekodowania"

kontyntynuj

#Pomiń główny/podrzędny

#Indeks 5 to 0x3c, wskazuje poziom naładowania baterii i konfigurację #

jeśli (ManuDataHex[4] == 0x3c):

Poziom Baterii = ManuDataHex[5]

ConfigCounter = ManuDataHex[6]

idx = 7

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

while (idx < len(ManuDataHex)):

#print "Idx: " + str(idx)

#print "Dane: " + hex(ManuDataHex[idx])

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

#Dane akcerometru

idx += 1

AcceleroType = ManuDataHex[idx]

AcceleroData = ManuDataHex[idx+1]

idx += 2

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

#Dane temperatury

idx += 1

Dane Temp = ManuDataHex[idx]

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

Dane Temp = Dane Temp * 0,0625

idx += 2

w przeciwnym razie:

idx += 1

print "Adres urządzenia: " + CurrentDevAddr

print "Lokalizacja urządzenia: " + CurrentDevLoc

print "Poziom baterii: " + str(BatteryLevel) + "%"

print "Licznik konfiguracji: " + str(Licznik konfiguracji)

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

print "Dane Temp: " + str(TempData)

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

ReadLoop = Fałsz

z wyjątkiem DecodeErrorException:

przechodzić

Krok 7: Przetestuj skrypt Pythona

Skrypt musi być uruchomiony w root, więc:

$ sudo python bscan.pyWykryte urządzenie ec:6e:7e:10:b1:92 Urządzenie ec:6e:7e:10:b1:92 (publiczne), RSSI=-80 dB Flagi = 06 Niekompletne usługi 16b = 0a18 Producent = 850002003c25094102024309016f Znaleziono bajt nagłówka 0x0085 Adres urządzenia: ec:6e:7e:10:b1:92 Lokalizacja urządzenia: Garaż Poziom naładowania baterii: 37% Licznik konfiguracji: 9 Dane Accero: 0x2 0x2 Dane temp.: 16,5625

Krok 8: Dodaj skrypt Pythona do Crontab

Skrypt Pythona musi być uruchomiony w root, więc jeśli chcesz automatycznie przechwytywać dane, musisz je dodać do crontab roota. W tym przykładzie uruchamiam skrypt co 20 minut Użyj polecenia:

$ sudo crontab -e

# Edytuj ten plik, aby wprowadzić zadania do uruchomienia przez crona.

# # Każde zadanie do uruchomienia musi być zdefiniowane za pomocą jednej linii # wskazującej różnymi polami, kiedy zadanie zostanie uruchomione # i jakie polecenie ma zostać uruchomione dla zadania # # Aby zdefiniować czas możesz podać konkretne wartości dla # minuty (m), godzina (h), dzień miesiąca (dom), miesiąc (pon), # i dzień tygodnia (dow) lub użyj '*' w tych polach (dla 'any').# # Zauważ, że zadania zostaną uruchomione w oparciu o pojęcie czasu i stref czasowych systemu crona # demona. # # Dane wyjściowe zadań crontab (włącznie z błędami) są wysyłane przez # e-mail do użytkownika, do którego należy plik crontab (chyba że nastąpiło przekierowanie). # # Na przykład, możesz uruchomić kopię zapasową wszystkich kont użytkowników # o 5 rano każdego tygodnia za pomocą: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # Więcej informacji znajdziesz w strony podręcznika 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

Otóż to. Skrypt Pythona będzie uruchamiany w regularnych odstępach czasu i przekoduje dane wyjściowe do bazy danych SQL

Krok 9: Dodatkowo: Skonfiguruj SensorBug dla sygnału wyjściowego wykrywania pozycji

Dodatkowo: Skonfiguruj SensorBug dla wyjścia wykrywania pozycji
Dodatkowo: Skonfiguruj SensorBug dla wyjścia wykrywania pozycji
Dodatkowo: Skonfiguruj SensorBug dla wyjścia wykrywania pozycji
Dodatkowo: Skonfiguruj SensorBug dla wyjścia wykrywania pozycji

Możliwe jest skonfigurowanie SensorBug na Androidzie do wykrywania pozycji W celu wykrywania zmiany pozycji, tzw. Garage door.sensing, SensorBug wykryje, czy urządzenie stoi pionowo, czy leży płasko. Gdy urządzenie jest płaskie, zarejestrowana wartość wynosi 0x20 natomiast jeśli urządzenie stoi pionowo, wartość wynosi 0x02 Nie rozróżnia, czy pozycja X czy Y jest w górze, o ile oś Z nie jest w górę lub w dół. Najprostszym sposobem na to jest użycie aplikacji LightBlue. SensorBug powinien pojawić się w menu skanowania. Wybierz urządzenie, które chcesz skonfigurować, przejdź do charakterystyki GATT dla konfiguracji akcelerometru UUID:9DC84838-7619-4F09-A1CE-DDCF63225B11

Zobacz obrazek: Napisz nowy ciąg konfiguracyjny:

010d3f020200000002d00000002Odczytaj ponownie ciąg konfiguracyjny, aby potwierdzić zapis. Umożliwia to akcelerometr do wykrywania położenia.

Zalecana: