緣起:
在我學會 LINE Notify
後,我一直想著要用微電腦來拍我家狗狗的照片,並將照片 POST 到 LINE Notify
上,這樣就算之後不在家,我還是能定時在 LINE 上看到薯泥的圖片。我一開始是用
Ameba 來做,不過這樣就要直接寫 POST 的完整格式,那東西真的搞了我很久,POST
的格式只要有個小錯,伺服器就不接受,而且我也不知道錯在哪,只能慢慢試,更煩的是,每次改程式碼後都要重新上傳,它又得花
30
多秒來上傳,整個過程就很惱人,都要等一小段時間才能知道結果。其實,就算我解決了上述的問題,我之後還有圖片的問題,我不知道要怎麼在
Ameba 上讀取拍到的圖片、把它弄進 POST 的 Body 裡。
所以最後放棄,改用 Raspberry pi ,用 Python 來開發,整個快很多,不用再去理 POST 的原生格式,快樂得不得了。我兩個禮拜前有把東西弄出來,不過那時候不小心弄壞,導致它開機後,我沒辦法登入,而且也沒把攝影機的曝光弄好,很多圖片拍出來都過亮。上個禮拜,我有把整個系統重灌,並重新寫了程式,經過兩個多小時的測試與修改後,終於把這個專案給完成了,不過那時沒有空紀錄,所以今天就來記錄我在做這專題時踩的雷。
專案連結
時間:
我的程式想要每次跑的時候都先確認現在的時間,這樣才能固定時間拍一張照
(雖然好像直接用 time.sleep 也行),但是 Raspberry pi
斷電後就沒辦法再繼續記錄本地的時間了,所以我就去找了 python 的 ntplib
來用,想用網路時間協定來同步本地的時間,只是我發現,每次抓回來的時間都是錯的,很奇怪,但是如果程式在我筆電上跑的話,得到的時間就是正確的....,哦~~
可能是時區設定的問題。
在 terminal 打 sudo raspi-config,進入設定的畫面,選擇
"Internationalisation Options" > "Change Timezone",然後找到 "Taipei",選擇它。我發現,完成設定後,Raspberry
pi 的時間就正確了,看來只要你有連上網路,它就會自動用 ntp
來校準時間,所以我也不用再用 ntplib 去對時間了,直接用 datetime.now
就行。
自動執行:
為了能在開機的時候自動執行我的 python
程式,所以我要額外寫一個 shell script 的程式,然後在 /etc/rc.local
檔案裡,加入那個 shell script 的路徑 (要放在 exit 0 那一行之前)。
我那個 sh 檔只有短短的兩行,長下面這樣。
#!/bin/bash sudo -u pi python /home/pi/Desktop/Ahni_Observation/main.py &
從 rc.local 開機自動啟動程式時,它預設是用 root
來執行的,然後我們一般在用 pip install 時,那些套件預設是裝在 pi
下的,所以 root 在 執行 python 程式時,python
會報說找不到那些套件,所以,才會在指令前再多加個 sudo -u pi ,指定要以
pi 的身份來運行,這樣就 OK 了,資料是從這篇文章看來的。
LINE Notify:
傳送圖片的部份是從這邊看來的,實做上基本沒什麼問題,就我家的網路慢,上傳個 1280 x 720
的圖片都要一分鐘。哦對,那個 LINE Notify 是一定要有 message
的,不能只有送圖片,所以我 message 部份就給它送了一個空白鍵。
Fswebcam:
我買的網路攝影機不需裝驅動程式,支援 Windows 與
Linux,所以插上 Raspberry pi
之後就能直接使用。我一開是直接使用這個指令來拍照
fswebcam -r 1280x720 --no-banner ./ahni.jpg
只要輸入指令,它就會自己去抓攝影裝置,那個 -r
是設定解析度,那台羅技的最高支援到 1280x720。fswebcam
預設拍出的圖片會有邊框,所以加上 --no-banner
來移除,最後是將圖片存在當前資料夾,存成 ahni.jpg。
圖片是能拍了,但是只要太陽大了點,拍出來的圖片都嚴重的曝光,導致一片白,很難看到東西,我那時還想說,是不是要換個網路攝影機
?
我把攝影機裝到筆電上,試著在大太陽下錄影,畫面很正常,它能自動調整曝光,所以可能是我
Raspberry pi 上的指令有問題,我後來去尋找 fswebcam
設定攝影機曝光的方法,最後找到這篇文章,將指令改成
fswebcam -D 2 -S 20 -r 1280x720 --no-banner ./ahni.jpg
那個 -D 2 是啟動後等待兩秒,-S 20 是跳過前 20 幀,讓攝影機有時間能調整自己的曝光時間那些的,這樣拍出來的圖片就正常了。
沒有留言:
張貼留言