概要
ポストに郵便物が届いたら、ケータイに通知が届くIoTシステムを考えました。材料
・3軸加速度(ジャイロ)センサモジュール KXR94-2050 ・Raspberry Pi Model 3B ・ジャンパーケーブル ・ブレッドボード ・Arduino ・USBケーブル ・電源など、他大まかな概要図
次のような流れで、作っていきます。 ![iotポスト概要図.png](https://qiita-image-store.s3.amazonaws.com/0/252280/bcdaf7a9-ee96-ff50-5329-befb9b9bc7b9.png)接続
このようにブレッドボードとラズパイ、Arduinoを接続しました! ![無題のプレゼンテーション (2).png](https://qiita-image-store.s3.amazonaws.com/0/252280/dc665f2c-f5f0-3d27-bfcf-c7817e36d596.png)仕様書を見ながらジャイロセンサーをArduinoに接続し、ArduinoはUSBでラズパイに接続しています。
IoTポストの仕組み
ポストの開閉部分にジャイロセンサをつけ、ポスト開口部の「開閉動作があった時に動く方向軸」の角度が変わったらものが届いたという判断をします。開口部が動く方向軸以外の動きは必要ない情報なので、取得していません。Arduinoとジャイロセンサーで傾きの値を取得し、USBシリアル通信でラズパイのPythonへデータを送ります。Pythonでは、得た傾きの値を元に、ポストに動きがあったかどうかを検知しています。
動画
ジャイロセンサーを利用した、IoTポストの動画です!https://t.co/0SeMlgThnN
— 高町咲衣⭐︎(さき) (@takamachi1saki) 2018年12月11日
ソースコード
Arduinoスケッチ
#include <SoftwareSerial.h>
void setup() {
Serial.begin(9600);
}
void loop() {
long x;
x = 0 ;
x = analogRead(A3) ;
Serial.print(x);
delay(200);
}
Python
import serial
import time
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
FROM_ADDRESS = '通知を出すメールアドレス(Gmail)'
MY_PASSWORD = 'パスワード(Gmailのパスワード)'
TO_ADDRESS = '通知を受けるメールアドレス'
BCC = ''
SUBJECT = 'POST!'
BODY = 'Got a Post!!'
def main():
i = 0
x_a = 0
x_dif = 0
con = serial.Serial('/dev/ttyACM0', 9600)
#ラズパイで、コマンド「dmesg」でデバイスファイルの名前を調べましょう。
#Arduino UNOならこのままでいいです。
time.sleep(2)
print con.portstr
while 1:
str=con.read(3)
x = str.decode()
if(x > x_a):
x_dif = int(x) - int(x_a)
else:
x_dif = int(x_a) - int(x)
if(x_dif > 100):
if(i != 0):
print("POST")
to_addr = TO_ADDRESS
subject = SUBJECT
body = BODY
msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body)
send(FROM_ADDRESS, to_addr, msg)
flg = True
time.sleep(30)
else:
i = 1
x_a = x
def create_message(from_addr, to_addr, bcc_addrs, subject, body):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = from_addr
msg['To'] = to_addr
msg['Bcc'] = bcc_addrs
msg['Date'] = formatdate()
return msg
def send(from_addr, to_addrs, msg):
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.ehlo()
smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
smtpobj.close()
if __name__ == '__main__':
main()