Мазмуну:

Bluetooth LE жана RaspberryPi менен температураны көзөмөлдөө жана жаздыруу: 9 кадам (сүрөттөр менен)
Bluetooth LE жана RaspberryPi менен температураны көзөмөлдөө жана жаздыруу: 9 кадам (сүрөттөр менен)

Video: Bluetooth LE жана RaspberryPi менен температураны көзөмөлдөө жана жаздыруу: 9 кадам (сүрөттөр менен)

Video: Bluetooth LE жана RaspberryPi менен температураны көзөмөлдөө жана жаздыруу: 9 кадам (сүрөттөр менен)
Video: TC4056 TP4056 USB 18650 Lithium Battery Protection Charger Review 2024, Июль
Anonim
Bluetooth LE жана RaspberryPi менен температураны көзөмөлдөп жана жаздырыңыз
Bluetooth LE жана RaspberryPi менен температураны көзөмөлдөп жана жаздырыңыз
Bluetooth LE жана RaspberryPi менен температураны көзөмөлдөп жана жаздырыңыз
Bluetooth LE жана RaspberryPi менен температураны көзөмөлдөп жана жаздырыңыз

Бул көрсөтмө Blue Lios (BLEHome) жана RaspberryPi 3B Bluetooth LE сенсорунун катасы менен көп түйүндүү температураны көзөмөлдөө тутумун кантип чогултуу керектиги жөнүндө. абдан арзан баада жана бир тыйын уячасында бир нече ай бою иштей алат. Мен алган бул сенсорлордун бири Blue Radioдон Sensors Bugs деп аталат. Болжол менен $ 25 Amazon, бул температура сенсоруна, жарык сенсоруна жана аксерометрге ээ Bluetooth LE түзмөгү, баары зымсыз байланышта боло турган кичинекей бирдикке бириктирилген..

1 -кадам: Raspberry Pi орнотуу

Биринчи кадам - бул Raspberry Pi орнотуусун алуу. Raspberry Pi веб -сайтынын нускамасын аткарыңыз, Raspbianди SD картага жүктөңүз, Raspberry Piге киргизиңиз жана жүктөңүз. Мен системамды Raspbian Stretch Lite (No GUI) версиясы менен 2017 -жылдын ноябрь айында орнотуп жатам. Керек болсо WiFi орнотуу, убакыт алкагы UTC ордуна учурдагы убакыт алкагына. Сиз муну төмөнкү буйрук менен жасай аласыз: $ sudo dpkg-reconfigure tzdataRest инструкциясы буйрук сабынын интерфейси аркылуу жасалган деп болжолдонот.

2 -кадам: Raspberry Piде MySQLти орнотуу

Бардык алынган маалыматтарды сактоо үчүн жергиликтүү базаны орнотуу пайдалуу. Raspberry Piде MySQLти орнотуу абдан оңой. SQL серверине сырттан туташуу үчүн скриптти өзгөртүү кыйын эмес, эгер сиз тармакта SQL серверин колдонууну кааласаңыз, бул кадамды өткөрүп жибере аласыз. Тордо көптөгөн көрсөтмөлөр бар, мен муну сунуштайм: https:// www.stewright.me/2014/06/tutorial-install-…

SQL Server орнотулгандан кийин, колдонуучуну, маалымат базасын жана таблицаны түзүү үчүн MySQL CLI кардарын колдонсоңуз болот. MySQL CLIге кирүү үчүн, буйрукту колдонуңуз:

$ sudo mysql -uroot -pFirst, алынган маалыматты киргизүү үчүн жергиликтүү колдонуучуну түзүңүз:> CREATE USER 'datasrc'@'localhost' IDENTIFYED BY 'datarc000'; Андан кийин, маалымат базасын жана таблицаны түзүңүз:> CATATE DATABASE SensorBug; Колдонуучуну орнотуу уруксат:> SensorBug'тагы БАРДЫК СЫЙЛЫКТАРДЫ БЕРҮҮ.* TO 'datasrc'@'localhost' үчүн; Эми маалымат базасына жаңы таблица кошуңуз. Бул мисал үчүн, мен төмөнкү тилкелери бар таблицаны кошуп жатам: DATE, TIME, ADDRESS, LOCATION, TEMPERATURE жана ACCEROMETER

  • DATE/TIME - Бул маалыматтар жазылган күн жана убакыт
  • АДРЕС - Бул SensorBugтун MAC билдирүүсү тартып алынат
  • ЖАЙГАШУУ - сенсордун кайда экенин көрсөтүү үчүн окула турган сап
  • ТЕМПЕРАТУРА - Бул жазылган температура
  • ACCELE - Бул акселерометрдин көрсөткүчү, сенсордун абалын жазуу үчүн пайдалуу (эгер иштетилген болсо)

