大家好,我是吉田!
我們這次要?jiǎng)?chuàng)作一款讓家中更舒適、讓在家辦公更高效的設(shè)備,本文是第二部分。第一部分介紹了制作綱要和所需部件。這次我們將實(shí)際連接Bluetooth傳感器和Raspberry Pi。使用羅姆SensorMedal,您甚至可以遠(yuǎn)程輕松地將傳感器值共享給Raspberry Pi!
本部分所需部件
Raspberry Pi 3 B+ 或 Raspberry Pi 4 Model B
Raspberry Pi 3 B+
Raspberry Pi 4 Model B
羅姆SensorMedal(SensorMedal-EVK-002)
手機(jī)電池
USB設(shè)備
使用100日元商店就能買(mǎi)到的USB迷你燈和迷你風(fēng)扇等物件
本部分的流程
羅姆SensorMedal與Raspberry Pi的BLE連接
Raspberry Pi的USB控制
使用傳感器值讓硬件工作的程序
總結(jié)
1. 羅姆SensorMedal與Raspberry Pi的BLE連接
在第一部分中,我將羅姆SensorMedal連接到我的智能手機(jī)上并顯示了結(jié)果。在本項(xiàng)目中,Raspberry Pi將作為接收數(shù)據(jù)的航空母艦使用,所以在第二部分中,我們將通過(guò)Raspberry Pi的Bluetooth功能連接SensorMedal。
首先,安裝的Python程序bluepy,以便進(jìn)行Raspberry Pi的Bluetooth連接。
pi@raspberrypi:~ $ sudo pip3 install bluepy Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple Collecting bluepy Downloading https://www.piwheels.org/simple/bluepy/bluepy-1.3.0-cp37-cp37m-linux_armv7l.whl (560kB) 100% |████████████████████████████████| 563kB 608kB/s Installing collected packages: bluepy Successfully installed bluepy-1.3.0
然后,開(kāi)啟SensorMedal和Raspberry Pi的電源,并將它們放在附近。
通過(guò)Bluetooth將SensorMedal連接到Raspberry Pi。有一個(gè)可以顯示來(lái)自SensorMedal的數(shù)值的方便程序,我們直接下載這個(gè)程序即可(我使用的是這里的Github)。
pi@raspberrypi:~ $ sudo mkdir Programs pi@raspberrypi:~ $ cd Programs pi@raspberrypi:~ $ sudo git clone http://github.com/bokunimowakaru/SensorMedal2
打開(kāi)已下載的SensorMedal2文件夾,并執(zhí)行以下示例程序。這個(gè)需要在Python 3中使用sudo權(quán)限執(zhí)行。
pi@raspberrypi:~ $ cd SensorMedal2 pi@raspberrypi:~ $ sudo python3 ble_logger_SensorMedal2.py
怎么樣?是不是很簡(jiǎn)單?如下圖所示,從Raspberry Pi能夠很輕松地看到SensorMedal傳來(lái)的測(cè)量值。
SensorMedal中共內(nèi)置6種傳感器。每種傳感器的含義如下,使用這些傳感器可以測(cè)量并獲取相應(yīng)的數(shù)值。
Temperature: 溫度(℃)
Humidity: 濕度(%)
Pressure: 氣壓(hPa)
Illuminance: 亮度(lx)
Accelerometer: 加速度(x軸、y軸、z軸)(g)
Geomagnetic: 陀螺儀傳感器值(x軸、y軸、z軸)(uT)
Magnetic: 霍爾傳感器值(磁鐵在附近通過(guò)為1,否則為0)
Steps: 步數(shù)(步)
Battery Level: 電池電量
2. Raspberry Pi的USB 控制
我們已經(jīng)非常輕松地獲得了傳感器的值,現(xiàn)在,讓我們使用這些值來(lái)控制與Raspberry Pi連接的硬件吧。
先來(lái)實(shí)現(xiàn)第一部分中提到的“要是能自動(dòng)搞定就好了(要是有這些功能就好了)”列表中的以下兩項(xiàng)。
編號(hào) | 檢測(cè)功能 | 檢測(cè)后希望具備的功能 |
1 | 檢測(cè)房間的溫度 | 根據(jù)室溫控制風(fēng)扇等 |
2 | 檢測(cè)工作臺(tái)周?chē)牧炼?/td> | 亮度不夠時(shí)自動(dòng)開(kāi)燈 |
亮度會(huì)因天氣變化和房間情況而發(fā)生變化。如果亮度不夠還繼續(xù)工作的話,眼睛會(huì)很疲勞,所以我們使用SensorMedal的亮度值——Illiminance(lx)。亮度(光照強(qiáng)度)的單位是“勒克斯”。白天房間的亮度約為200?300(lx)。
測(cè)好亮度后,我們用一個(gè)USB迷你燈來(lái)實(shí)現(xiàn)亮度不足時(shí)自動(dòng)開(kāi)燈的功能。如下圖所示,將迷你燈插入Raspberry Pi的 USB端口。
安裝一個(gè)庫(kù)來(lái)控制USB,讓它可以根據(jù)亮度開(kāi)燈和關(guān)燈。如下所示,下載并安裝庫(kù)文件。
pi@raspberrypi:~ $ wget https://www.gniibe.org/oitoite/ac-power-control-by-USB-hub/hub-ctrl.c pi@raspberrypi:~ $ sudo apt-get install libusb-dev pi@raspberrypi:~ $ gcc -o hub-ctrl hub-ctrl.c -lusb
現(xiàn)在,就可以通過(guò)命令打開(kāi)和關(guān)閉插入U(xiǎn)SB端口的設(shè)備啦。這個(gè)“hub-ctrl”的使用方法為“hub-ctrl -b [Bus Num] -d [Device Num] -P [Port Num] -p [On:1 / Off:0] ”。使用“l(fā)susb -t”命令獲取設(shè)備連接信息。在這里,Bus num: 1, Device num: 2, USB端口的Port num為2。
pi@raspberrypi:~ $ hub-ctrl Hub #0 at 001:002 INFO: individual power switching. WARN: Port indicators are NOT supported. Hub #1 at 001:001 INFO: ganged switching. WARN: Port indicators are NOT supported. pi@raspberrypi:~ $ lsusb -t /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/5p, 480M |__ Port 1: Dev 3, If 0, Class=Vendor Specific Class, Driver=smsc95xx, 480M
如下所示,在“-p”后置“0”將關(guān)閉電源,置“1”則打開(kāi)電源。
pi@raspberrypi:~ $ sudo hub-ctrl -b 1 -d 2 -P 2 -p 0 pi@raspberrypi:~ $ sudo hub-ctrl -b 1 -d 2 -P 2 -p 1
這是指定“-p 1”時(shí)的狀態(tài)。連接到USB端口的燈亮了
3.使用傳感器值讓硬件工作的程序
下面,我們將創(chuàng)建程序,把來(lái)自SensorMedal的數(shù)值與USB控制關(guān)聯(lián)起來(lái)。
基本上,可以使用前面下載的 SensorMedal2 程序。
pi@raspberrypi:~ $ sudo cp ble_logger_SensorMedal2.py ble_illum.py
我在原程序基礎(chǔ)上,添加了下述第9行和第78?85行的內(nèi)容。當(dāng)亮度低于300lx時(shí),讓燈點(diǎn)亮。當(dāng)亮度高于該值時(shí),讓燈熄滅。
#!/usr/bin/env python3 # coding: utf-8 from __future__ import (division, absolute_import, print_function, unicode_literals) import fcntl import socket import struct import os def get_addr(ifname): try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) return socket.inet_ntoa( fcntl.ioctl( s.fileno(), 0x8915, # SIOCGIFADDR struct.pack('256s', ifname[:15].encode('utf-8')))[20:24]) except IOError: return 'Not Found!' interval = 10 # 工作間隔 from bluepy import btle from sys import argv import getpass from time import sleep def payval(num, bytes=1, sign=False): global val a = 0 for i in range(0, bytes): a += (256 ** i) * int(val[(num - 2 + i) * 2 : (num - 1 + i) * 2],16) if sign: if a >= 2 ** (bytes * 8 - 1): a -= 2 ** (bytes * 8) return a scanner = btle.Scanner() while True: try: devices = scanner.scan(interval) except Exception as e: print("ERROR",e) if getpass.getuser() != 'root': print('使用方法: sudo', argv[0]) exit() sleep(interval) continue for dev in devices: print("nDevice %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType, dev.rssi)) isRohmMedal = False sensors = dict() for (adtype, desc, val) in dev.getScanData(): print(" %s = %s" % (desc, val)) if desc == 'Short Local Name' and val[0:10] == 'ROHMMedal2': isRohmMedal = True if isRohmMedal and desc == 'Manufacturer': # 將傳感器值代入字典變量sensors sensors['ID'] = hex(payval(2,2)) sensors['Illuminance'] = payval(25,2) / 1.2 sensors['Battery Level'] = payval(30) sensors['RSSI'] = dev.rssi # 在畫(huà)面中顯示 print(' ID =',sensors['ID']) print(' Illuminance =',round(sensors['Illuminance'],1),'lx') print(' Battery Level =',sensors['Battery Level'],'%') print(' RSSI =',sensors['RSSI'],'dB') ''' for key, value in sorted(sensors.items(), key=lambda x:x[0]): print(' ',key,'=',value) ''' illum = sensors['Illuminance'] if illum < 300: illum_msg = "Dark!" os.system(“sudo hub-ctrl -b 1 -d 2 -P 2 -p 1”) else: illum_msg = "Bright" os.system(“sudo hub-ctrl -b 1 -d 2 -P 2 -p 0”) print(illum_msg) sleep(interval)
通過(guò)sudo python3 ble_illum.py運(yùn)行該程序。
我們測(cè)試一下,如右側(cè)照片所示,用手遮蓋SensorMedal,傳感器測(cè)得的亮度變暗,USB燈能夠獲取傳感器的值并且很聽(tīng)話地自動(dòng)開(kāi)燈!
4. 總結(jié)
在這部分中,我們嘗試用BLE連接了羅姆SensorMedal和Raspberry Pi。我想大家已經(jīng)了解到,從遠(yuǎn)處獲取各種傳感器數(shù)據(jù)是非常容易的事。
通過(guò)6種傳感器,不僅可以檢測(cè)亮度,還可以獲取溫濕度、氣壓和加速度等數(shù)據(jù)。測(cè)量辦工桌或房間里的各種數(shù)據(jù),可能是件很有趣的事。
在下一部分,我想通過(guò)添加人體傳感器等器件,讓在家辦公環(huán)境更加舒適。
敬請(qǐng)期待!
審核編輯黃宇
-
傳感器
+關(guān)注
關(guān)注
2552文章
51233瀏覽量
754729 -
Raspberry Pi
+關(guān)注
關(guān)注
2文章
559瀏覽量
22298
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論