sample_pirMotion - gfd-dennou-club/mrubyc-esp32 GitHub Wiki
https://www.seeedstudio.com/Grove-PIR-Motion-Sensor.html
特徴
- センサーの反応する範囲は広い.角度 < 120 度.そのため,センサーの真正面ではなく斜め前くらいに手を近づけても反応する (戻り値 1).
- センサの前に手をかざした時,常に戻り値が 1 なわけではない.手をかざした瞬間に戻り値が 1 になり,手をかざしつづけても戻り値は 0 と 1 を繰り返す.
- センサの前から手を遠ざけても,数秒間は戻り値が 0 と 1 を繰り返す.→ タクトスイッチと同様なチャタリング的振る舞いを示す
- したがって,戻り値が 1 になったら,数秒の待ち時間を入れるのがよさそう.→ デバウンス時間の設定をする
サンプル
https://github.com/user-attachments/assets/fff2ae9f-6e2d-4f9f-95c7-d7c5b01d350c
以下,GPIO 13 に接続した PIR モーションセンサーで検知.戻り値を標準出力に表示する.GPIO は 13 ではなく,例えば入力専用の 36 などでも良い.
pin_num = 13
sensor = GPIO.new(pin_num, GPIO::IN|GPIO::PULL_UP)
last_state = 0 # 前回の状態を記憶する変数(初期値はOFFと仮定)
num = 0
wait = 50 # デバウンス時間 約 5 秒
loop do
current_state = sensor.read # 現在の状態を読み取る
# デバウンス時間経過後,「前回は 0 で、今回は 1」の瞬間だけを検知する (立ち上がりエッジ)
if last_state == 0 && current_state == 1 && num > wait
puts "【動きを検知しました!】"
num = 0
end
last_state = current_state # 次回のループのために現在の状態を「前回」として記憶
num += 1
#p last_state, num
sleep 0.1
end
参考:サンプル (チャタリング的振る舞いの確認用)
https://github.com/user-attachments/assets/56738f12-4eb1-43b9-a943-b6f7a7a40ae5
以下,GPIO 13 に接続した PIR モーションセンサーで検知.戻り値を標準出力に表示する.GPIO は 13 ではなく,例えば入力専用の 36 などでも良い.
sw1 = GPIO.new( 13, GPIO::IN | GPIO::PULL_UP )
loop do
puts sw1.read
sleep 0.2
end