Муну аткарган буйрук:> SensorBug КОЛДОНУУ; > TABLE маалыматтарын түзүү (DATE DATE, TIME TIME, TINYTEXT дареги, TINYTEXT жайгашкан жери, FLOAT температурасы, accele INT); Азыр маалымат базасы даяр, sensorBugs орнотууга өтсөк болот.

3 -кадам: SensorBugs орнотуу

Сенсор мүчүлүштүктөрү тыкан кичинекей аппараттар. Тилекке каршы, өндүрүүчү аны программалоо үчүн IOS колдонмосун гана берген. Эч качан кем эмес, эгерде сизде Android түзмөгү болсо, аны менен иштөө дагы деле мүмкүн. Алгачкы кадам, аппаратты телефон менен жупташтырыңыз. Мен муну RaspberryPi менен түз жасай аламбы деп көрүүгө аракет кылдым, тилекке каршы, RaspberryPiдеги Bluetooth LE драйвери дагы эле эксперименталдуу жана Bluetooth LE түзмөктөрү менен жупташууга жол бербөө үчүн мүчүлүштүктөр бар окшойт. BlueZ драйверинин келечектеги версиясы муну оңдой алат, бирок азыркы жазууда SensorBug менен RaspberryPi жупташууга эч кандай мүмкүнчүлүк жок. Бизге керек болгон нерсе - SensorBugти конфигурациялоо үчүн телефон. Демейки боюнча, SensorBug түзмөк менен жупташкандан кийин температура маалыматын 1с аралыкта жарнамалай баштайт. Температура маалыматын алуу үчүн, бул керек. Эгер сиз позицияны же жарык сенсорун колдонуу үчүн кеңейтүүнү пландап жатсаңыз, конфигурацияга караганда түзмөк керек болот. Баштоо үчүн, биз түзмөктү жупташтырып, ажыратабыз. Бул температураны кармоо үчүн жакшы болот. SensorBugтын эки баскычын басуу менен баштаңыз. Көк/жашыл LED күйүп -жанат, бул анын күйгүзүлгөнүн билдирет. Баскычтын бирин басыңыз, жашыл LED күйүп турушу керек, электр күйгүзүлгөнүн көрсөтөт. Эгерде жашыл LED жанбаса, эки баскычты тең басып, түзмөктү кайра күйгүзүп көрүңүз. Бул телефондогу Bluetooth конфигурация менюсуна өтүп, SensorBug түзмөгүн издейт. Көрсөтүлгөндөн кийин, аны түзмөк менен жупташуу үчүн тандаңыз. Бул эми SensorBug иштейт жана температура маалыматын жарнамалайт

4 -кадам: Bluetooth LE Python Wrapper орнотуу

Кийинки, биз Bluetooth LE стек менен сүйлөшүү үчүн python үчүн китепкананы орнотушубуз керек. Нускаманы бул жерден тапса болот: https://github.com/IanHarvey/bluepy Python 2.7 үчүн, төмөнкү буйруктарды киргизүү сыяктуу жөнөкөй:

$ sudo apt-get install python-pip libglib2.0-dev $ sudo pip орнотуу планы

5 -кадам: SensorBug дарегин сканерлеп, билип алыңыз

SensorBug MAC дарегин билүү үчүн, бул буйрукту колдонуңуз: $ sudo hcitool lescan Сиз төмөнкүдөй чыгууну көрүшүңүз керек:

EC: FE: 7E: 10: B1: 92 (белгисиз) Эгерде сизде Bluetooth LE түзмөктөрү көп болсо, кайсынысы менен сүйлөшүп жатканыңызды билүү кыйын болушу мүмкүн. Сиз көбүрөөк маалымат берген bluetoothctl аракет кылсаңыз болот:

