Raspberry Pi Pico(s_21)HC-SR501 用モジュール machine.Timer()
HC-SR501 SR501c.py
HC-SR501は人体センサーです。※詳細はHC-SR501のデータシートを参照ください。
Raspberry Pi PicoでHC-SR501センサーを使う自作の’SR501c.py’を作成しました。記事d_27を元に作成しています。’SR501c.py’は末尾にあります。
使い方だけを記載します。
使い方
■ ファイル転送
Raspberry Pi Picoへ’SR501c.py’を送った後でimportして使います。
※SR501c.pyの末尾に、使用例(SR501c_ex.py)の## example以降をコピペ追加しても動作確認できます。
■ メソッド
‘SR501c’をimportすると「Detect」のメソッドが使えるようになります。
SR501(d=27,lo=26)で初期化します。
d:HC-SR501のOUTを入力するGP番号です。デフォルトはGP27です。
lo:HC-SR501の検知後にPicoの出力するGP番号です。デフォルトはGP26です。
※記事d_27と同じくGP26にLEDを接続しています。
(01)Detect(tm=3000)
HC-SR501の検知後にPicoが出力する時間(保持)です。単位はmsecです。
デフォルトは3000msecになります。
使用例
HC-SR501の動作を確認します。記事d_27と同様に接続しています。
以下の動作例は、GP22出力でLED-Rを点滅を繰り返していますが、HC-SR501で人体検知するとGP26出力でLED-Yが5sec点灯します。その間もLED-Rを点滅動作しています。LED-Rを点滅10回繰り返しで停止します。
動作がわかるようにタイマー時間など、Thonnyのshellに表示させています。
SR501c_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import Pin
from SR501c import SR501
import time
# HC-SR501 PIR Motion Detector
## example
R=Pin(22, Pin.OUT, value=0) #RED-LED
a=SR501(d=27,lo=26) # d:HC-SR501 OUT lo:Pico output-pin
#hold=0 # 検知保持
cnt=0
while True:
a.Detect(5000)
print('--------------blink')
for i in range(5):
R.high()
time.sleep(0.1)
R.low()
time.sleep(0.1)
cnt=cnt+1
if cnt>=10:
break
実行結果
実行すると以下のようになりました。※Thonnyのshellに表示されます。
>>> %Run -c $EDITOR_CONTENT
--------------blink
detect #検知
d_Pin=1 LED=1 #出力保持 5sec
--------------blink
--------------blink
--------------blink
--------------blink
--------------blink
hold off ticks= 5000 #タイマーアップ
--------------blink #無検知
--------------blink #無検知
--------------blink #無検知
detect #検知
d_Pin=1 LED=1 #出力保持 5sec
--------------blink #count-up breakするが出力保持は続く
>>> hold off ticks= 5000 #タイマーアップ
HC-SR501モジュール用
SR501c.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import Pin, Timer
import time
# HC-SR501 PIR Motion Detector
class SR501:
def __init__(self,d=27,lo=26):
#PIR Pin
self.d_Pin=Pin(d, Pin.IN, Pin.PULL_DOWN) # PIR OUT
#OUT Pin
self.lo_Pin=Pin(lo, Pin.OUT, value=0) #Y-LED
self.hold=0 # 検知保持
self.tim=Timer()
#tim.init(period=3000, mode=Timer.ONE_SHOT, callback=lambda t:print('one shot'))
def h_off(self,t):
self.hold=0
self.lo_Pin.low() #lo_Pin(0)
self.ut=time.ticks_ms() #確認用
print('hold off ticks=', self.ut-self.st) #確認用
# hold=tm(msec)
def Detect(self,tm=3000):
if (self.d_Pin()==1) & (self.hold==0):
print('detect')
self.hold=1
self.lo_Pin.high() #lo_Pin(1)
#period(msec)
self.tim.init(period=tm, mode=Timer.ONE_SHOT, callback=self.h_off)
self.st=time.ticks_ms() #確認用
print('d_Pin=%1d'%self.d_Pin(),'LED=%1d'%self.lo_Pin()) #確認用