Оглавление:

Мониторинг и запись температуры с помощью Bluetooth LE и RaspberryPi: 9 шагов (с изображениями)
Мониторинг и запись температуры с помощью Bluetooth LE и RaspberryPi: 9 шагов (с изображениями)

Видео: Мониторинг и запись температуры с помощью Bluetooth LE и RaspberryPi: 9 шагов (с изображениями)

Видео: Мониторинг и запись температуры с помощью Bluetooth LE и RaspberryPi: 9 шагов (с изображениями)
Видео: Мини ПК на Intel N100 - AC8-N, мощная безвентиляторная платформа, установка Home Assistant OS 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. Это устройство Bluetooth LE стоимостью около 25 долларов США с датчиком температуры, датчиком освещенности и акселерометром встроено в небольшой блок, который может обмениваться данными по беспроводной сети. Он идеально подходит для 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 tzdataRest инструкции, предполагающей, что установка выполняется через интерфейс командной строки.

Шаг 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. * TO 'datasrc' @ 'localhost'; Теперь добавьте новую таблицу в базу данных. В этом примере я собираюсь добавить таблицу со следующими столбцами: ДАТА, ВРЕМЯ, АДРЕС, МЕСТОПОЛОЖЕНИЕ, ТЕМПЕРАТУРА и АКСЕРОМЕТР.

  • ДАТА / ВРЕМЯ - это дата и время записи данных.
  • АДРЕС - это 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 секунду после сопряжения с устройством. Это все, что нужно для сбора данных о температуре. Если вы планируете расширить, чтобы использовать датчик положения или света, то потребуется настройка устройства. Для начала подключим устройство и отключим. Этого будет достаточно для измерения температуры. Начните с нажатия обеих кнопок на 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] # сканирование на [NEW] EC устройства: FE: 7E: 10: B1: 92 SensorBug10B192 [CHG] EC устройства: FE: 7E: 10: B1: 92 Ключ данных производителя: 0x0085 [CHG] EC устройства: FE: 7E: 10: B1: 92 Значение ManufacturerData: 0x02 [CHG] EC устройства: FE: 7E: 10: B1: 92 Значение ManufacturerData: 0x00 [CHG] Device EC: FE: 7E: 10: B1: 92 Значение ManufacturerData: 0x3c [CHG] EC устройства: FE: 7E: 10: B1: 92 Значение ManufacturerData: 0x25 [CHG] Device EC: FE: 7E: 10: B1: 92 Значение ManufacturerData: 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 Значение производителя: 0x43 [CHG] EC устройства: FE: 7E: 10: B1: 92 Значение ManufacturerData: 0x0b [CHG] EC устройства: FE: 7E: 10: B1: 92 ManufacturerData Значение: 0x01 [CHG] EC устройства: FE: 7E: 10: B1: 92 Значение ManufacturerData: 0x6f

Запишите MAC-адрес, его нужно будет ввести в скрипт Python, чтобы отфильтровать нежелательные устройства Bluetooth LE.

Шаг 6. Добавьте скрипт Python

Копию скрипта Python можно получить по адресу:

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

Вот тот же файл, позаботьтесь об отступе при копировании:

Кроме того, обновите MAC-адрес в файле python, чтобы он соответствовал адресу датчика, полученному в результате сканирования.

# Это бесплатное программное обеспечение: вы можете распространять и / или изменять

# это в соответствии с условиями Стандартной общественной лицензии GNU, опубликованной

# Free Software Foundation, либо версия 3 Лицензии, либо

# (по вашему выбору) любая более поздняя версия.

#

# Эта программа распространяется в надежде, что она будет полезной, # но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; без даже подразумеваемой гарантии

# КОММЕРЧЕСКАЯ ЦЕННОСТЬ или ПРИГОДНОСТЬ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. Увидеть

# Стандартная общественная лицензия GNU для более подробной информации.

#

# Вы должны были получить копию Стандартной общественной лицензии GNU

# вместе с этой программой. Если нет, посмотри.

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

из bluepy.btle import Scanner, DefaultDelegate

время импорта

импортировать pymysql

структура импорта

hostname = 'локальный'

имя пользователя = 'datasrc'

пароль = 'datasrc000'

база данных = 'SensorBug'

# Введите MAC-адрес датчика из лескана

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

SENSOR_LOCATION = ["Гараж", "Экстерьер"]

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

def _init _ (self, value):

self.value = значение

def _str _ (сам):

вернуть repr (self.value)

