LoginSignup
2
0

More than 3 years have passed since last update.

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

Posted at

はじめに

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

デモ

仕組み

構成図.png

ドアが開いたら近接センサで検知して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

2
0
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
2
0