稼働中

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())    #確認用