Съдържание:

Наблюдавайте и записвайте температурата с Bluetooth LE и RaspberryPi: 9 стъпки (със снимки)
Наблюдавайте и записвайте температурата с Bluetooth LE и RaspberryPi: 9 стъпки (със снимки)

Видео: Наблюдавайте и записвайте температурата с Bluetooth LE и RaspberryPi: 9 стъпки (със снимки)

Видео: Наблюдавайте и записвайте температурата с Bluetooth LE и RaspberryPi: 9 стъпки (със снимки)
Видео: LDmicro 10: Регулятор температуры инкубатора (лестничное программирование ПЛК микроконтроллера с помощью LDmicro) 2024, Юли
Anonim
Наблюдавайте и записвайте температурата с Bluetooth LE и RaspberryPi
Наблюдавайте и записвайте температурата с Bluetooth LE и RaspberryPi
Наблюдавайте и записвайте температурата с Bluetooth LE и RaspberryPi
Наблюдавайте и записвайте температурата с Bluetooth LE и RaspberryPi

Тази инструкция е за това как да се състави система за мониторинг на температурата с много възли с Bluetooth LE сензорна грешка от Blue Radios (BLEHome) и RaspberryPi 3B Благодарение на разработването на стандарта Bluetooth LE, сега има лесно достъпни безжични сензори с ниска мощност на пазара за много ниска цена и може да работи с една монета в продължение на месеци. Един от тези сензори, които взех, е от Blue Radio, наречен Sensor Bugs. На цена от около $ 25 на Amazon, това е Bluetooth LE устройство с температурен сензор, светлинен сензор и акселерометър, вградени в малка единица, която може да комуникира безжично. Това е идеално съвпадение за Raspberry Pi 3B, който има вградена поддръжка за Bluetooth LE радио.

Стъпка 1: Настройка на Raspberry Pi

Първата стъпка е да получите работеща настройка на Raspberry Pi. Следвайте инструкциите от уебсайта на Raspberry Pi, заредете Raspbian на SD карта, поставете я в Raspberry Pi и я стартирайте. Настройвам системата си с версия на Raspbian Stretch Lite (без графичен потребителски интерфейс) ноември 2017 г. Настройвам WiFi, ако е необходимо, предпочитам да коригирам часова зона към текущата часова зона вместо UTC. Можете да направите това чрез командата: $ sudo dpkg-reconfigure tzdata Остатъкът от инструкцията приема, че настройката е извършена през интерфейса на командния ред.

Стъпка 2: Настройване на MySQL на Raspberry Pi

Полезно е да имате локално инсталирана база данни, за да съхранявате всички заснети данни. Инсталирането на MySQL на Raspberry Pi е супер лесно. Също така не е трудно да промените скрипта за външно свързване към SQL сървър, можете да пропуснете тази стъпка, ако искате да използвате SQL сървър в мрежата. Има много инструкции в мрежата, предлагам това: https:// www.stewright.me/2014/06/tutorial-install-…

След като SQL сървърът е инсталиран, можете да използвате MySQL CLI клиент за създаване на потребител, база данни и таблица. За да влезете в MySQL CLI, използвайте командата:

$ sudo mysql -uroot -p Първо създайте локален потребител за вмъкване на заснети данни:> CREATE USER 'datasrc'@'localhost' IDENTIFYED BY 'datasrc000'; След това създайте база данни и таблица:> CREATE DATABASE SensorBug; Настройване на потребителя разрешение:> ПРЕДОСТАВЯТЕ ВСИЧКИ ПРИВИЛЕГИИ НА SensorBug.* НА 'datasrc'@'localhost'; Сега добавете нова таблица към базата данни. За този пример ще добавя таблица със следните колони: DATE, TIME, ADDRESS, LOCATION, TEMPERATURE и ACCEROMETER

  • ДАТА/ВРЕМЕ - Това е датата и часът на записване на данните
  • АДРЕС - Това е MAC на SensorBug, от който е заснето съобщението
  • МЕСТОПОЛОЖЕНИЕ - Четлив за хора низ, който показва къде се намира сензорът
  • ТЕМПЕРАТУРА - Това е записаната температура
  • ACCELE - Това е стойността на изхода на акселерометъра, полезна за запис на позицията на сензора (ако е активиран)

