ov150’s diary

言語理解凹処理速度凸のレアケース アラフォーで初めて発達障害わかったよね

センサー検出でメールを送信するプログラム(picamera2用に修正)

前回から引き続き、ラズパイのゼロパイWと、カメラモジュール(v.1)を繋いで遊んでいます。
Gmailから送信もできると思いますが、googleの2段階認証をオンにしていないとSMTP送信が使えないので…。
ということでYahooメールを使った一例をメモとして。

また、picameraがpicamera2になったので、少しいじりました。
具体的には、

  • 2行目picamera→picamera2に
  • ゼロパイだと(?)プレビューをオフにしないとエラーが出て止まってしまうのでPreviewもimport。
  • picam2.capture_file(filename,format='jpeg') 赤字を追加。

ファイル操作とかが苦手でよくわからないけど、とりあえず動くのでヨシ。

事前準備として「sudo apt install -y python3-picamera2」で、picamera2を追加しました。
"picamera2のgithub"

その他のlegacy cameraがうんぬんは、前回までの苦戦がひょっとしたら参考になるかもしれません。
↓苦戦の末つながった記念のエントリー
ov150.hatenablog.com

材料

  1. raspberry pi zeroW
  2. camera module(v.1 ov5647)
  3. センサー(HC SR501)
  4. ジャンパーケーブル
  5. yahooのアカウント

注意

ラズパイ用カメラモジュールは、zero系に接続するにはzero系用のカメラケーブルが別途必要。
センサーは5V用のものしかもっていないけれど、ほかのマイコンは3Vのものもあるので、新規に買うなら3Vのものがいいのかも。

プログラム(Python)

要約すると、

  1. 人体赤外線感応モジュール(モーションセンサー)でヒト他の動きを検知
  2. カメラで撮影
  3. メールにカメラ画像を添付
  4. SMTPメール送信

をします。

v1のカメラモジュールを使っているからか、いろんなエラーぽいものが出まくりますが、気にしないことにしています。

以下、コード。

import RPi.GPIO as GPIO
from picamera2 import Picamera2,Preview
import os
import time
import datetime
import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.utils import formatdate
from email.mime.multipart import MIMEMultipart
from os.path import basename

GPIO_PIN = 18              #GPIO18にセンサーを付けた
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN,GPIO.IN)
picam2=Picamera2()

config=picam2.create_preview_configuration()
picam2.configure(config)
picam2.start_preview(Preview.NULL)   #zeroWだとプレビューが出ずエラーが出るため
picam2.start()

subject = '[Detected!!]'          #適当に件名を
sender_email = "*****@yahoo.co.jp"     #*****にはアカウントを
receiver_email = "*****@*****"        #送信先のアドレスを
password = input()                   #パスワードは最初に入力する設定にした

def send_test_mail(body):         #body(本文)
    msg = MIMEMultipart()
    msg['Subject'] = subject
    msg['From'] = sender_email
    msg['To'] = receiver_email
    msg['Date'] = formatdate(localtime=True)

    msgText = MIMEText(body)
    msg.attach(msgText)
    
    with open(filename,'rb') as f:
        img = MIMEImage(f.read())
        img['Content-Disposition'] = 'attachment; filename="%s"' %basename(filename)
    msg.attach(img)
    
    with smtplib.SMTP_SSL("smtp.mail.yahoo.co.jp", 465) as smtp:    #yahoo.co.jpの場合
        smtp.login(sender_email, password)
        smtp.sendmail(sender_email, receiver_email, msg.as_string())

while True:
    if(GPIO.input(GPIO_PIN) == GPIO.HIGH):        #センサーがONになったら1を出力してメールを送る
        print("1")
        dt_now = datetime.datetime.now()
        filename = dt_now.strftime('%m%d %H:%M:%S')
        picam2.capture_file(filename, format='jpeg')
        send_test_mail("Detected!")          #本文(body)はDetected!  にしてみた    
        print(filename) 
        time.sleep( 5 )                #5秒ごとに検出
    else:
        print("0")                                #センサーがOFFのときは(3秒ごとに)ずっと0を出力
        time.sleep( 3 )