用Raspberry Pi和传感器制作“可自动营造舒适空间的装置” 第三部分
来源:ROHM
作者:吉田
发布时间:2023-3-1
阅读量:4
我们这次要创作一款让家中更舒适、让在家办公更高效的设备,本文是第三部分。
在第二部分中,我们用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设备的工作台周围有人时才工作!
另外,正如我在第一部分中提到的,我还希望它能起到防止主人在家办公期间因久坐不动而过于疲劳的作用。
所以,这次我们来实现上述功能,这也是第一部分中列举的“要是有这样的功能就好了”的项目之一。具体来讲,需要添加一个能够让Raspberry Pi知道是否有人的传感器,以便确认工作台周围的活动状态。为此,我们将在Raspberry Pi上安装下面这种热释电红外线传感器。
与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)