Raspberry Pi + 磁気センサーで ドアの開閉をセンシングしてみた
先日もRaspberry Piに人感センサーの記事でちらっと書きましたが、会社でトイレIoTを作ろうとしておりまして。
ただ、人感センサーはあまりにも不確実なので、もうちょっと確実性の高いセンサーがないものか、探してみました。
で、見つかったのがこれ。
秋月電子通商で購入。その名も「ドアセンサースイッチ(リードスイッチ) SPS-320」。一つ250円で、4つ購入。送料込みで1500円でした。
いわゆる、磁気センサーです。磁石が接近すると、スイッチがオンになる、ただそれだけの仕組み。
会社のトイレは、人がいないときはドアが開きっぱなしに、いれば閉じているため、中にいるかどうかはドアの開閉で把握できます。そういう用途には、これが最適かと。
で、そいつをRaspberry piに接続して、以下のサイトを参考にコードを組みます。
【ラズパイ電子工作】スイッチのON/OFF状態を読み取る方法 | 電気設計人.com
上のリンクではスイッチでしたが、それをこの磁気センサーに置き換えただけ。
で、早速テスト。
磁石を近づけてみると、
ターミナル上にはこの通り、磁石が接近すると、数字が0から1に変わります。
おお、いい感じです。
さらに調子に乗って、コードをちょっといじってcsvファイル出力できるようにして、実際にドアにつけてみました。
こんな感じ。
開閉すると、
日時と数字(0,1)が記録されるようになりました。
さて、せっかくRaspberry Pi使っているので、一つのドアに一つじゃああまりにもったいない。
てことで、2つつけてみます。
と、その前に、センサーのリード線を一つだけ延長し、ブレッドボードに刺さりやすいよう加工します。
というわけで、はんだごてを引っ張り出して、
2本の線をはんだで固めます。
にしてもこの百均で以前買ったこのクリップ台、役に立ちますね。
その上からこの黒い被覆をかぶせて、はんだごての熱で収縮。
こうしてできたセンサーを使い、2箇所のドアのセンシングに挑戦。
ところでこのRaspberry Pi、よく見るとスイッチがついてますが、これはシャットダウンボタンです。2秒以上長押しすると、電源が落ちるようにしました(コードは後述)。
そして長い方を、隣の部屋のドアまで延長。
2つのドアに、両面テープでこんな感じに取りつけ。
ちなみに、回路図はこう。
ちょっと見難くて、申し訳ありません。スイッチ側は、一方を3.3Vに、もう一方をGPIO17と27に接続。
なお、シャットダウンボタンのスイッチは、GPIO22に接続しました。
で、コードはこちら。
【toil_tc.py】
import os
import datetime
import RPi.GPIO as GPIO
import time
import sys
#ポート番号の定義
Sw_pin1 = 17
Sw_pin2 = 27
Sw_pin3 = 18
Sw_pin4 = 23
Sw_shut = 22
#GPIOの設定
GPIO.setmode(GPIO.BCM)
#4つのGPIOを入力モードに設定してプルダウン抵抗を有効にする
#(最大4つまでセンシング可)
GPIO.setup(Sw_pin1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Sw_pin2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Sw_pin3, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Sw_pin4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Sw_shut, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
#ファイル保存開始
date_file = datetime.datetime.now()
with open("/home/pi/toilet_open_{0:%Y%m%d%H%M%S}.csv"
.format(date_file),"a") as f:
#GPIOの入力を読み取る
#while文で無限ループ
while True:
try:
now = datetime.datetime.now()
print(now , "," , GPIO.input(Sw_pin1),","
, GPIO.input(Sw_pin2), ","
, GPIO.input(Sw_pin3),","
, GPIO.input(Sw_pin4), file=f)
time.sleep(1)
# シャットダウンボタンの設定
if GPIO.input(Sw_shut):
tcount+=1
print(tcount)
else:
tcount = 0
if tcount>=2: #2秒以上押されてると反応
os.system("sudo shutdown -h now")
break
except KeyboardInterrupt:
GPIO.cleanup()
見ていただくと分かりますが、最大4つのスイッチまで対応したコードにしました。GPIO 18と23に追加可能。
で、これを電源オンで自動実行できるようにするため、まず /usr/local/bin の中に「auto.sh」というファイルを作成。
その「auto.sh」の中身は、
/usr/bin/python3.7 /home/pi/TOILET/toil_tc.py
と、pythonもコードも絶対パスで記載しておきます。
で、/etc/rc.localの下の方に、auto.sh を記載します。
これで、電源オンでいきなりドア監視がはじまります。
4つ出力できるようにしてますが、センサーは2つなので、最初の2列だけに値が入ります。
1番のセンサーが付いたドアは基本、閉めっぱなししており、時折出入りするため、0、1が記録されてます。
グラフで書くと、こう。
1番のセンサーのみ、開け閉めが記録されております。
単純な構造なのに、いや、単純ゆえに、確実なセンシングをしてくれます。
週明けにでも、会社にもっていこうと思ってます。
![]() |
I-O DATA Raspberry Pi メインボード Bluetooth(R) Wi-Fi対応モデル Raspberry Pi 3 model B 安心の1年間ハードウェア保証 UD-RP3 |
« Raspberry Piに人感センサーつけてみた | トップページ | くら寿司でのRaspberry Pi + Coralによるエッジ端末活用事例 »
「Raspberry Pi・Arduino・電子工作」カテゴリの記事
- 「DXに挑む!はじめの一歩 ~デジタルリテラシーを身につけよう~」にて登壇(2022.12.16)
- 忌まわしき暗黒の使者”G”を紫紺の炎に包みこの世から抹消せよ!的な装置(2022.10.18)
- Raspberry PiでUSBマイクから連続録音させる(2022.09.04)
- Raspberry Pi Zero 2 W 発表(2021.10.30)
- 2021年まとめ(2021.12.31)
コメント
« Raspberry Piに人感センサーつけてみた | トップページ | くら寿司でのRaspberry Pi + Coralによるエッジ端末活用事例 »
私も長いことこれに似た事例に取り組んでおりまして、先日ようやく完成させました。
よろしかったら以下のサイトをご覧ください。
https://qiita.com/mo256man/items/13084c865bfbf512a691
投稿: mo256man | 2020年12月28日 (月) 00時03分
> mo256man さん
見させていただきました。Raspberry Pi気絶問題にも対応とは恐れ入ります。死活チェックは重要ですよね。
さて、こちらはといえばやっと社内で起動です。ネットワークには繋げられないため、しばらくは電源オフしてデータ抜き取りという気の遠くなる作業の繰り返しとなりますが、その先に得られるものがあれば…
投稿: ディープタイピング | 2020年12月28日 (月) 10時12分