0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用Raspberry Pi和傳感器制作“可自動營造舒適空間的裝置” 第三部分

山中老虎 ? 來源:羅姆 ? 作者:羅姆 ? 2023-02-24 10:43 ? 次閱讀

大家好,我是吉田!
我們這次要創(chuàng)作一款讓家中更舒適、讓在家辦公更高效的設(shè)備,本文是第三部分。
在第二部分中,我們用BLE連接了羅姆SensorMedal并測量了各種數(shù)據(jù)。在第三部分,我希望通過安裝人體傳感器等器件,實現(xiàn)檢查主人是否久坐不動或過度工作的功能!
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連接人體傳感器

添加液晶顯示器

總結(jié)

1. 給Raspberry Pi連接人體傳感器

第二部分中,我們通過羅姆SensorMedal測量了亮度,并根據(jù)亮度值成功控制了USB燈。在第二部分的基礎(chǔ)上,還可以檢測溫度和濕度,當(dāng)檢測到室溫過高時,可以通過同樣的方法讓風(fēng)扇轉(zhuǎn)起來。

但是,僅僅這樣的功能可能還不夠,我還希望它只在裝有這款Raspberry Pi設(shè)備的工作臺周圍有人時才工作!

另外,正如我在第一部分中提到的,我還希望它能起到防止主人在家辦公期間因久坐不動而過于疲勞的作用。

編號 檢測功能 檢測后希望具備的功能
5 檢測坐在椅子上的時間 檢測到坐的時間太久(久坐不動),督促主人站起來活動活動

所以,這次我們來實現(xiàn)上述功能,這也是第一部分中列舉的“要是有這樣的功能就好了”的項目之一。具體來講,需要添加一個能夠讓Raspberry Pi知道是否有人的傳感器,以便確認(rèn)工作臺周圍的活動狀態(tài)。為此,我們將在Raspberry Pi上安裝下面這種熱釋電紅外線傳感器。

poYBAGPzGtmAOkGgAADmme5olx4698.jpg

傳感器側(cè)(從照片左邊開始) Raspberry Pi側(cè)
+(黃色) 5V
OUT(紅色) GPIO13
ー(黑色) GND

與Raspberry Pi的連接如表中所示。實際安裝的照片如下所示:

pYYBAGPzGtyACCHQAAGonCx6UTE000.jpg

在這里,需要創(chuàng)建一個簡單的程序human.py,來確認(rèn)人體傳感器是否正常發(fā)揮作用,在運行該程序時,如果周圍有人,將顯示為“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。僅當(dāng)您坐在Raspberry Pi前面或?qū)⑹挚拷鼤r才會顯示“1”。

pYYBAGPzGt6AJ4drAAA6hlqB3Us500.png

poYBAGPzGuGAMmFyAAE1dfAGGOA792.jpg

2. 添加液晶顯示器

現(xiàn)在,我們來給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下創(chuàng)建一個名為“pimoroni”的目錄,并在其中的下述位置保存示例程序。

Dot3000和DotHat都有類似的功能,但是這次我使用的是DotHat,所以我們會使用DotHat對應(yīng)的庫。這里有一些示例程序,您可以嘗試運行一下。

$ 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的程序,以實現(xiàn)在這個液晶顯示器上顯示測量值。下面的第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”一樣運行這個程序,那么將會首先獲取并顯示當(dāng)前的日期和時間等信息

pYYBAGPzGuqAS0CTAAEnwLO1CGs213.jpg

一段時間后,即可通過BLE獲得SensorMedal的測量值。然后將會顯示溫度、濕度和亮度等信息。通過人體傳感器,您還可以查看人在那里呆了多少秒。

poYBAGPzGu2AeE1WAAEpkXS24ls611.jpg

如果室溫高于26℃、濕度高于 60%,它會發(fā)出警告。另外,在亮度為200Lx以下時,顯示消息也會發(fā)生變化。
而當(dāng)人體傳感器檢測到人在那里的停留時間超過一定時間時(為便于測試,這里設(shè)置為30秒左右),顯示信息就會變?yōu)椤霸撔菹⒘耍 ?/p>

您可以根據(jù)房間情況和工作情況嘗試更改每種傳感器的閾值。根據(jù)番茄工作法,采用工作25分鐘休息5分鐘的時間安排,工作效率會比較好,您也可以根據(jù)這類方法來設(shè)置數(shù)值。

3. 總結(jié)

這次我們在SensorMedal基礎(chǔ)上又添加了一個人體傳感器,這樣就可以檢測桌子周圍是否有人了。在我們在家辦公過程中,很容易坐的時間過長,擁有一個能夠在這種情況下關(guān)心我們、提醒我們的設(shè)備,真是一個不錯的選擇。

另外,我們還添加了一個液晶顯示器,用來顯示來自傳感器的值。如果是HAT型顯示器,您可以使用現(xiàn)有的庫文件輕松實現(xiàn)數(shù)據(jù)顯示。當(dāng)然,您也可以自己連接液晶顯示器并自己嘗試使用。

在第四部分,我們將會嘗試實現(xiàn)能夠從互聯(lián)網(wǎng)獲取信息、并通過各種數(shù)值提醒主人行動的機制,并最終完成整個舒適環(huán)境營造設(shè)備。
敬請期待!

審核編輯黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2545

    文章

    50453

    瀏覽量

    751099
  • Raspberry Pi
    +關(guān)注

    關(guān)注

    1

    文章

    555

    瀏覽量

    22149
