电子说
大家好,我是吉田!
我们这次要创作一款让家中更舒适、让在家办公更高效的设备,本文是第三部分。
在第二部分中,我们用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 GPIO from time import sleep human_pin = 13 GPIO.setmode(GPIO.BCM) GPIO.setup(human_pin, GPIO.IN) try: while True: human = GPIO.input(human_pin) print(human) sleep(1) except KeyboardInterrupt: pass GPIO.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-8 import dothat.lcd as lcd from datetime import datetime 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 import RPi.GPIO as GPIO human_pin = 13 GPIO.setmode(GPIO.BCM) GPIO.setup(human_pin, GPIO.IN) human_count = 0 human_check = 3 interval = 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 < 200: illum_msg = "Dark!" else: illum_msg = "Bright" if human_count > 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型显示器,您可以使用现有的库文件轻松实现数据显示。当然,您也可以自己连接液晶显示器并自己尝试使用。
在第四部分,我们将会尝试实现能够从互联网获取信息、并通过各种数值提醒主人行动的机制,并最终完成整个舒适环境营造设备。
敬请期待!
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !