搜尋此網誌

2022年5月6日 星期五

Raspberry pi 薯泥監視器

緣起:


    在我學會 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 幀,讓攝影機有時間能調整自己的曝光時間那些的,這樣拍出來的圖片就正常了。

拍出來的結果

沒有留言:

張貼留言