Командата, която прави това, е:> USE SensorBug; > CREATE TABLE data (дата DATE, час TIME, адрес TINYTEXT, местоположение TINYTEXT, температура FLOAT, ускорение INT); Сега базата данни е готова, можем да преминем към настройка на sensorBugs.

Стъпка 3: Настройване на SensorBugs

Грешките на сензора са доста спретнати малки устройства. За съжаление производителят предостави само приложение за IOS за програмирането му. Въпреки това, все още е възможно да работите с него, ако имате само устройство с Android. Първата стъпка, свържете устройството с телефон. Без сдвояване на устройството SensorBug няма да рекламира данни. Опитах се да видя дали мога да направя това директно с RaspberryPi, за съжаление изглежда, че Bluetooth LE драйверът на RaspberryPi все още е експериментален и съдържа грешки, които да го предпазят от сдвояване с Bluetooth LE устройства. Бъдещата версия на драйвера blueZ може да поправи това, но като настоящото писане, няма начин да сдвоите SensorBug с RaspberryPi. За щастие не е необходимо да сдвояваме устройството, за да улавяме рекламираните му данни. Единственото нещо, от което се нуждаем, е телефон за конфигуриране на SensorBug. По подразбиране SensorBug ще започне да рекламира температурни данни на интервал от 1 s, след като бъде сдвоен с устройство. Това е всичко, което е необходимо за улавяне на данни за температурата. Ако планирате да разширите, за да използвате позиционен или светлинен сензор, тогава ще е необходимо устройството за конфигурация. Като начало ще сдвоим устройството и ще го изключим. Това ще бъде достатъчно добро за целите на улавяне на температурата. Започнете, като натиснете двата бутона на SensorBug. Синият/зелен светодиод ще мига, което показва, че е включен. Натиснете един от бутоните, зеленият светодиод трябва да светне, което показва, че захранването е включено. Ако зеленият светодиод не свети, натиснете двата бутона, за да опитате да включите отново устройството. Натиснете и задръжте един от бутоните, докато синият светодиод започне да мига. Това ще постави устройството в режим на двойка. Отидете в менюто за конфигурация на Bluetooth на телефона и потърсете устройството SensorBug. След като се появи, изберете го, за да се сдвоите с устройството. Това е, сега SensorBug се захранва и рекламира температурните данни

Стъпка 4: Инсталиране на Bluetooth LE Python Wrapper

След това трябва да инсталираме библиотеката, за да може python да говори с Bluetooth LE стека. Инструкцията може да бъде намерена тук: https://github.com/IanHarvey/bluepy За Python 2.7 е толкова просто, колкото въвеждането на следните команди:

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

Стъпка 5: Сканирайте и разберете адреса на SensorBug

За да разберете MAC адреса на SensorBug, използвайте тази команда: $ sudo hcitool lescan Трябва да видите изход като:

EC: FE: 7E: 10: B1: 92 (неизвестно) Ако имате много Bluetooth LE устройства наоколо, може да е трудно да разберете с кое говорите. Можете да опитате bluetoothctl, който дава повече подробности:

$ sudo bluetoothctl [bluetooth]# сканиране на [НОВО] Устройство EC: FE: 7E: 10: B1: 92 SensorBug10B192 [CHG] Устройство EC: FE: 7E: 10: B1: 92 Ключ за данни на производителя: 0x0085 [CHG] Устройство EC: FE: 7E: 10: B1: 92 Стойност на производителя: 0x02 [CHG] Устройство EC: FE: 7E: 10: B1: 92 Стойност на производителя: 0x00 [CHG] Устройство EC: FE: 7E: 10: B1: 92 Стойност на производителя: 0x3c [CHG] Устройство EC: FE: 7E: 10: B1: 92 Производител Стойност на данните: 0x25 [CHG] Устройство EC: FE: 7E: 10: B1: 92 Стойност на производителя: 0x09 [CHG] Устройство EC: FE: 7E: 10: B1: 92 Стойност на производителя: 0x41 [CHG] Устройство EC: FE: 7E: 10: B1: 92 Стойност на производителя: 0x02 [CHG] Устройство EC: FE: 7E: 10: B1: 92 Стойност на производителя: 0x02 [CHG] Устройство EC: FE: 7E: 10: B1: 92 Производител Стойност на данните: 0x43 [CHG] Устройство EC: FE: 7E: 10: B1: 92 Стойност на производителя: 0x0b [CHG] Устройство EC: FE: 7E: 10: B1: 92 Производител Данни Стойност: 0x01 [CHG] Устройство EC: FE: 7E: 10: B1: 92 Производител Стойност на данните: 0x6f