收藏 人收藏

    評論

    相關(guān)推薦

    獨特的51單片機教程第三部分上—牛人經(jīng)驗,論壇獨家奉獻(xiàn)

    本帖最后由 eehome 于 2013-1-5 10:01 編輯 獨特的51單片機教程第三部分—牛人經(jīng)驗,論壇獨家奉獻(xiàn)指令系統(tǒng) 與 尋址方式 按照順序,今天該到說指令系統(tǒng)的時候了,要說指令系統(tǒng)
    發(fā)表于 11-17 11:18

    LabVIEW開發(fā)者必備技巧寶典第三部分

    LabVIEW開發(fā)者必備技巧寶典第三部分分享給大家,請叫我雷鋒。
    發(fā)表于 12-05 11:40

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

    大家好,我似乎找不到任何基于PSoC4或Pro的第三部分模塊。例如,對話框的DA14580來自松下的PAN1740模塊。塞浦路斯IC有第三方供應(yīng)商嗎?提前感謝!克里斯托弗
    發(fā)表于 09-17 14:18

    接收機晶體變換設(shè)計及制作第三部分

    接收機晶體變換設(shè)計及制作第三部分 晶體變換的印刷電路基板的制作與調(diào)整 圖26晶體變換
    發(fā)表于 05-15 10:58 ?983次閱讀
    接收機<b class='flag-5'>用</b>晶體變換<b class='flag-5'>器</b>設(shè)計及<b class='flag-5'>制作</b><b class='flag-5'>第三部分</b>

    開關(guān)電源設(shè)計(第3版)第三部分

    電子發(fā)燒友網(wǎng)站提供《開關(guān)電源設(shè)計(第3版)第三部分.txt》資料免費下載
    發(fā)表于 09-12 15:04 ?0次下載

    2012年P(guān)SoC數(shù)模混合設(shè)計培訓(xùn)_第三部分

    2012年P(guān)SoC數(shù)?;旌显O(shè)計培訓(xùn)_第三部分
    發(fā)表于 10-27 09:30 ?8次下載
    2012年P(guān)SoC數(shù)?;旌显O(shè)計培訓(xùn)_<b class='flag-5'>第三部分</b>

    LTC2387驅(qū)動程序第三部分

    LTC2387驅(qū)動程序第三部分
    發(fā)表于 05-16 15:23 ?5次下載
    LTC2387驅(qū)動程序<b class='flag-5'>第三部分</b>

    用于激活設(shè)備的可編程定時-第三部分

    電子發(fā)燒友網(wǎng)站提供《用于激活設(shè)備的可編程定時-第三部分.zip》資料免費下載
    發(fā)表于 12-16 10:28 ?0次下載
    用于激活設(shè)備的可編程定時<b class='flag-5'>器</b>-<b class='flag-5'>第三部分</b>

    Raspberry Pi和SensorMedal制作IoT跳繩設(shè)備 第四部分:在設(shè)備上安裝顯示以增加動力

    第一部分跳繩測試儀解決運動不足問題!第二部分SensorMedal檢測跳躍次數(shù)并在顯示上顯示
    的頭像 發(fā)表于 03-23 15:18 ?763次閱讀
    <b class='flag-5'>用</b><b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b>和SensorMedal<b class='flag-5'>制作</b>IoT跳繩設(shè)備 第四<b class='flag-5'>部分</b>:在設(shè)備上安裝顯示<b class='flag-5'>器</b>以增加動力

    一款Raspberry Pi傳感器制作的可穿戴式小型健康管理設(shè)備!第四部分?劇終篇

    第1部分Raspberry Pi Zero和羅姆SensorMedal制作健康管理設(shè)備!第2部分
    的頭像 發(fā)表于 02-24 10:06 ?2156次閱讀
    一款<b class='flag-5'>用</b><b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b>和<b class='flag-5'>傳感器</b><b class='flag-5'>制作</b>的可穿戴式小型健康管理設(shè)備!第四<b class='flag-5'>部分</b>?劇終篇

    Raspberry Pi傳感器制作自動營造舒適空間裝置” 第四部分?劇終篇

    第1回:Raspberry Pi傳感器制作自動
    的頭像 發(fā)表于 02-24 10:17 ?724次閱讀
    <b class='flag-5'>用</b><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>” 第四<b class='flag-5'>部分</b>?劇終篇

    Raspberry Pi傳感器制作自動營造舒適空間裝置” 第二部分

    大家好,我是吉田!我們這次要創(chuàng)作一款讓家中更舒適、讓在家辦公更高效的設(shè)備,本文是第二部分。第一部分介紹了制作綱要和所需部件。這次我們將實際連接Bluetooth
    的頭像 發(fā)表于 03-01 11:15 ?528次閱讀
    <b class='flag-5'>用</b><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>” 第二<b class='flag-5'>部分</b>

    硬件即代碼第三部分空間與時間

    電子發(fā)燒友網(wǎng)站提供《硬件即代碼第三部分空間與時間.zip》資料免費下載
    發(fā)表于 06-14 15:12 ?0次下載
    硬件即代碼<b class='flag-5'>第三部分</b>:<b class='flag-5'>空間</b>與時間

    SensorTile.box第三部分:編程模式(Pro mode)介紹

    電子發(fā)燒友網(wǎng)站提供《SensorTile.box第三部分:編程模式(Pro mode)介紹.pdf》資料免費下載
    發(fā)表于 07-29 16:19 ?0次下載
    SensorTile.box<b class='flag-5'>第三部分</b>:編程模式(Pro mode)介紹

    用于高頻接收和發(fā)射的鎖相環(huán)——第三部分

    電子發(fā)燒友網(wǎng)站提供《用于高頻接收和發(fā)射的鎖相環(huán)——第三部分.pdf》資料免費下載
    發(fā)表于 11-23 10:18 ?0次下載
    用于高頻接收<b class='flag-5'>器</b>和發(fā)射<b class='flag-5'>器</b>的鎖相環(huán)——<b class='flag-5'>第三部分</b>