класс ScanDelegate (DefaultDelegate):

def _init _ (сам):

DefaultDelegate._ init _ (сам)

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

если isNewDev:

print "Обнаруженное устройство", dev.addr

elif isNewData:

print "Получены новые данные от", dev.addr

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

Таблица #blesensor - это дата, время, адрес, местоположение, темп, скорость

cur = conn.cursor ()

dostr = 'ВСТАВИТЬ В ЗНАЧЕНИЯ данных (CURRENT_DATE (), NOW (),% s,% s,% s,% s);'

cur.execute (dostr, (адрес, loc, temp, Accero))

conn.commit ()

scanner = Сканер (). withDelegate (ScanDelegate ())

myConnection = pymysql.connect (host = hostname, user = username, passwd = password, db = database)

ManuDataHex =

ReadLoop = True

пытаться:

пока (ReadLoop):

устройства = scanner.scan (2.0)

ManuData = ""

для разработчиков в устройствах:

entry = 0

AcceroData = 0

AcceroType = 0

TempData = 0

для saddr в SENSOR_ADDRESS:

запись + = 1

если (dev.addr == saddr):

print "Устройство% s (% s), RSSI =% d дБ"% (dev.addr, dev.addrType, dev.rssi)

CurrentDevAddr = saddr

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

для (adtype, desc, value) в dev.getScanData ():

print "% s =% s"% (desc, value)

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

ManuData = значение

если (ManuData == ""):

print "Данные не получены, декодирование завершено"

Продолжить

#print ManuData

для i, j в zip-архиве (ManuData [:: 2], ManuData [1:: 2]):

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

# Начать декодирование необработанных данных производителя

если ((ManuDataHex [0] == 0x85) и (ManuDataHex [1] == 0x00)):

print "Обнаружен байт заголовка 0x0085"

еще:

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

Продолжить

# Пропустить Major / Minor

# Индекс 5 - 0x3c, укажите уровень заряда батареи и конфигурацию #

если (ManuDataHex [4] == 0x3c):

BatteryLevel = ManuDataHex [5]

ConfigCounter = ManuDataHex [6]

idx = 7

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

в то время как (idx <len (ManuDataHex)):

#print "Idx:" + str (idx)

#print "Data:" + шестнадцатеричный (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

print "Адрес устройства:" + CurrentDevAddr

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

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

напечатать "Config Counter:" + str (ConfigCounter)

напечатайте "Данные Accelero:" + шестнадцатеричный (AcceleroType) + "" + шестнадцатеричный (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 дБ Флаги = 06 Неполные услуги 16b = 0a18 Производитель = 850002003c25094102024309016f Обнаружен байт заголовка 0x0085 Адрес устройства: ec: 6e: 7e: 10: b1: 92 Расположение устройства: Гараж Уровень заряда батареи: 37% Счетчик конфигурации: 9 Данные Accero: 0x2 0x2 Временные данные: 16,5625

Шаг 8: добавьте скрипт Python в Crontab

Сценарий python должен запускаться в корневом каталоге, поэтому, если вы хотите автоматически записывать данные, их нужно будет добавить в crontab корневого каталога. В этом примере я запускаю сценарий каждые 20 минут. Используйте команду:

$ sudo crontab -e

# Отредактируйте этот файл, чтобы ввести задачи, которые должен выполнять cron.

# # Каждая задача для запуска должна быть определена в одной строке # с указанием разных полей, когда задача будет запущена # и какую команду запускать для задачи # # Чтобы определить время, вы можете указать конкретные значения для # минут (m), час (h), день месяца (dom), месяц (mon), # и день недели (dow) или используйте '*' в этих полях (для 'any'). # # Обратите внимание, что задачи будут запущены основан на представлении демона system # времени и часовых поясов в cron. # # Вывод заданий crontab (включая ошибки) отправляется # по электронной почте пользователю, которому принадлежит файл crontab (если не перенаправлен). # # Например, вы можете запускать резервную копию всех своих учетных записей пользователей # в 5 утра каждую неделю с помощью: # 0 5 * * 1 tar -zcf /var/backups/home.tgz / home / # # Для получения дополнительной информации см. страницы руководства crontab (5) и cron (8) # # mh dom mon dow command 0 * * * * python /home/pi/bscan.py 20 * * * * python /home/pi/bscan.py 40 * * * * питон /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 Прочтите строку конфигурации, чтобы подтвердить запись. Это позволяет акселерометру определять положение.

Рекомендуемые: