0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

山中老虎 来源:罗姆 作者:罗姆 2023-02-24 10:43 次阅读

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

本部分所需部件

Raspberry Pi 3 B+ 或 Raspberry Pi 4 Model B

poYBAGPzGsaAP1GPAACgjfKDWVg250.jpg

Raspberry Pi 3 B+

poYBAGPzGsmAPwNLAACvO9u33bY417.jpg

Raspberry Pi 4 Model B

罗姆SensorMedal(SensorMedal-EVK-002)

poYBAGPzGsyAZvoKAAB6V-XqblY393.jpg

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

pYYBAGPzGpOAGUeFAAEoTKKM1CM773.jpg

Raspberry Pi用液晶显示器

pYYBAGPzGomATcCzAAFYik0A-9Q075.jpg

本部分的流程

给Raspberry Pi连接人体传感器

添加液晶显示器

总结

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

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

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

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

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

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

poYBAGPzGtmAOkGgAADmme5olx4698.jpg

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

与Raspberry Pi的连接如表中所示。实际安装的照片如下所示:

pYYBAGPzGtyACCHQAAGonCx6UTE000.jpg

在这里,需要创建一个简单的程序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”。

pYYBAGPzGt6AJ4drAAA6hlqB3Us500.png

poYBAGPzGuGAMmFyAAE1dfAGGOA792.jpg

2. 添加液晶显示器

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

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

pYYBAGPzGomATcCzAAFYik0A-9Q075.jpg

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

poYBAGPzGueAF5a9AAFQEBsisOQ621.jpg

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

pYYBAGPzGuqAS0CTAAEnwLO1CGs213.jpg

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

poYBAGPzGu2AeE1WAAEpkXS24ls611.jpg

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

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

3. 总结

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

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

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

审核编辑黄宇

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

    关注

    2525

    文章

    48137

    浏览量

    740247
  • Raspberry Pi
    +关注

    关注

    1

    文章

    552

    浏览量

    22058
收藏 人收藏

    评论

    相关推荐

    独特的51单片机教程第三部分上—牛人经验,论坛独家奉献

    本帖最后由 eehome 于 2013-1-5 10:01 编辑 独特的51单片机教程第三部分—牛人经验,论坛独家奉献指令系统 与 寻址方式 按照顺序,今天该到说指令系统的时候了,要说指令系统
    发表于 11-17 11:18

    独特的51单片机教程第三部分下—牛人经验,论坛独家奉献

    ——有什么潜力,至于怎么做,怎么写这条指令,这才是接下来要查的内容。 独特的51单片机教程第三部分下—牛人经验,论坛独家奉献独特的51单片机教程汇总贴https://bbs.elecfans.com
    发表于 11-18 09:59

    LabVIEW开发者必备技巧宝典第三部分

    LabVIEW开发者必备技巧宝典第三部分分享给大家,请叫我雷锋。
    发表于 12-05 11:40

    LabVIEW开发者必备技巧宝典第三部分

    本帖最后由 jfzhangjin 于 2015-5-6 09:30 编辑 LabVIEW开发者必备技巧宝典第三部分由电子发烧友网论坛出品,集结众多大牛、工程师的经验之作。为广大LabVIEW
    发表于 12-05 14:19

    (国标)YDT1363.3-2005通信站电源,空调及环境集中监控管理系统 第三部分,前端智能设备协议

    (国标)YDT1363.3-2005通信站电源,空调及环境集中监控管理系统 第三部分,前端智能设备协议论坛上没找到这类的资料,手上刚好有,就分享给大家
    发表于 06-04 14:55

    单电压基准与双电压基准的对决-第三部分

    在这个三部分系列博文中,我已经讨论了生成两个良好匹配、低漂移电压基准的解决方案。我们在第一部分个拓扑结构开始,在第二部分比较和对比了性能方面的不同。现在,我们来看一看这
    发表于 09-12 11:36

    找不到任何基于PSoC4或Pro的第三部分模块

    大家好,我似乎找不到任何基于PSoC4或Pro的第三部分模块。例如,对话框的DA14580来自松下的PAN1740模块。塞浦路斯IC有第三方供应商吗?提前感谢!克里斯托弗
    发表于 09-17 14:18

    Raspberry Pi机器人制作实例 PYTHON、LINUX和传感器搭建智能小车

    Raspberry Pi机器人制作实例 PYTHON、LINUX和传感器搭建智能小车
    发表于 04-03 11:51

    【大联大世平 NXP ZigBee JN5189开发板试用体验】第三部分

    本帖最后由 年少的轻狂不用来挥霍 于 2020-10-27 14:05 编辑 第三部分,烧写固件到嵌入式FLASH的话可以使用调试或者串口等,1.利用GUI FLASH工具(调试烧录)这个
    发表于 10-27 14:02

    接收机用晶体变换器设计及制作第三部分

    接收机用晶体变换器设计及制作第三部分 晶体变换器的印刷电路基板的制作与调整 图26晶体变换器的印刷电路基板
    发表于 05-15 10:58 898次阅读
    接收机用晶体变换器设计及<b class='flag-5'>制作</b><b class='flag-5'>第三部分</b>

    开关电源设计(第3版)第三部分

    电子发烧友网站提供《开关电源设计(第3版)第三部分.txt》资料免费下载
    发表于 09-12 15:04 0次下载

    2012年PSoC数模混合设计培训_第三部分

    2012年PSoC数模混合设计培训_第三部分
    发表于 10-27 09:30 8次下载
    2012年PSoC数模混合设计培训_<b class='flag-5'>第三部分</b>

    Raspberry Pi传感器制作“可自动营造舒适空间装置” 第四部分•剧终篇

    第1回:用Raspberry Pi传感器制作“可自动营造
    的头像 发表于 02-24 10:17 443次阅读
    用<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b>和<b class='flag-5'>传感器</b><b class='flag-5'>制作</b>“可<b class='flag-5'>自动</b><b class='flag-5'>营造</b><b class='flag-5'>舒适</b><b class='flag-5'>空间</b>的<b class='flag-5'>装置</b>” 第四<b class='flag-5'>部分</b>•剧终篇

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

    大家好,我是吉田!我们这次要创作一款让家中更舒适、让在家办公更高效的设备,本文是第二部分。第一部分介绍了制作纲要和所需部件。这次我们将实际连接Bluetooth
    的头像 发表于 03-01 11:15 344次阅读
    用<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b>和<b class='flag-5'>传感器</b><b class='flag-5'>制作</b>“可<b class='flag-5'>自动</b><b class='flag-5'>营造</b><b class='flag-5'>舒适</b><b class='flag-5'>空间</b>的<b class='flag-5'>装置</b>” 第二<b class='flag-5'>部分</b>

    硬件即代码第三部分空间与时间

    电子发烧友网站提供《硬件即代码第三部分空间与时间.zip》资料免费下载
    发表于 06-14 15:12 0次下载
    硬件即代码<b class='flag-5'>第三部分</b>:<b class='flag-5'>空间</b>与时间