概要
前回は会議室の利用状況をWeb上で把握できる仕組みを
M5Stack+マグネットスイッチ→ThingSpeak
を使って構築しました。
しかし”会議後にドアを開けておく”事を忘れる場合があるため、人感センサーを使用して会議室内の人の有無をチェックできる機能を追加しました。
なお、今回もUIFlowを使用して、1行もコードを書かずに構築しています。
使用したもの
・M5Stack(Basic)
・マグネットスイッチ
→ダイソーの「ドアが開くと点灯するライト」の部品を流用
→参考:ラズパイで100均のドア開閉センサー検知
・追加:秋月電子:焦電型赤外線センサーモジュール(焦電人感センサ)
接続方法
①マグネットスイッチ
→21ピン
→GND
②人感センサー
センサー→M5Stack
GND→GND
VCC→5V
OUT→5ピン
コード
最後に人を感知してから
・何秒経過したか→画面表示
・何分経過したか→ThingSpeakに通知
を出力しています(あまり大きな数値を出しても意味がないので、最大3分まで対応しています)
from m5stack import *
from m5ui import *
from uiflow import *
import time
import machine
import urequests
setScreenColor(0x222222)
CNT = None
isOpen = None
isMan = None
DoorStatus = M5TextBox(88, 44, "DoorStatus", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=0)
from numbers import Number
setScreenColor(0x000000)
DoorStatus.setText('Started')
wait(5)
pin0 = machine.Pin(21, mode=machine.Pin.IN, pull=machine.Pin.PULL_UP)
pin1 = machine.Pin(5, mode=machine.Pin.IN, pull=machine.Pin.PULL_UP)
CNT = 1
while True:
isOpen = pin0.value()
isMan = pin1.value()
if isOpen == 0:
setScreenColor(0xff0000)
lcd.print('Close', 0, 0, 0x000000)
else:
setScreenColor(0x009900)
lcd.print('Open', 0, 0, 0x000000)
if isMan == 0:
if CNT >= 180:
CNT = 180
else:
CNT = 1
lcd.print(((str('Last Man Found(s):') + str(CNT))), 0, 30, 0x000000)
if 0 == 0:
try:
req = urequests.request(method='GET', url=(str(((str('https://api.thingspeak.com/update?api_key=★ここにAPIKeyを入れます★&field1=') + str(isOpen)))) + str(((str(' &field2=') + str((CNT / 60)))))), headers={})
lcd.print('Posted', 50, 120, 0x000000)
except:
lcd.print('NG', 50, 120, 0x000000)
wait(5)
CNT = (CNT if isinstance(CNT, Number) else 0) + 5
wait_ms(2)
苦労したところ
1.ThingSpeakに2つの数値の送る書き方が分からなかった
・・・&field1=') + str(isOpen)))) + str(((str(' &field2=') + str((CNT / 60)))
という書き方で送ることができました。
2.人感センサーに反応されないようにするのが大変だった
近くにいるとどうしても反応してしまうため、センサーを皮の筆入れで包むことで遮断した