認識感測器
-
待完成
-
電容式土壤水份感測器
在樹莓派上使用電容式土壤水份感測器這裡有個小挑戰:樹莓派的 GPIO 只能讀取數位訊號(0 或 1),但這款感測器輸出的是類比訊號(Analog Signal)。所以,我們需要一個「翻譯官」—MCP3008 類比數位轉換晶片 (ADC)。

圖片來源:臺灣樹莓派 接線圖 (Wiring)
[A] 感測器連接到 MCP3008:

[B] MCP3008 連接到樹莓派 (SPI 介面):


圖片來源:臺灣樹莓派 樹莓派設定
2. 系統設定在寫程式前,請確保樹莓派的 SPI 介面已開啟:輸入 sudo raspi-config。選擇 Interface Options → SPI → Yes。重啟樹莓派。
Python程式碼
from gpiozero import MCP3008 import time # 初始化感測器,連接在 MCP3008 的第 0 個頻道 (CH0) # 建議將 VREF 接在 3.3V 以獲得較準確的數值 soil_sensor = MCP3008(channel=0) print("--- 土壤濕度監測監測中 (按 Ctrl+C 停止) ---") try: while True: # soil_sensor.value 會回傳 0.0 到 1.0 之間的數值 # 注意:電容式感測器通常是「愈乾電壓愈高,愈濕電壓愈低」 # 所以我們用 (1 - 數值) 來轉換成直覺的濕度感 raw_val = soil_sensor.value moisture = (1 - raw_val) * 100 print(f"目前原始數值: {raw_val:.3f} | 推估濕度: {moisture:.1f}%") time.sleep(2) except KeyboardInterrupt: print("\n監測結束。") -
人體紅外線感測器(HC-SR501)
使用 PIR(被動式紅外線)感測器是最簡易的人體感測方案。這個感測器不需要發射任何波,單純是靠偵測物體移動引起的「紅外線熱量變化」來觸發。最常見的型號是 HC-SR501,便宜又好用。
接線說明
HC-SR501 通常有三個接腳,請翻到背面查看標示(通常從左到右為 VCC、OUT、GND):

程式碼
from gpiozero import MotionSensor from signal import pause # 定義感測器連接在 GPIO 17 pir = MotionSensor(17) def motion_detected(): print("喔!有人在那裡!") def motion_stopped(): print("警報解除,沒人了。") # 指定觸發時的動作 pir.when_motion = motion_detected pir.when_no_motion = motion_stopped print("感測器初始化中... (請等待約 10-60 秒穩定)") pause()3. 硬體校準(非常重要!)
如果你發現感測器「一直亂報」或「反應遲鈍」,請調整感測器側邊的兩個黃色可變電阻:
靈敏度 (Sensitivity): 順時針轉動會增加偵測距離(最高可達約 7 公尺)。
延遲時間 (Time Delay): 偵測到移動後,訊號維持「高電位」的時間。初次測試建議逆時針轉到底(最短時間約 5 秒),這樣反應最即時。
小撇步: PIR 感測器啟動後需要約 30 到 60 秒的「預熱期」來適應環境背景溫度,這段期間出現誤報是正常的,別以為它壞掉囉!
-
攝影鏡頭與定時攝影
1. 硬體準備與連線
確保你的攝像頭(Camera Module)已正確插入樹莓派的 CSI 介面。以下教學將採用最通用的 subprocess 呼叫方式。
2.程式碼
這個程式的功能是:執行時會以「日期時間」為檔名拍攝一張照片,並儲存在指定資料夾。
import picamera import time from datetime import datetime import os # 1. 設定儲存路徑 save_dir = "/home/pi/Desktop/Pictures/timelapse" if not os.path.exists(save_dir): os.makedirs(save_dir) # 2. 產生檔名 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") file_path = f"{save_dir}/{timestamp}.jpg" # 3. 執行拍照 # 使用 'with' 語句可以確保程式結束後自動關閉相機資源,避免佔用 with picamera.PiCamera() as camera: # 這裡可以根據需求調整解析度 (例如 1920x1080) camera.resolution = (1920, 1080) # 給相機一點時間調整白平衡與曝光 (建議至少 2 秒) print("相機預熱中...") time.sleep(2) # 拍照並儲存 camera.capture(file_path) print(f"照片已儲存至: {file_path}")import subprocess from datetime import datetime import os # 設定照片儲存路徑 (請確保資料夾已存在) save_dir = "/home/pi/Desktop/Pictures/timelapse" if not os.path.exists(save_dir): os.makedirs(save_dir) # 產生檔名 (例如: 20231027_143005.jpg) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") file_path = f"{save_dir}/{timestamp}.jpg" # 執行拍照指令 (使用 libcamera-jpeg) # --nopreview: 不顯示預覽畫面 # -o: 輸出檔案路徑 try: subprocess.run(["libcamera-jpeg", "--nopreview", "-o", file_path], check=True) print(f"照片已儲存至: {file_path}") except Exception as e: print(f"拍照失敗: {e}")3. 系統設定:定時執行 (Crontab)
在 Linux 系統中,我們使用 cron 工具來管理定時任務。這不需要一直執行 Python 程式,系統會自動在指定時間喚醒程式。(1)在終端機輸入指令進入排程編輯器:
crontab -e(第一次進入時,建議選 1. /bin/nano)
(2)在檔案的最下方加入你的定時排程。例如,如果你想每 10 分鐘拍一張照:
*/10 * * * * /usr/bin/python3 /home/pi/Desktop/take_photo.pyCrontab 語法解析:
*/10:每 10 分鐘執行一次。
三個 * 分別代表:小時、日、月、星期。
最後接的是執行指令的路徑(建議使用絕對路徑)。
常見範例:
0 * * * *:每小時整點拍一張。
0 8-18 * * *:每天早上 8 點到下午 6 點,每小時拍一張。
*/1 * * * *:每一分鐘拍一張。
儲存並退出(Nano 編輯器請按 Ctrl+O 儲存,Ctrl+X 離開)。
4.將照片合成影片
當你累積了幾百張照片後,可以使用
ffmpeg將它們合成一段縮時影片:ffmpeg -pattern_type glob -i '/home/pi/Desktop/Pictures/timelapse/*.jpg' -c:v libx264 -pix_fmt yuv420p output.mp4溫馨提示
儲存空間: 定時攝影會消耗大量空間,請定期檢查 SD 卡剩餘容量。權限問題: 如果程式無法執行,請確保資料夾權限正確,或在 crontab 中確認路徑無誤。
vcgencmd get_camerasudo apt-get update sudo apt-get install python3-picamera - 土壤濕度感測器 SHT10
-
電容式土壤水份感測器