大家好,我是吉田!
我們這次要創作一款讓家中更舒適、讓在家辦公更高效的設備,本文是第二部分。第一部分介紹了製作綱要和所需零件。這次我們將實際連接Bluetooth感測器和Raspberry Pi。使用羅姆SensorMedal,您甚至可以遠端輕鬆地將感測器值共用給Raspberry Pi!
使用100日元商店就能買到的USB迷你燈和迷你風扇等物件
在第一部分中,我將羅姆SensorMedal連接到我的智慧手機上並顯示了結果。在本專案中,Raspberry Pi將作為接收資料的航空母艦使用,所以在第二部分中,我們將通過Raspberry Pi的Bluetooth功能連接SensorMedal。
首先,安裝的Python程式bluepy,以便進行Raspberry Pi的Bluetooth連接。
Code-Example
1 2 3 4 5 6 7 |
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 |
然後,開啟SensorMedal和Raspberry Pi的電源,並將它們放在附近。
通過Bluetooth將SensorMedal連接到Raspberry Pi。有一個可以顯示來自SensorMedal的數值的方便程式,我們直接下載這個程式即可(我使用的是這裡的Github)。
1 2 3 |
pi@raspberrypi:~ $ sudo mkdir Programs pi@raspberrypi:~ $ cd Programs pi@raspberrypi:~ $ sudo git clone http://github.com/bokunimowakaru/SensorMedal2 |
打開已下載的SensorMedal2資料夾,並執行以下示例程式。這個需要在Python 3中使用sudo許可權執行。
1 2 |
pi@raspberrypi:~ $ cd SensorMedal2 pi@raspberrypi:~ $ sudo python3 ble_logger_SensorMedal2.py |
怎麼樣?是不是很簡單?如下圖所示,從Raspberry Pi能夠很輕鬆地看到SensorMedal傳來的測量值。
SensorMedal中共內置6種感測器。每種感測器的含義如下,使用這些感測器可以測量並獲取相應的數值。
我們已經非常輕鬆地獲得了感測器的值,現在,讓我們使用這些值來控制與Raspberry Pi連接的硬體吧。
先來實現第一部分中提到的“要是能自動搞定就好了(要是有這些功能就好了)”列表中的以下兩項。
編號 | 檢測功能 | 檢測後希望具備的功能 |
1 | 檢測房間的溫度 | 根據室溫控制風扇等 |
2 | 檢測工作臺周圍的亮度 | 亮度不夠時自動開燈 |
亮度會因天氣變化和房間情況而發生變化。如果亮度不夠還繼續工作的話,眼睛會很疲勞,所以我們使用SensorMedal的亮度值——Illiminance(lx)。亮度(光照強度)的單位是“勒克斯”。白天房間的亮度約為200〜300(lx)。
測好亮度後,我們用一個USB迷你燈來實現亮度不足時自動開燈的功能。如下圖所示,將迷你燈插入Raspberry Pi的 USB埠。
安裝一個庫來控制USB,讓它可以根據亮度開燈和關燈。如下所示,下載並安裝庫文件。
1 2 3 |
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 |
現在,就可以通過命令打開和關閉插入USB埠的設備啦。這個“hub-ctrl”的使用方法為“hub-ctrl -b [Bus Num] -d [Device Num] -P [Port Num] -p [On:1 / Off:0] ”。使用“lsusb -t”命令獲取設備連接資訊。在這裡,Bus num: 1, Device num: 2, USB埠的Port num為2。
1 2 3 4 5 6 7 8 9 10 11 12 |
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”將關閉電源,置“1”則打開電源。
1 2 |
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 |
下面,我們將創建程式,把來自SensorMedal的數值與USB控制關聯起來。
基本上,可以使用前面下載的 SensorMedal2 程式。
1 |
pi@raspberrypi:~ $ sudo cp ble_logger_SensorMedal2.py ble_illum.py |
我在原程式基礎上,添加了下述第9行和第78〜85行的內容。當亮度低於300lx時,讓燈點亮。當亮度高於該值時,讓燈熄滅。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
#!/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 # 在畫面中顯示 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) |
通過sudo python3 ble_illum.py運行該程式。
我們測試一下,如右側照片所示,用手遮蓋SensorMedal,感測器測得的亮度變暗,USB燈能夠獲取感測器的值並且很聽話地自動開燈!
在這部分中,我們嘗試用BLE連接了羅姆SensorMedal和Raspberry Pi。我想大家已經瞭解到,從遠處獲取各種感測器資料是非常容易的事。
通過6種感測器,不僅可以檢測亮度,還可以獲取溫濕度、氣壓和加速度等資料。測量辦工桌或房間裡的各種資料,可能是件很有趣的事。
在下一部分,我想通過添加人體感測器等器件,讓在家辦公環境更加舒適。
敬請期待!