$ sudo bluetoothctl [bluetooth]# сканерлөө [ЖАҢЫ] Түзмөк EC: FE: 7E: 10: B1: 92 SensorBug10B192 [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Key: 0x0085 [CHG] EC EC Device: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x02 [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x00 [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x3c [CHG] Аспап 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 Value: 0x43 [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Value: 0x0b [CHG] Device EC: FE: 7E: 10: B1: 92 ManufacturerData Мааниси: 0x01 [CHG] Түзмөк EC: FE: 7E: 10: B1: 92 Өндүрүүчү Дата Мааниси: 0x6f

MAC дарегин жазыңыз, бул керексиз Bluetooth LE түзмөктөрүн чыпкалоо үчүн python скриптине киргизилиши керек.

6 -кадам: Python скриптин кошуу

Python скриптинин көчүрмөсү жеткиликтүү:

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

Мына ошол эле файл, көчүрүү учурунда чегинүүгө көңүл буруңуз:

Ошондой эле, сканерлөөнүн натыйжасында алынган сенсор дарегине дал келүү үчүн python файлындагы MAC дарегин жаңыртыңыз.

# Бул программа бекер программа: аны кайра бөлүштүрүп жана/же өзгөртө аласыз

# тарабынан жарыяланган GNU General Public License шарттарына ылайык

# Free Software Foundation, же Лицензиянын 3 -версиясы, же

# (сиздин тандооңуз боюнча) кийинки версиясы.

#

# Бул программа пайдалуу болот деген үмүт менен таратылган, # бирок ЭЧ КАПЫЛДЫКСЫЗ; эч кандай кепилдик жок

# САТЫЛУУЛУК ЖАНА АТАЙЫН МАКСАТКА ЫРАЙЫК. Караңыз

Көбүрөөк маалымат алуу үчүн # GNU General Public License.

#

# Сиз GNU General Public Licenseтин көчүрмөсүн алышыңыз керек болчу

# бул программа менен бирге. Болбосо, караңыз.

# bscan.py - Жөнөкөй bluetooth LE сканери жана маалымат чыгаргыч

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

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

pymysql импорттоо

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

хосттун аты = 'localhost'

колдонуучунун аты = 'datasrc'

сырсөз = 'datarc000'

маалымат базасы = 'SensorBug'

#Лескандан сенсордун MAC дарегин киргизиңиз

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

SENSOR_LOCATION = ["Гараж", "Сырткы"]

класс DecodeErrorException (Exception):

def _init _ (өзүн, мааниси):

self.value = value

def _str _ (өзүн):

кайтуу repr (өзүн -өзү баалоо)

класс ScanDelegate (DefaultDelegate):

def _init _ (өзүн):

DefaultDelegate._ init _ (өзүнчө)

def handleDiscovery (өз алдынча, dev, isNewDev, isNewData):

эгер isNewDev:

басып чыгаруу "Табылган түзмөк", dev.addr

elif isNewData:

басып чыгаруу "Жаңы маалыматтар алынды", dev.addr

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

#blesensor стол - бул күн, убакыт, адрес, жайгашкан жери, темп, accero

cur = conn.cursor ()

dostr = 'INSERT INTO data VALUES (CURRENT_DATE (), NOW (), %s, %s, %s, %s);'

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

Conn.commit ()

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

myConnection = pymysql.connect (хост = hostname, user = username, passwd = password, db = database)

ManuDataHex =

ReadLoop = Чын

аракет кыл:

while (ReadLoop):

түзмөктөр = scanner.scan (2.0)

ManuData = ""

түзмөктөрдө иштеп чыгуу үчүн:

кирүү = 0

AcceroData = 0

AcceroType = 0

TempData = 0

SENSOR_ADDRESS ичинде saddr үчүн:

жазуу += 1

эгер (dev.addr == saddr):

басып чыгаруу "Device %s (%s), RSSI = %d dB" %(dev.addr, dev.addrType, dev.rssi)

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION [жазуу-1]

үчүн (adtype, desc, value) dev.getScanData () ичинде:

"%s = %s" %басып чыгаруу (түшүү, маани)

if (desc == "Өндүрүүчү"):

ManuData = мааниси

эгер (ManuData == ""):

басып чыгаруу "Маалымат жок, декоддоону токтотуу"

улантуу

#басма ManuData

i, j in zip үчүн (ManuData [:: 2], ManuData [1:: 2]):

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

#Чийки Өндүрүүчү маалыматын чечмелей баштаңыз

