質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

2回答

3460閲覧

ラズパイで撮影した写真をLINE Notifyに送りたい

oinari03

総合スコア59

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

1クリップ

投稿2020/03/02 06:32

編集2020/03/02 07:32

環境

人感センサ:se-10
raspberrypi zero wh
windows 10
python3
vscode(wsl)

したいこと(説明)

人感センサーで動きを感知→カメラで撮影→その写真をメッセージ付きでLINE Notifyに通知
ってやつを創りたいです。

プログラムが実行されると人感センサに反応してWebカメラが撮影します。
→その後実行されたカレントディレクトリで「日付.jpg」で保存されます。
外部モジュールでfswebcamを利用しています。連続撮影を防止するためにswの値を切り替え、シャッターを切るタイミングを調整しています。

これをLINE Notifyで自分宛に通知したいです。

回路図(写真)

イメージ説明

実際のコード

python

1import RPi.GPIO as GPIO 2from time import sleep 3from datetime import datetime 4import subprocess 5import requests 6 7# line set 8url = "https://notify-api.line.me/api/notify" 9access_token = 'アクセストークン' 10 11 12 13# gpio set 14SENSOR_PORT = 23 15LED_PORT = 4 16 17GPIO.setmode(GPIO.BCM) 18GPIO.setup(SENSOR_PORT, GPIO.IN) 19GPIO.setup(LED_PORT, GPIO.OUT) 20 21def exec1(cmd): 22 r = subprocess.check_output(cmd, shell=True) 23 return r.decode("utf-8").strip() 24 25#last_post set 26last_post = datetime(2000, 1, 1) # random 27def take_photo(): 28 global last_post 29 now = datetime.now() 30 fname = now.strftime('%Y-%m-%d %H:%M:%S') + ".jpg" 31 exec1("fswebcam "+fname) 32 #line notification 33 # wait 10 minutes 34 sec = (now - last_post).seconds 35 if sec < (10*60): return 36 last_post = now 37 message = 'OK' 38 payload = {'message': message} 39 headers = {'Authorization': 'Bearer ' + access_token} 40 files = {'imageFile': open(fname, 'rb')} 41 r = requests.post(url, headers=headers, params=payload, files=files) 42 print(r.text) 43 44 45try: 46 sw = 0 47 while True: 48 v = GPIO.input(SENSOR_PORT) 49 if v == GPIO.HIGH: 50 GPIO.output(LED_PORT, GPIO.HIGH) 51 take_photo() 52 sw = 1 53 else: 54 GPIO.output(LED_PORT, GPIO.LOW) 55 sw = 0 56 sleep(0.1) 57 58except KeyboardInterrupt: 59 pass 60GPIO.cleanup() 61

error文

error

1--- Processing captured image... 2Writing JPEG image to '2020-03-02'. 3Writing JPEG image to '15:04:53.jpg'. 4Traceback (most recent call last): 5 File "camera-pe.py", line 50, in <module> 6 take_photo() 7 File "camera-pe.py", line 39, in take_photo 8 files = {'imageFile': open(fname, 'rb')} 9FileNotFoundError: [Errno 2] No such file or directory: '2020-03-02 15:04:53.jpg

最初に書き込まれたファイルが.jpgじゃないのも変だし。途中から書き込めなくなりそんなファイルはないよとでます。

ましてや、LINE Notifyに通知が行くこともありません。

参考

LINE Notifyとの連携や写真の送信方法は
こちらを参考にしました。

解決してほしいこと

以上のエラー文の解決とLINE Notifyに画像を送信できるようになるようコードレビューをお願いしたいです。

撮影自体は少なからず出来ているのでハード部分は問題ないかと思っています。

経験が浅く至らない点があるかと思いますがアドバイスを下さると光栄です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mistn

2020/03/02 06:48

アクセストークンは他人に見せないようにしてください。 トークンは再発行したほうがいいです。
oinari03

2020/03/02 07:32

ありがとうございます。
guest

回答2

0

自己解決

解決しました。単純に画像が保存されるディレクトリ先を間違えていただけでした。
そのためfnameの前に画像が保存されている場所home/pi/などを追加するだけでした。

そのほかにもご指摘していただいた内容は参考にさせていただきました。

投稿2020/03/02 08:33

oinari03

総合スコア59

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

fswebcamコマンドのパラメータとして渡すファイル名にスペースが入っているため年月日と時間が別々のパラメータとして認識されているんだと思います。

なのでファイル名にスペースが入らないようにしてみてはどうでしょう。

python

1fname = now.strftime('%Y-%m-%d_%H:%M:%S') + ".jpg" 2exec1("fswebcam "+fname)

投稿2020/03/02 07:09

mistn

総合スコア1191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oinari03

2020/03/02 07:59 編集

指摘いただいた通り、アクセストークンを変更し、_を間に入れましした。以下の内容を吐き出しました。画像を保存することに成功はしたものの、LINE Notifyに画像が送信されることはありませんでした。 --- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened. No input was specified, using the first. Adjusting resolution from 384x288 to 352x288. --- Capturing frame... Captured frame in 0.00 seconds. --- Processing captured image... ^CWriting JPEG image to '2020-03-02_16:50:50.jpg'.
mistn

2020/03/02 08:30

print(r.text) の出力もないですか?
oinari03

2020/03/02 09:56

今はこんな感じになっていてLINE-Notifyに送信することは解決しています。 ただ最後の^Cselect: Interrupted system call No frames captured. がきになります。 --- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened. No input was specified, using the first. Adjusting resolution from 384x288 to 352x288. --- Capturing frame... Captured frame in 0.00 seconds. --- Processing captured image... Writing JPEG image to '2020-03-02_18:54:20.jpg'. {"status":200,"message":"ok"} --- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened. No input was specified, using the first. Adjusting resolution from 384x288 to 352x288. --- Capturing frame... Captured frame in 0.00 seconds. --- Processing captured image... Writing JPEG image to '2020-03-02_18:54:25.jpg'. --- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened. No input was specified, using the first. Adjusting resolution from 384x288 to 352x288. --- Capturing frame... ^Cselect: Interrupted system call No frames captured.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問