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

大家好,我是吉田!
我们这次要创作一款让家中更舒适、让在家办公更高效的设备,本文是第三部分。
在第二部分中,我们用ble连接了罗姆sensormedal并测量了各种数据。在第三部分,我希望通过安装人体传感器等器件,实现检查主人是否久坐不动或过度工作的功能!
本部分所需部件
raspberry pi 3 b+ 或 raspberry pi 4 model b
raspberry pi 3 b+
raspberry pi 4 model b
罗姆sensormedal(sensormedal-evk-002)
热释电红外线传感器 (sb412a)
raspberry pi用液晶显示器
本部分的流程
给raspberry pi连接人体传感器
添加液晶显示器
总结
1. 给raspberry pi连接人体传感器
第二部分中,我们通过罗姆sensormedal测量了亮度,并根据亮度值成功控制了usb灯。在第二部分的基础上,还可以检测温度和湿度,当检测到室温过高时,可以通过同样的方法让风扇转起来。
但是,仅仅这样的功能可能还不够,我还希望它只在装有这款raspberry pi设备的工作台周围有人时才工作!
另外,正如我在第一部分中提到的,我还希望它能起到防止主人在家办公期间因久坐不动而过于疲劳的作用。
编号 检测功能 检测后希望具备的功能
5 检测坐在椅子上的时间 检测到坐的时间太久(久坐不动),督促主人站起来活动活动
所以,这次我们来实现上述功能,这也是第一部分中列举的“要是有这样的功能就好了”的项目之一。具体来讲,需要添加一个能够让raspberry pi知道是否有人的传感器,以便确认工作台周围的活动状态。为此,我们将在raspberry pi上安装下面这种热释电红外线传感器。
传感器侧(从照片左边开始) raspberry pi侧
+(黄色) 5v
out(红色) gpio13
ー(黑色) gnd
与raspberry pi的连接如表中所示。实际安装的照片如下所示:
在这里,需要创建一个简单的程序human.py,来确认人体传感器是否正常发挥作用,在运行该程序时,如果周围有人,将显示为“1”,否则显示为“0”。
[human.py]
import rpi.gpio as gpiofrom time import sleephuman_pin = 13gpio.setmode(gpio.bcm)gpio.setup(human_pin, gpio.in)try: while true: human = gpio.input(human_pin) print(human) sleep(1)except keyboardinterrupt: passgpio.cleanup()  
运行human.py。仅当您坐在raspberry pi前面或将手靠近它时才会显示“1”。
2. 添加液晶显示器
现在,我们来给raspberry pi加一个液晶显示器,使之能够显示前面添加的sensormedal和人体传感器的值。
市场上有很多种液晶显示器,我选用的是只需将其插入raspberry pi的gpio引脚即可使用的displayotron hat,它也有一个可以连接人体传感器的gpio引脚。
如照片所示,将显示器插入raspberry pi的 gpio引脚。
这个显示器的库来自 adafruit,所以可以参考其github页面:
https://github.com/pimoroni/displayotron
运行页面中的安装脚本。这样将会在home下创建一个名为“pimoroni”的目录,并在其中的下述位置保存示例程序。
dot3000和dothat都有类似的功能,但是这次我使用的是dothat,所以我们会使用dothat对应的库。这里有一些示例程序,您可以尝试运行一下。
$ curl -ss get.pimoroni.com/displayotron | bash$ cd /home/pi/pimoroni/displayotron/dothat$ python3 basic/hello_world.py$ python3 basic/backlight.py  
下面,让我们修改一下连接sensormedal和raspberry pi的程序,以实现在这个液晶显示器上显示测量值。下面的第4行、第22〜27行、第45〜50行和第91〜115行是对第二部分中ble程序的补充。
[ble_lcd.py]
#!/usr/bin/env python3# coding: utf-8import dothat.lcd as lcdfrom datetime import datetimefrom 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 aimport rpi.gpio as gpiohuman_pin = 13gpio.setmode(gpio.bcm)gpio.setup(human_pin, gpio.in)human_count = 0human_check = 3interval = 10 # 工作间隔scanner = btle.scanner()while true: now = datetime.now() d = '{0:0>4d}/{1:0>2d}/{2:0>2d}({3})'.format(now.year, now.month, now.day, now.strftime('%a')) t = '{0:0>2d}:{1:0>2d}:{2:0>2d}'.format(now.hour, now.minute, now.second) lcd.clear() lcd.set_cursor_position(0, 0) lcd.write('piremote') lcd.set_cursor_position(0, 1) lcd.write('{}'.format(d)) lcd.set_cursor_position(2, 2) lcd.write('{}'.format(t)) human = gpio.input(human_pin) print(human) if human == 1: human_count+=1 else: human_count=0 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['id'] = hex(payval(2,2)) sensors['temperature'] = -45 + 175 * payval(4,2) / 65536 sensors['humidity'] = 100 * payval(6,2) / 65536 sensors['illuminance'] = payval(25,2) / 1.2 sensors['battery level'] = payval(30) sensors['rssi'] = dev.rssi print(' id =',sensors['id']) print(' temperature =',round(sensors['temperature'],2),'℃') print(' humidity =',round(sensors['humidity'],2),'%') 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) ''' temp = sensors['temperature'] humid = sensors['humidity'] if temp > 26 or humid > 60: temp_msg = hot! else: temp_msg = not bad illum = sensors['illuminance'] if illum human_check: human_msg = take rest else: human_msg = work hard! lcd.clear() lcd.set_cursor_position(0, 0) lcd.write('temp: {0:1.0f}c {1:1.0f}% {2}'.format(temp, humid, temp_msg)) lcd.set_cursor_position(0, 1) lcd.write('illum: {0:1.0f}lx {1}'.format(illum,illum_msg)) lcd.set_cursor_position(0, 2) lcd.write('{0:1.0f} cnt {1}'.format(human_count, human_msg)) sleep(interval)  
如果您像“sudo python3 ble_lcd.py”一样运行这个程序,那么将会首先获取并显示当前的日期和时间等信息。
一段时间后,即可通过ble获得sensormedal的测量值。然后将会显示温度、湿度和亮度等信息。通过人体传感器,您还可以查看人在那里呆了多少秒。
如果室温高于26℃、湿度高于 60%,它会发出警告。另外,在亮度为200lx以下时,显示消息也会发生变化。
而当人体传感器检测到人在那里的停留时间超过一定时间时(为便于测试,这里设置为30秒左右),显示信息就会变为“该休息了!”
您可以根据房间情况和工作情况尝试更改每种传感器的阈值。根据番茄工作法,采用工作25分钟休息5分钟的时间安排,工作效率会比较好,您也可以根据这类方法来设置数值。
3. 总结
这次我们在sensormedal基础上又添加了一个人体传感器,这样就可以检测桌子周围是否有人了。在我们在家办公过程中,很容易坐的时间过长,拥有一个能够在这种情况下关心我们、提醒我们的设备,真是一个不错的选择。
另外,我们还添加了一个液晶显示器,用来显示来自传感器的值。如果是hat型显示器,您可以使用现有的库文件轻松实现数据显示。当然,您也可以自己连接液晶显示器并自己尝试使用。
在第四部分,我们将会尝试实现能够从互联网获取信息、并通过各种数值提醒主人行动的机制,并最终完成整个舒适环境营造设备。
敬请期待!


