サンタが来た時間を通知してくれる装置つくった

#はじめに
クリスマスワンナイトハッカソン チーム わくと です。
サンタがドアを開けた時間を記録し、メールで送信する装置を作りました。

#デモ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">サンタが部屋に入ってきたら通知が来るやつ作った <a href="https://t.co/KDgaKq4PXD">pic.twitter.com/KDgaKq4PXD</a></p>&mdash; わくと (@otukaw) <a href="https://twitter.com/otukaw/status/1209569266896265217?ref_src=twsrc%5Etfw">December 24, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
#仕組み
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265415/0a6e1750-fad8-4111-98ef-e40d6bf683aa.png)

ドアが開いたら近接センサで検知してPythonに送っています

#コード
```c++: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;
}
```


```python: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