Запишете MAC адреса, това ще трябва да бъде въведено в скрипта на python, за да филтрирате нежеланите Bluetooth LE устройства

Стъпка 6: Добавете скрипта на Python

Копие на скрипта на Python е достъпно от:

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

Ето същия файл, погрижете се за отстъпа при копиране:

Също така актуализирайте MAC адреса във файла python, за да съответства на адреса на сензора, получен от резултата от сканирането.

# Тази програма е безплатен софтуер: можете да я разпространявате и/или променяте

# го съгласно условията на Общия публичен лиценз на GNU, публикуван от

# Фондацията за свободен софтуер, или версия 3 на Лиценза, или

# (по ваш избор) всяка по -нова версия.

#

# Тази програма се разпространява с надеждата, че ще бъде полезна, # но БЕЗ ГАРАНЦИЯ; дори без подразбиращата се гаранция на

# ТЪРГОВСКИ СЪОТВЕТСТВЕНОСТ или ГОДНОСТ ЗА ОПРЕДЕЛЕНА ЦЕЛ. Вижте

# Общ публичен лиценз на GNU за повече подробности.

#

# Трябваше да получите копие от Общия публичен лиценз на GNU

# заедно с тази програма. Ако не, вижте.

# bscan.py - Прост Bluetooth LE скенер и извличане на данни

от скенер за импортиране на bluepy.btle, DefaultDelegate

време за импортиране

внос pymysql

внос структура

hostname = 'localhost'

потребителско име = 'datasrc'

парола = 'datasrc000'

database = 'SensorBug'

#Въведете MAC адреса на сензора от Lescan

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

SENSOR_LOCATION = ["Гараж", "Екстериор"]

клас DecodeErrorException (изключение):

def _init _ (себе си, стойност):

self.value = стойност

def _str _ (себе си):

return repr (self.value)

клас ScanDelegate (DefaultDelegate):

def _init _ (себе си):

DefaultDelegate._ init _ (себе си)

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

ако еNewDev:

отпечатайте „Открито устройство“, dev.addr

elif isNewData:

отпечатайте "Получени нови данни от", dev.addr

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

#blesensor таблицата е дата, час, адрес, местоположение, температура, акцент

cur = conn.cursor ()

dostr = 'ВМЕСТВАНЕ НА СТОЙНОСТИ НА ДАННИ (CURRENT_DATE (), СЕГА (), %s, %s, %s, %s);'

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

conn.commit ()

скенер = Скенер (). withDelegate (ScanDelegate ())

myConnection = pymysql.connect (хост = име на хост, потребител = потребителско име, passwd = парола, db = база данни)

ManuDataHex =

ReadLoop = Вярно

опитвам:

while (ReadLoop):

устройства = скенер.сканиране (2.0)

ManuData = ""

за разработчици в устройства:

вход = 0

AcceroData = 0

AcceroType = 0

TempData = 0

за saddr в SENSOR_ADDRESS:

запис += 1

if (dev.addr == saddr):

отпечатайте "Устройство %s (%s), RSSI = %d dB" %(dev.addr, dev.addrType, dev.rssi)

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION [запис-1]

for (тип на рекламата, desc, стойност) в dev.getScanData ():

отпечатайте " %s = %s" %(описание, стойност)

if (desc == "Производител"):

ManuData = стойност

if (ManuData == ""):

отпечатайте "Няма получени данни, прекратете декодирането"

продължи

#отпечатайте ManuData

за i, j в zip (ManuData [:: 2], ManuData [1:: 2]):

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

#Започнете да декодирате необработените данни на производителя

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

отпечатайте "намерен байт на заглавката 0x0085"

иначе:

отпечатайте "Байт на заглавката 0x0085 не е намерен, декодирането е спряно"

продължи

#Skip Major/Minor

#Индекс 5 е 0x3c, посочете нивото на батерията и конфигурацията #