高通5G技术瓜熟蒂落 博通恶意收购想法要落空
后来者的进击!黑莓发力嵌入式自动驾驶系统市场
物联网IOT芯片是什么?物联网芯片的作用 物联网芯片的应用领域
Vishay 新款SMD肖特基势垒整流器可为汽车和商业应用节省宝贵空间
SSI信号绝对值编码器使用注意事项
用Raspberry Pi和传感器制作“可自动营造舒适空间的装置” 第三部分
V2X标注之争 中国V2X通信标准亟待确立
ANADIGICS宣布向LG电子批量供货,助推LG Revolution智能手机
单芯片指纹锁原理及设计方案
Xilinx FPGA上的PMOD接口类型
国外创造一种新分子材料 可推动伤口的愈合
红外激光测距传感器的精度、测量距离及应用场景的介绍
SIM卡座NANO/MICRO自弹式与掀盖式的定义
跟我学C语言之顺序结构(下)
氧气就是我们赖以生存的法宝,制氧机哪个品牌好?
国行版iPhone X大降价啦?市场占有率超过iPhone8,你抢购到了吗?
保LCD地位还是抢占OLED市场份额,三星恐让自己陷入两难!
DC预言家 虎年有待升级数码相机新春盘点
小米集团将在下午一点恢复交易
8英寸晶圆代工采取这种方式实数罕见,更突显IC设计业抢产能火爆的盛况