1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

窓の開閉を検知するセンサーを作る

Last updated at Posted at 2021-07-15

窓が開いているかどうかをモニターする仕組みを作ってみました。
窓が開いているか閉まっているかをgoogle spreadsheetに書き込みます。

前提

  • raspberry piの初期設定が終わっていること
    • 今回はraspberry pi zero WHを使っています
    • HDMIの変換コネクタとUSBの変換コネクタを使った以外はraspberry pi 4 model Bと同じやり方で初期設定しています
    • 電源とキーボードでコネクタが埋まってしまうのでマウスがなくて不便ですが、TabとSpaceを駆使して入力しました
  • 開閉センサーを購入していること
  • ブレッドボードがあること
  • ジャンパーケーブルがあること(オス-メス * 2本)

開閉センサーは、これを使っています。

マグネットスイッチAMS-10C
https://www.amazon.co.jp/dp/B00NOUSVGS

ケーブル接続

  • ラズベリーパイの6番ピン(GND)に黒いケーブルのメスをつなぐ
  • ラズベリーパイの12番ピン(GPIO18)に白いケーブルのメスをつなぐ
  • ブレッドボードの5eに黒いケーブルのオスをつなぐ
  • ブレッドボードの1eに白いケーブルのオスをつなぐ
  • センサーのケーブルを1aと5aにつなぐ

※ 下の絵では白のケーブルは紫で書いています

mado_kairo2.png

スクリプト作成

↑のページに記載されているプログラムをコピペして、sensor.pyで保存
※ ↓のプログラムではsleepを1秒に長くしています

sensor.py
import time
import RPi.GPIO as GPIO
 
GPIO.setmode(GPIO.BCM)
 
GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP)
 
sw_status = 1
 
while True:
    try:
        sw_status = GPIO.input(18)
        if sw_status == 0:
            print("Close")
        else:
            print("Open!")
 
        time.sleep(1)
    except:
        break
 
GPIO.cleanup()
print("end")

スクリプト実行

  • センサーが近づいているとClose、離れているとopen!が出力されるはずです
$ sudo python sensor.py
Close
Close
Close
Close
Close
Open!
Open!
Open!
Open!
Open!
Open!
Open!

1分おきにgoogle spread sheetに記録 (google spread sheet側の設定)

  • 基本的に以下のページを参照して実施しました

  • google spread sheetで1個ファイルを作成

    • ファイル名は自由に設定、シート名は"test1"とします
  • ツール→スクリプトエディタからgoogle apps scriptを開き、以下を貼り付ける

var spreadsheetId = 'スプレッドシートのIDを入れる'

//Postされたデータを受け取り
function doPost(e){
  var data = [      
    e.parameter.Date_Master, // マスター日時     
    e.parameter.Mado_1F_north,    
    e.parameter.Mado_2F_north,    
    e.parameter.Mado_2F_south,     
  ];
  //取得したデータをログに記載
  Logger.log(new Date());
  //スプレッドシートへのデータ行書き込み
  addData(e.parameter.DeviceName, data);
  return ContentService.createTextOutput("ok");
}

//スプレッドシートへのデータ行書き込み
function addData(sheetName, data){
  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
  sheet.appendRow(data);
}

  • 公開→ウェブアプリケーションとして導入→

    • プロジェクトバージョン: new
    • Execute the app as: Me
    • Who has access to the app: Anyone, even anonymous <<<< ここは変更
  • このアプリは確認されていません→詳細を非表示→postAPITest

  • current web app URL: ここに出てくるURL(=API key)をメモ(このURLを使ってgoogle spread sheetに書き込みます)

  • curlコマンドで実行テスト

    • 以下のコマンドをraspberry piからたたく
    • API keyは↑で出てきたURLです
    • google spread sheetのB列に1000000が入るはずです
curl -L https://script.google.com/macros/s/{API key}/exec/exec -F 'DeviceName=test1' -F 'Mado_1F_north=1000000'

1分おきにgoogle spread sheetに記録 (raspberry pi側の設定)

  • スクリプトを作成
    • これは1階北側用。他の場所にするときは、"Mado_1F_north"を変更する。
mado_status.py
import time
import RPi.GPIO as GPIO
import requests
import datetime
import csv
import pprint

dt_now = datetime.datetime.now()

GPIO.setmode(GPIO.BCM)

GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP)

sw_status = 1

sw_status = GPIO.input(18)
if sw_status == 0:
    mado_status = "Close"
else:
    mado_status = "Open!"
GPIO.cleanup()

print(mado_status)

deviceName = 'test1'
data = {
'DeviceName': deviceName,
'Date_Master': str(dt_now),
'Mado_1F_north': str(mado_status),
}

url = 'https://script.google.com/macros/s/{API key}/exec'
response = requests.post(url, data=data)
  • スクリプトを実行して値がgoogle spread sheetに書き込まれることを確認

cronの設定

  • 以下の設定をします
    • 5分おきにデータを記録
*/5 * * * * python /{実際に保存した場所}/mado_status.py

設置

窓に設置します。

  • Open! の時

DSC_1157.jpg

  • Close の時

DSC_1158.jpg

他の窓の分を作成

  • 他の窓の分のセットを作成します

ポータルでの開閉状態の表示もできるようにしています

2021年3月から始めたスマートホーム化はこちらに一覧化しています(2021年7月時点)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?