はじめに
クリスマスワンナイトハッカソン チーム わくと です。
サンタがドアを開けた時間を記録し、メールで送信する装置を作りました。
デモ
# 仕組み サンタが部屋に入ってきたら通知が来るやつ作った pic.twitter.com/KDgaKq4PXD
— わくと (@otukaw) December 24, 2019
ドアが開いたら近接センサで検知してPythonに送っています
コード
Xmass.ino
void setup() {
Serial.begin(9600);
// センサ
pinMode(10, INPUT);
// ブザー
pinMode(11, OUTPUT);
// 申し訳程度のイルミネーション
pinMode(12, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
}
// ドアあいた : '1'
// ドア閉まった: '0'
bool state = true;
bool prev_state = true;
unsigned long t;
unsigned long prev_t = millis();
void loop() {
t = millis();
if(t - prev_t >= 10) {
if(!digitalRead(10)) {
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
state = true;
} else {
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
state = false;
}
prev_t = t;
}
if(prev_state != state) {
if(state) {
Serial.write('1');
} else {
Serial.write('0');
}
}
prev_state = state;
}
sendMail.py
import sys
sys.path.append('C:\\Users\\ユーザー名\\Appdata\\local\\programs\\python\\python37\\lib\\site-packages')
import datetime
import serial
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
from email.header import Header
import ssl
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
FROM_ADDRESS = '自分のGmailアドレス'
MY_NAME = '表示名'
MY_PASSWORD = '自分Gmailのパスワード'
TO_ADDRESS = '送信先アドレス'
BCC = ''
SUBJECT = '件名'
BODY = ''
jp = 'iso-2022-jp'
def create_message(from_addr, to_addr, bcc_addrs, subject, body):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = '%s <%s>'%(Header(MY_NAME.encode(jp),jp).encode(), FROM_ADDRESS)
msg['To'] = to_addr
msg['Bcc'] = bcc_addrs
msg['Date'] = formatdate()
return msg
def send(from_addr, to_addrs, msg):
smtpobj = smtplib.SMTP_SSL('smtp.gmail.com', 465, timeout=10)
smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
smtpobj.close()
def mail():
print(BODY)
to_addr = TO_ADDRESS
subject = SUBJECT
body = BODY
msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body)
send(FROM_ADDRESS, to_addr, msg)
ser = serial.Serial('COM6', 9600, timeout=0)
while(True):
now = datetime.datetime.now()
c = ser.read()
if(c == b'1'):
BODY += str(now.year) + '年' + str(now.month) + '月' + str(now.day) + '日' + str(now.hour) + '時' + str(now.minute) + '分' + str(now.second) + '秒\n'
print(BODY)
if(now.second == 0):
mail()
BODY = ''
個人的ハマリポイント
- pipでインストールしたものにpathが通っていなかったためシリアル通信が使えず…
→sendMail.pyの二行目の記述で解決(自分の環境の場合)
感想
一晩って意外と短い…
結局サンタは見られませんでした。
参考サイト
https://qiita.com/nakasuke_/items/607cf74d8841f76e59c6
https://qiita.com/kosystem/items/0023cfee941fdf099087