ако (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 "Данни:" + шестнадесетичен (ManuDataHex [idx])

ако (ManuDataHex [idx] == 0x41):

#Данни за акселерометър

idx += 1

AcceleroType = ManuDataHex [idx]

AcceleroData = ManuDataHex [idx+1]

idx += 2

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

#Данни за температурата

idx += 1

TempData = ManuDataHex [idx]

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

TempData = TempData * 0,0625

idx += 2

иначе:

idx += 1

отпечатайте "Адрес на устройството:" + CurrentDevAddr

отпечатайте "Местоположение на устройството:" + CurrentDevLoc

отпечатайте "Ниво на батерията:" + str (BatteryLevel) + "%"

отпечатайте "Config Counter:" + str (ConfigCounter)

отпечатайте "Accelero Data:" + hex (AcceleroType) + "" + hex (AcceleroData)

отпечатайте "Temp Data:" + str (TempData)

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

ReadLoop = False

с изключение на DecodeErrorException:

пропуск

Стъпка 7: Тествайте скрипта на Python

Скриптът трябва да се изпълнява в root, така че:

$ sudo python bscan.py Открито устройство ec: 6e: 7e: 10: b1: 92 Устройство ec: 6e: 7e: 10: b1: 92 (обществено), RSSI = -80 dB Флагове = 06 Непълни 16b услуги = 0a18 Производител = 850002003c25094102024309016f Заглавен байт 0x0085 е намерен Адрес на устройството: ec: 6e: 7e: 10: b1: 92 Местоположение на устройството: Гаражно ниво на батерията: 37% Конфигурационен брояч: 9 Accero данни: 0x2 0x2 Температурни данни: 16.5625

Стъпка 8: Добавете скрипта на Python към Crontab

Скриптът на python трябва да се изпълнява в root, така че ако искате да улавяте данните автоматично, той ще трябва да бъде добавен към crontab на root. За този пример изпълнявам скрипта на всеки 20 минути Използвайте командата:

$ sudo crontab -e

# Редактирайте този файл, за да въведете задачи, които да се изпълняват от cron.

# # Всяка задача за изпълнение трябва да бъде дефинирана чрез един ред #, показващ с различни полета кога задачата ще бъде изпълнена # и каква команда да се изпълни за задачата # # За да определите времето, което можете да предоставите конкретни стойности за # минута (m), час (ч), ден от месеца (дом), месец (пн), # и ден от седмицата (надолу) или използвайте „*“в тези полета (за „всякакви“). # # Забележете, че задачите ще бъдат стартирани въз основа на системата на cron # демон на представата за време и часови зони. # # Изходът от заданията за crontab (включително грешки) се изпраща чрез # имейл до потребителя, на който принадлежи файла crontab (освен ако не е пренасочен). # # Например можете да стартирате архивиране на всичките си потребителски акаунти # в 5 сутринта всяка седмица с: # 0 5 * * 1 tar -zcf /var/backups/home.tgz/home/ # # За повече информация вижте ръчни страници на crontab (5) и cron (8) # # mh dom mon dow команда 0 * * * * python /home/pi/bscan.py 20 * * * * python /home/pi/bscan.py 40 * * * * python /home/pi/bscan.py

Това е. Скриптът на python ще се изпълнява на редовни интервали и ще прекодира изхода в SQL базата данни

Стъпка 9: Допълнително: Конфигурирайте SensorBug за изход за позициониране

Допълнително: Конфигурирайте SensorBug за изход за позициониране
Допълнително: Конфигурирайте SensorBug за изход за позициониране
Допълнително: Конфигурирайте SensorBug за изход за позициониране
Допълнително: Конфигурирайте SensorBug за изход за позициониране

Възможно е да се конфигурира SensorBug в Android за измерване на позицията Измерване на промяна на позицията, така наречената гаражна врата. Сензор, SensorBug ще открие дали устройството стои изправено или легнало. Когато устройството е плоско, записаната стойност е 0x20 докато устройството стои изправено, стойността е 0x02 Не се различава дали позицията X или Y е нагоре, докато оста Z не е нагоре или надолу. Най -лесният начин да направите това е да използвате приложението LightBlue. SensorBug трябва да се появи в менюто за сканиране. Изберете устройството, което искате да конфигурирате, отидете на характеристиките на GATT за UUID за конфигурация на акселерометър: 9DC84838-7619-4F09-A1CE-DDCF63225B11

Вижте изображението: Напишете нов конфигурационен низ:

010d3f02020000002d00000002 Прочетете конфигурационния низ, за да потвърдите записа. Това позволява акселерометъра за определяне на позицията.

Препоръчано: