142
99

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.

Raspberry PiAdvent Calendar 2019

Day 20

ラズパイ?何それ?レベルのハードウェア未経験大学生がオフィスに人がいるか把握するシステムを作った

Last updated at Posted at 2020-01-02

はじめに

こんにちは。僕は現在、名古屋で大学生をしながらIT企業でインターン生として働いています。

そんな僕ですが、普段過ごしていると、既定の出社日以外の日にも出社して作業がしたいと思うわけです。
大学で講義を受けた後に、会社に行く。
そんな日は、18時頃に出社し、社員さんがいなくなる(オフィスが閉まる)まで作業をするわけです。
そう、僕のインターン先では、社員さんがオフィスの鍵を持っており、社員さんがいれば、休日であってもオフィスが空いています。

ある日

19時くらいに大学が終わり、オフィスに向かおうと思いました。
「まぁ誰か人がいるだろう」と思い込んでいました。
オフィスに到着すると、、、

閉まってるぅぅぅぅぅぅぅぅぅぅぅぅぅぅぅぅぅぅ

その日は、たまたま社員さんが全員帰っていました。

こりゃ困った...(社員さんに遅くまで残ってくださいとも言えないし、最後の社員さんが退社したタイミングで知らせてもらうのも申し訳ないし...)

本題

てなわけで、オフィスに人がいるのか把握するシステムを作ろうと考えました。
そこで、どうしようか悩んでいたところ、Raspberry PiArduinoが使えることを知りました。
それらに照度センサーを搭載させ、オフィスの照度を検知することで、人がいるのかどうかを把握できるのでは。と考えました。

ハードウェア何もわからない。完全に理解したい。

恥ずかしいことに、Raspberry PiArduinoについて本当に無知でしたので、たくさん調べました。
知人にハードウェアに詳しい高専出身の方(GANGANさん)がいたので、twitterのDMでめちゃくちゃ聞いたりも。

(こんな感じ/公開承諾済)
スクリーンショット 2019-12-31 12.38.32.png
(GANGANさんのブログはこちら)

そして、、

Raspberry Pi Zero WHWH用の明るさセンサ拡張基板を使うことが決まりました。(決め手: 安い)

上記2点は、ネットで購入しました。
変換ケーブルは、せっかくなので名古屋の秋葉原(大須)に行って買ってきました。

(こんな感じ)
スクリーンショット 2019-12-31 13.12.51.png
スクリーンショット 2019-12-31 13.12.43.png
スクリーンショット 2019-12-31 13.12.33.png

(写真撮るの忘れたのですが、ストレージ4GBも買いました。)

環境構築

ラズパイをディスプレイやキーボードと繋ぎ、完全に理解したい。
そんな思いで、いろんなサイトを参考にしながら、試行錯誤しました。

そして、ついに、、
スクリーンショット 2019-12-31 13.16.26.png

キタァァ!!!すげぇぇぇぇぇぇぇぇぇぇ!!!

ラズパイがパソコンになりました!!

参考:
Raspberry Pi Zero WHにOSインストールして起動するまで
Raspberry Pi Zero WHにRaspbian OSを導入する


また、何度もディスプレイやキーボードに繋いでいるとダルいので、sshによるリモートアクセスを行いました。
今後は自分のPC上からラズパイに接続することにしました。

参考:
Raspberry Pi へのリモート接続

実装

アーキテクチャ

照度を検知して、その数値を何らかの形で自分に知らせたい訳ですが、、
LINE APISLACK APIを使おうと考えました。

そこで、このようなアーキテクチャになりました。
スクリーンショット 2019-12-31 13.32.21.png

シンプルですね。

照度を検知する

今回購入したゼロワンシリーズですが、とても便利で、照度を検知するためのサンプルコードが公開されていました。

上記サンプルコード参考に、

#!/usr/bin/env python3
# coding: utf-8

import smbus

bus = smbus.SMBus(1)
bus.write_byte_data(0x13, 0x80, 0xFF)
bus.write_byte_data(0x13, 0x82, 0x00)
bus.write_byte_data(0x13, 0x84, 0x9D)
data = bus.read_i2c_block_data(0x13, 0x85, 4)

luminance = data[0] * 256 + data[1]
proximity = data[2] * 256 + data[3]

とすると、照度(luminance)が検知できました。

おおよそですが、

電気がついている時、luminance:3000
電気がついてない時、luminance: 5

くらいの感じでした。また、日光による誤検知を防ぐため、陽の当たらない場所にラズパイを設置しました。

slackと連携する

新たにチャンネルを作り、そこにBotが照度をメッセージとして送信するような仕組みを考えます。
こちらを参考に、webhook URLを取得しました。
あとは、指定の形式でpostリクエストするだけです。

完成したプログラム

休日は、10時以降
平日は、17時以降 にslackへmessageを送ります。

#!/usr/bin/env python3
# coding: utf-8

import smbus
import time
import requests, json
import datetime
import jpholiday
WEB_HOOK_URL = "****"
message = u'defalut'

bus = smbus.SMBus(1)
bus.write_byte_data(0x13, 0x80, 0xFF)
bus.write_byte_data(0x13, 0x82, 0x00)
bus.write_byte_data(0x13, 0x84, 0x9D)
time.sleep(0.8)
data = bus.read_i2c_block_data(0x13, 0x85, 4)

luminance = data[0] * 256 + data[1]
proximity = data[2] * 256 + data[3]


today = datetime.date.today()
today_str = str(today).replace('-', '')
current_hour = datetime.datetime.now().hour

def isBizDay(DATE):
 Date = datetime.date(int(DATE[0:4]), int(DATE[4:6]), int(DATE[6:8]))
 if Date.weekday() >= 5 or jpholiday.is_holiday(Date):
  return 0
 else:		
  return 1

def sendMessage():
 if luminance >= 800:
  message = u'現在、オフィスに人がいます!早く帰りましょう!'	
 else:
  message = u'現在、オフィスに人はいません。'

 requests.post(WEB_HOOK_URL, data = json.dumps({
 'text': u'照度は、'+str(luminance)+u'です!'+message,  #通知内容
 'username': u'Bakira-Tech-Python-Bot',  #ユーザー名
 'icon_emoji': u':smile_cat:',  #アイコン
 'link_names': 1,  #名前をリンク化
 }))


if isBizDay(today_str) == 1:
 print("平日です")		
 if current_hour > 17:
  sendMessage()
else: 	
 print("休日です")		
 if current_hour > 10:
  sendMessage()

こんな感じ↓でメッセージの送信ができました。

スクリーンショット 2019-12-31 20.02.26.png

プログラムの定期実行

pythonファイルにread権限を与え、crontabコマンドより、定期実行を実現します。

30分に1回、該当pythonファイルを実行させるように設定しました。

*/30 * * * * /home/pi/luminance.py

参考:
Raspberry Pi3B でPythonをcronする。
RaspberryPiでプログラムを定期的に実行する

おわりに

これで、せっかくオフィスまで行ったのに空いてなかったなんてことはもうない!!
ラズパイ?何それ?レベルでしたが、何とか実装することができて大変満足です。
終わってみれば、とても簡単な実装のみで実現することができました。
今回に留まらず、ラズパイを使ってもっと多くの身近な課題を解決していけたらいいなと思います。
いやぁ便利 !!ラズパイ最高 !!

企業の方は、働き方改革が叫ばれるこの時代に是非、導入してみてはいかがでしょうか。笑

以上です。


参考:
raspberry pi zeroで温度・湿度・気圧を測定する
curlで「Couldn't resolve host」エラーが出た場合の対処

142
99
5

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
142
99

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?