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

电子说

1.3w人已加入

描述

大家好,我是吉田!
我们这次要创作一款让家中更舒适、让在家办公更高效的设备,本文是第三部分。
在第二部分中,我们用BLE连接了罗姆SensorMedal并测量了各种数据。在第三部分,我希望通过安装人体传感器等器件,实现检查主人是否久坐不动或过度工作的功能!
Raspberry Pi

本部分所需部件

Raspberry Pi 3 B+ 或 Raspberry Pi 4 Model B

Raspberry Pi

Raspberry Pi 3 B+

Raspberry Pi

Raspberry Pi 4 Model B

罗姆SensorMedal(SensorMedal-EVK-002)

Raspberry Pi

热释电红外线传感器 (SB412A)

Raspberry Pi

Raspberry Pi用液晶显示器

Raspberry Pi

本部分的流程

给Raspberry Pi连接人体传感器

添加液晶显示器

总结

1. 给Raspberry Pi连接人体传感器

第二部分中,我们通过罗姆SensorMedal测量了亮度,并根据亮度值成功控制了USB灯。在第二部分的基础上,还可以检测温度和湿度,当检测到室温过高时,可以通过同样的方法让风扇转起来。

但是,仅仅这样的功能可能还不够,我还希望它只在装有这款Raspberry Pi设备的工作台周围有人时才工作!

另外,正如我在第一部分中提到的,我还希望它能起到防止主人在家办公期间因久坐不动而过于疲劳的作用。

编号 检测功能 检测后希望具备的功能
5 检测坐在椅子上的时间 检测到坐的时间太久(久坐不动),督促主人站起来活动活动

所以,这次我们来实现上述功能,这也是第一部分中列举的“要是有这样的功能就好了”的项目之一。具体来讲,需要添加一个能够让Raspberry Pi知道是否有人的传感器,以便确认工作台周围的活动状态。为此,我们将在Raspberry Pi上安装下面这种热释电红外线传感器。

Raspberry Pi

传感器侧(从照片左边开始) Raspberry Pi侧
+(黄色) 5V
OUT(红色) GPIO13
ー(黑色) GND

与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”。

Raspberry Pi

Raspberry Pi

2. 添加液晶显示器

现在,我们来给Raspberry Pi加一个液晶显示器,使之能够显示前面添加的SensorMedal和人体传感器的值。

市场上有很多种液晶显示器,我选用的是只需将其插入Raspberry Pi的GPIO引脚即可使用的DISPLAYOTRON HAT,它也有一个可以连接人体传感器的GPIO引脚。

Raspberry Pi

如照片所示,将显示器插入Raspberry Pi的 GPIO引脚。

Raspberry Pi

这个显示器的库来自 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”一样运行这个程序,那么将会首先获取并显示当前的日期和时间等信息。

Raspberry Pi

一段时间后,即可通过BLE获得SensorMedal的测量值。然后将会显示温度、湿度和亮度等信息。通过人体传感器,您还可以查看人在那里呆了多少秒。

Raspberry Pi

如果室温高于26℃、湿度高于 60%,它会发出警告。另外,在亮度为200Lx以下时,显示消息也会发生变化。
而当人体传感器检测到人在那里的停留时间超过一定时间时(为便于测试,这里设置为30秒左右),显示信息就会变为“该休息了!”

您可以根据房间情况和工作情况尝试更改每种传感器的阈值。根据番茄工作法,采用工作25分钟休息5分钟的时间安排,工作效率会比较好,您也可以根据这类方法来设置数值。

3. 总结

这次我们在SensorMedal基础上又添加了一个人体传感器,这样就可以检测桌子周围是否有人了。在我们在家办公过程中,很容易坐的时间过长,拥有一个能够在这种情况下关心我们、提醒我们的设备,真是一个不错的选择。

另外,我们还添加了一个液晶显示器,用来显示来自传感器的值。如果是HAT型显示器,您可以使用现有的库文件轻松实现数据显示。当然,您也可以自己连接液晶显示器并自己尝试使用。

在第四部分,我们将会尝试实现能够从互联网获取信息、并通过各种数值提醒主人行动的机制,并最终完成整个舒适环境营造设备。
敬请期待!

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分