用Raspberry Pi和传感器制作“可自动营造舒适空间的装置” 第二部分

大家好,我是吉田!
我们这次要创作一款让家中更舒适、让在家办公更高效的设备,本文是第二部分。第一部分介绍了制作纲要和所需部件。这次我们将实际连接bluetooth传感器和raspberry pi。使用罗姆sensormedal,您甚至可以远程轻松地将传感器值共享给raspberry pi!
本部分所需部件
raspberry pi 3 b+ 或 raspberry pi 4 model b
raspberry pi 3 b+
raspberry pi 4 model b
罗姆sensormedal(sensormedal-evk-002)
手机电池
usb设备
使用100日元商店就能买到的usb迷你灯和迷你风扇等物件
本部分的流程
罗姆sensormedal与raspberry pi的ble连接
raspberry pi的usb控制
使用传感器值让硬件工作的程序
总结
1. 罗姆sensormedal与raspberry pi的ble连接
在第一部分中,我将罗姆sensormedal连接到我的智能手机上并显示了结果。在本项目中,raspberry pi将作为接收数据的航空母舰使用,所以在第二部分中,我们将通过raspberry pi的bluetooth功能连接sensormedal。
首先,安装的python程序bluepy,以便进行raspberry pi的bluetooth连接。
pi@raspberrypi:~ $ sudo pip3 install bluepylooking in indexes: https://pypi.org/simple, https://www.piwheels.org/simplecollecting 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: bluepysuccessfully installed bluepy-1.3.0  
然后,开启sensormedal和raspberry pi的电源,并将它们放在附近。
通过bluetooth将sensormedal连接到raspberry pi。有一个可以显示来自sensormedal的数值的方便程序,我们直接下载这个程序即可(我使用的是这里的github)。
pi@raspberrypi:~ $ sudo mkdir programspi@raspberrypi:~ $ cd programspi@raspberrypi:~ $ sudo git clone http://github.com/bokunimowakaru/sensormedal2  
打开已下载的sensormedal2文件夹,并执行以下示例程序。这个需要在python 3中使用sudo权限执行。
pi@raspberrypi:~ $ cd sensormedal2pi@raspberrypi:~ $ sudo python3 ble_logger_sensormedal2.py  
怎么样?是不是很简单?如下图所示,从raspberry pi能够很轻松地看到sensormedal传来的测量值。
sensormedal中共内置6种传感器。每种传感器的含义如下,使用这些传感器可以测量并获取相应的数值。
temperature: 温度(℃)
humidity: 湿度(%)
pressure: 气压(hpa)
illuminance: 亮度(lx)
accelerometer: 加速度(x轴、y轴、z轴)(g)
geomagnetic: 陀螺仪传感器值(x轴、y轴、z轴)(ut)
magnetic: 霍尔传感器值(磁铁在附近通过为1,否则为0)
steps: 步数(步)
battery level: 电池电量
2. raspberry pi的usb 控制
我们已经非常轻松地获得了传感器的值,现在,让我们使用这些值来控制与raspberry pi连接的硬件吧。
先来实现第一部分中提到的“要是能自动搞定就好了(要是有这些功能就好了)”列表中的以下两项。
编号 检测功能 检测后希望具备的功能
1 检测房间的温度 根据室温控制风扇等
2 检测工作台周围的亮度 亮度不够时自动开灯
亮度会因天气变化和房间情况而发生变化。如果亮度不够还继续工作的话,眼睛会很疲劳,所以我们使用sensormedal的亮度值——illiminance(lx)。亮度(光照强度)的单位是“勒克斯”。白天房间的亮度约为200〜300(lx)。
测好亮度后,我们用一个usb迷你灯来实现亮度不足时自动开灯的功能。如下图所示,将迷你灯插入raspberry pi的 usb端口。
安装一个库来控制usb,让它可以根据亮度开灯和关灯。如下所示,下载并安装库文件。
pi@raspberrypi:~ $ wget https://www.gniibe.org/oitoite/ac-power-control-by-usb-hub/hub-ctrl.cpi@raspberrypi:~ $ sudo apt-get install libusb-devpi@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。
pi@raspberrypi:~ $ hub-ctrlhub #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”则打开电源。
pi@raspberrypi:~ $ sudo hub-ctrl -b 1 -d 2 -p 2 -p 0pi@raspberrypi:~ $ sudo hub-ctrl -b 1 -d 2 -p 2 -p 1
这是指定“-p 1”时的状态。连接到usb端口的灯亮了
3.使用传感器值让硬件工作的程序
下面,我们将创建程序,把来自sensormedal的数值与usb控制关联起来。
基本上,可以使用前面下载的 sensormedal2 程序。
pi@raspberrypi:~ $ sudo cp ble_logger_sensormedal2.py ble_illum.py  
我在原程序基础上,添加了下述第9行和第78〜85行的内容。当亮度低于300lx时,让灯点亮。当亮度高于该值时,让灯熄灭。
#!/usr/bin/env python3# coding: utf-8from __future__ import (division, absolute_import, print_function, unicode_literals)import fcntlimport socketimport structimport osdef 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 btlefrom sys import argvimport getpassfrom time import sleepdef 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 ascanner = 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灯能够获取传感器的值并且很听话地自动开灯!
4. 总结
在这部分中,我们尝试用ble连接了罗姆sensormedal和raspberry pi。我想大家已经了解到,从远处获取各种传感器数据是非常容易的事。
通过6种传感器,不仅可以检测亮度,还可以获取温湿度、气压和加速度等数据。测量办工桌或房间里的各种数据,可能是件很有趣的事。
在下一部分,我想通过添加人体传感器等器件,让在家办公环境更加舒适。
敬请期待!


宏光MINI EV 9月销量达20150辆,成为新能源汽车领域增长最快车型
E现场:迟到魅族发布会—魅族16s
将RS485温湿度传感器输出信号转化为网络信号的方案
绞杀曲面屏:魅族pro7配智能前后双屏,人机交互巅峰之作
智昌集团携手南方有色集团建设智能工厂
用Raspberry Pi和传感器制作“可自动营造舒适空间的装置” 第二部分
变频器外接主电路原理图
在简化系统设计的同时实现超低功耗运行
可穿戴设备发展历程!医疗可穿戴设备和传感器生态系统正在快速成长!
多伦多的“智能城市”项目Quayside似乎已被正式取消
本田智能驾驶概念车将于2020北美CES展出 官方称是“从自动驾驶到半自动驾驶的无缝过渡”
MOS管的基本知识:构造、原理、电路设计
新华三跻身“制造业单项冠军示范企业”名单
小米MIX2概念渲染图被曝光:后置双摄像头 屏占比独树一帜
如何输入3D网格物体(原始三角形和顶点),得到分类概率的输出
京东方2023年前三季度实现营业收入1265.15亿元
前端工程师转型架构师的经历
移动端VIN码识别技术为车辆估值平台带来了便利
芯闻3分钟:三星内部源代码泄露,中国政府加快破解“缺芯少魂”
LEM国产替代|年营收超1700亿元,芯森传感器助力中国机器人行业走向更多场景