эгер ((ManuDataHex [0] == 0x85) жана (ManuDataHex [1] == 0x00)):

басып чыгаруу "Баш байт 0x0085 табылды"

башка:

басып чыгаруу "Баш байт 0x0085 табылган жок, декодирование токтотуу"

улантуу

#Major/Minor өткөрүп жиберүү

#Index 5 - 0x3c, батареянын деңгээлин жана конфигурациясын көрсөт #

эгер (ManuDataHex [4] == 0x3c):

BatteryLevel = ManuDataHex [5]

ConfigCounter = ManuDataHex [6]

idx = 7

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

while (idx <len (ManuDataHex)):

#басма "Idx:" + str (idx)

#басма "Маалымат:" + он алтылык (ManuDataHex [idx])

эгер (ManuDataHex [idx] == 0x41):

#Аксерометрдин маалыматы

idx += 1

AcceleroType = ManuDataHex [idx]

AcceleroData = ManuDataHex [idx+1]

idx += 2

элиф (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 маалыматы:" + hex (AcceleroType) + "" + hex (AcceleroData)

басып чыгаруу "Temp Data:" + str (TempData)

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

ReadLoop = False

DecodeErrorExceptionден башка:

өтүү

7 -кадам: Python скриптин сынап көрүңүз

Скрипт тамыры менен иштеши керек, андыктан:

$ sudo python bscan.py Табылган түзмөк ec: 6e: 7e: 10: b1: 92 Device ec: 6e: 7e: 10: b1: 92 (public), RSSI = -80 dB Flags = 06 Толук эмес 16b Services = 0a18 Өндүрүүчү = 850002003c25094102024309016f Баш байт 0x0085 табылды Аспаптын дареги: ec: 6e: 7e: 10: b1: 92 Түзмөктүн жайгашкан жери: Гараждын Батареясынын деңгээли: 37% Config Counter: 9 Accero Data: 0x2 0x2 Temp Data: 16.5625

8 -кадам: Python скриптин Crontabга кошуңуз

Питон скрипти тамыры менен иштеши керек, андыктан маалыматты автоматтык түрдө тартып алууну кааласаңыз, аны тамырдын кронтабына кошуу керек болот. Бул мисал үчүн, мен скриптти 20 мүнөт сайын иштетем:

$ sudo crontab -e

# Бул файлды cron менен иштей турган тапшырмаларды киргизүү үчүн түзөтүңүз.

# # Ар бир иштей турган тапшырманы бир сап аркылуу аныктоо керек # тапшырманын качан аткарыларын жана # # тапшырманы аткаруу үчүн кайсы буйрукту аткаруу керек экенин # мүнөтүнө конкреттүү баалуулуктарды бере аласыз), саат (ч), айдын күнү (дом), ай (пн), # жана аптанын күнү (dow) же бул талааларда '*' колдонуңуз ("каалаган" үчүн). # # Тапшырмалар башталаарына көңүл буруңуз 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ны Позицияны Тандоо Чыгуусу үчүн конфигурациялоо

Кошумча: Position Sensing Output үчүн SensorBugти конфигурациялоо
Кошумча: Position Sensing Output үчүн SensorBugти конфигурациялоо
Кошумча: Position Sensing Output үчүн SensorBugти конфигурациялоо
Кошумча: Position Sensing Output үчүн SensorBugти конфигурациялоо

Androidдеги SensorBug'ту позицияны аныктоо үчүн конфигурациялоого болот Гараждык эшик деп аталат. ал эми түз огунда болсо, 0x02 мааниси X же Y позициясы жогору болсо, айырмаланбайт, эгер Z огу өйдө же ылдый болбосо, муну эң оңой жолу LightBlue колдонмосун колдонуу. SensorBug сканерлөө менюсунда көрүнүшү керек. Конфигурациялоону каалаган түзмөгүңүздү тандаңыз, UUID Accelerometer конфигурациясы үчүн GATT мүнөздөмөлөрүнө өтүңүз: 9DC84838-7619-4F09-A1CE-DDCF63225B11

Сүрөттү караңыз: Жаңы конфигурация сабын жазыңыз:

010d3f02020000002d00000002Жазууну ырастоо үчүн конфигурация сабын кайра окуңуз. Бул позицияны аныктоо үчүн акселерометрди иштетет.

Сунушталууда: