【ホームセキュリティ】ラズパイで人感センサ式の監視カメラを作成する

2024/02/23

Discord HC-SR501 IoT ラズパイ

  • B!
サムネ
サムネ

今回は人感センサ「HC-SR501」を使用して監視カメラを作っていきます。

今回使用するもの

  • RaspberryPi
  • HC-SR501
  • ジャンプワイヤ
  • DiscordWebhook URL
  • GoogleDrive API

実現したい動き

  1. HC-SR501が人体を検知する
  2. WEBカメラで画像を撮影する
  3.  
  4. 撮影した画像に日時透かしを入れる
  5. 編集した画像をGoogleDriveにアップロード
  6. Discordに画像のURLを送信する

ラズパイのディレクトリ構成

  1. /home/pi/Desktop/Detect_Camera/
  2. |_____Data
  3. | |_____yyyy_mm_dd_H_M_S.jpg (アップロード用の画像)
  4. |_____Sample.py (今回作成するプログラム)
  5. |_____detect.jpg (編集前の画像)
  6. |_____credentials.json
  7. |_____client_secret.json
  8. |_____settings.yaml

サンプルコード

  1. import cv2
  2. from PIL import Image, ImageDraw, ImageFont
  3. import datetime
  4. from pydrive2.auth import GoogleAuth
  5. from pydrive2.drive import GoogleDrive
  6. import requests, json
  7. import time
  8. import RPi.GPIO as GPIO
  9.  
  10. SENSOR_GPIO = 14
  11. GPIO.setmode(GPIO.BCM)
  12. GPIO.setup(SENSOR_GPIO, GPIO.IN)
  13.  
  14. def upload():
  15. gauth = GoogleAuth()
  16. gauth.LocalWebserverAuth()
  17. drive = GoogleDrive(gauth)
  18. folder_id = 'GoogleDriveのフォルダID'
  19. file_path = 'Data/' + dt_name
  20. file = drive.CreateFile({'title': dt_name, 'parents': [{'id': folder_id}]})
  21. file.SetContentFile(file_path)
  22. file.Upload()
  23. img_url = '<https://drive.google.com/uc?id=' + str(file['id'] + '>')
  24.  
  25. webhook_url = 'DiscordWebhook URL'
  26. main_content = {'content': '[Motion Detected]\n' + str(dt_txt) + '\n' + img_url,
  27. 'username': 'Attention'}
  28. headers = {'Content-Type': 'application/json'}
  29. response = requests.post(webhook_url, json.dumps(main_content), headers=headers)
  30.  
  31. print('Uploaded', img_url)
  32.  
  33. f_name = 'detect.jpg'
  34. font_path = "/usr/share/fonts/truetype/ipafont-nonfree-uigothic/ipagui.ttf"
  35. try:
  36. while True:
  37. status = GPIO.input(SENSOR_GPIO)
  38. if (status == GPIO.HIGH):
  39. #print('detect')
  40. #撮影
  41. capture = cv2.VideoCapture(0)
  42. ret, frame = capture.read()
  43. cv2.imwrite(f_name, frame)
  44. capture.release()
  45. im = Image.open(f_name)
  46. font = ImageFont.truetype(font_path, 20)
  47. draw = ImageDraw.Draw(im)
  48. dt_name = str(datetime.datetime.now().strftime('%Y_%m_%d_%H_%M_%S') + '.jpg')
  49. #画像の上部に日付の透かしを入れる
  50. dt_txt = str(datetime.datetime.now().replace(microsecond=0))
  51. draw.multiline_text((10,10), dt_txt, font=font, fill=(255, 255, 255, 255), stroke_width=2,stroke_fill=(0, 0, 0, 255))
  52. im.save('Data/' + dt_name)
  53. upload()
  54. cv2.destroyAllWindows()
  55. im.close()
  56. time.sleep(1)
  57. else:
  58. time.sleep(1)
  59.  
  60. except KeyboardInterrupt:
  61. print("Cleanup")
  62. GPIO.cleanup()

実行結果

人が検知されると画像が撮影されてGoogleDriveにアップロードされます。

次にDiscordに画像が撮影されたという通知とともにアップロードした画像のURLが送られてきます。

URLをタップするとGoogleDriveの画像に直接アクセスできます。

画像の保存も可能です。

画像の保存

まとめ

今回はsleep時間を1秒にしていますが「画像の撮影」と「アップロード」に時間がかかってしまい、撮影してから再撮影できるまで1秒以上かかってしまいます。

RaspberryPi4(8GB)を使ってもラグが出るのでRaspberryPi Zeroを使って低消費電力化するともっとラグが出ると思われます。

GoogleDriveにアップロードするときに認証する時間がかかっているので画像を直接Discordに送信するようにするとラグは減少すると考えられます。

しかし、複数回画像が撮影された場合、通知とチャンネルの中が埋め尽くされてしまいます。

撮影した画像を別のラズパイに送信して、そのラズパイがGoogleDriveにアップロードするようにするといいかもしれません。

Writer

アイコン
Python×Raspi IoTシステム・Bot・ラズパイの記録
  • プログラミング
  • IoT
  • Python
\FOLLOW ME/ 𝕏

Ranking

blogmura_pvcount

Community

Search