本文譯自樹莓派雜誌 114 期(MagPi issue 114),原文標題為 Make a plant monitor(圖片來源取自雜誌內頁),相關原始程式碼可參考官方程式碼。本篇與原文同樣使用 CC 3.0 BY-NC-SA 授權,歡迎標註原作者轉載,若有任何不妥與指教敬請告知。
一、前言
「樹莓派感測器實作」系列中我們將會探索一些常見的感測器,並製作出可執行的專案。在前面的樹莓派感測器實作中,我們製作了幾個警報系統,關於火焰與瓦斯的安全性,以及偵測入侵者,另外還有簡易的氣象站。
在簡易氣象站實作中,我們使用類比數位轉換器(ADC)讀取紫外線感測器輸出的類比訊號。這次我們將要使用類比數位轉換器(ADC)去檢測盆栽中的濕度感測器,另外加入水位感測器去檢測蓄水盤中的水位。
如果土壤或蓄水盤呈現乾燥狀態,監測器會發送警示訊息告訴我們應該要幫植物澆水,以保持其健康生長,如下圖所示:
二、所需設備
1. 濕度感測器 x1
2. 水位感測器 x1
3. MCP3008 ADC x1
4. 麵包板 x1
5. 杜邦線材
三、實作步驟
1. 連接類比數位轉換器(ADC)
由於我們的植物監測器使用濕度與水位感測器,兩種感測器都是輸出類比訊號,因此需要透過類比數位轉換器(ADC, analogue-to-digital converter)來將數值轉換成數位訊號讀取,我們與上一次一樣選用 MCP3008 類比數位轉換器,它有 8 個輸入通道。
因為類比數位轉換器(ADC)使用 SPI 介面,所以我們需要透過 Raspberry Pi 樹莓派配置工具啟用 SPI,因此我們使用支援完整 SPI 的 Pythhon 3,打開電腦終端機視窗,並輸入以下指令:
sudo apt-get install python3-spidev
首先關閉 Raspberry Pi 樹莓派的電源,準備連接 MCP3008 類比數位轉換器,也許在上一篇的實作(三)中,你已經設定完成。將 MCP3008 放置在麵包板中間,連接到開發板如圖 1 所示:
接線請參照下表:
Raspberry Pi 樹莓派 | MCP3008 |
IO8 | CEo |
IO10 | MOSI |
IO9 | MISO |
IO11 | SCLK |
小提醒
請務必確認所有腳位連接正確,否則將有無法正常運作的可能性,更有可能損壞 ADC 類比數位轉換器 Raspberry Pi 樹莓派。
2. 連接濕度感測器
前面已經正確將類比數位轉換器(ADC)連接至 Raspberry Pi 樹莓派了,現在可以設置濕度感測器,將濕度感測器連接到開發板如圖 1 所示,接線請參照下表:
Raspberry Pi 樹莓派 | 濕度感測器 |
3.3 V | VCC |
GND | GND |
由於我們要將濕度感測器放置在盆栽當中,因此我們使用長的母/母雙頭杜邦線去延長 Raspberry Pi 樹莓派與麵包闆之間的距離。
最後我們要將濕度感測器如圖 1 所示,並依照下表連接到 MCP3008:
濕度感測器 | MCP3008 |
AOUT | 0 |
小提示
濕度感測器可以任意連接到 MCP3008 的 8 個輸入通道,本實作使用第 0 個輸入通道。
3. 濕度感測器測試
現在我們就來建立一個程式「moisture_test.py」來測試濕度感測器吧!
第 1~3 行:我們使用 GPIO Zero 程式庫,方便使用 MCP3008 類別,並指定 moisture 為 MCP3008(0) 去讀取感測器的類比輸出訊號。
第 5~6 行:設定一個迴圈 while True: ,將感測器輸出的值(範圍為 0~1)乘上 3300 毫伏(mV)最大電壓以獲得準確的數值。在 print 顯示參數的格式設定為 %-3.2f,至少三位數字,包括兩位小數,當然也可依照自己的喜好設定,最後加入 end = “\r”,讓每次顯示文字都會出現在同一行。
如果濕度感測器尚未被放置在任何物品中,那麼它讀取到的數值會非常的低(本實作為 1.61 mV)。現在用手握住感測器,將會看到數值會上升到約 200 mV,甚至更高(就看各位的手夠不夠潮濕囉~)。
濕度感測器透過兩個金屬插腳作為導體,讓電流互相流通,當電阻尼越大,導電性就越高,因此我們可以利用此特性將感測器放置於植物盆栽的土壤中,檢測土壤的濕度。
如果將手弄濕後再握住感測器,那麼應該會看到讀取到的數值會上升超過 800 mV。但是切記使用時不要弄濕任何電子產品喔!
4. 將濕度感測器放入盆栽中
現在既然我們已經了解濕度感測器的特性,並能夠正常運作了,那麼就可以將感測器置入植物的盆栽中囉!
我們將感測器放入乾燥的土壤中作為參考值,依據此數值我們可以設定一個當土壤太乾燥時,會自動發送警示通知我們該為盆栽澆水。
現在再測試一次程式「moisture_test.py」,當土壤乾燥時感測器會讀取到低於 100 mV 的數值;但是當我們為盆栽澆水時,就會上升超過 1400 mV。
5. 水位感測器測試
如果你的盆栽放置在一個蓄水盤中,那麼就可以增加一個水位感測器來檢測水位,這是一個自由選擇的步驟,也許看起來有點多此一舉,因為其實有濕度感測器就很足夠了。
水位感測器透過金屬條為導體,當水位越高,那麼輸出的電流就會越大,電流輸出範圍值:0 V ~ 1.88 V,對應水位:0 cm ~ 4.8 cm。因此我們可以透過此特性設定當水位接近 0 cm 時發送警示。
現在就將水位感測器如圖 1 所示,並依照下表連接到 MCP3008:
水位感測器 | MCP3008 |
AOUT | 1 |
接線完成後就可以測試「liquid_test.py」程式,並將感測器沉浸在不同的水位中觀察電流的變化。
小提醒
使用時不要弄濕任何電子產品或是 Raspberry Pi 樹莓派喔!
6. 設定警示通知
我們要設計一個當兩個感測器偵測到濕度或水位到達我們設定的數值時,會自動觸發傳送警示通知。
在之前的實作文章(一)、(二)中,當警報被觸發時,我們會聽到蜂鳴器的警報聲。這次我們要更進一步設計一個可以發送警示訊息到我們的手機或電腦的程式。
為了達到這個目的,我們要使用提供免費服務層的 Pushbullet。首先,要先到 Pushbullet 網站上註冊一個帳號,並且取得點擊「Create Access Token」,將會獲取到一串 API,記得把它複製起來,待會會需要將它加入程式中喔!
使用 Pushbullet 我們需要安裝 Python 3 程式庫,當你的 Raspberry Pi 樹莓派安裝完成後,請開啟終端機視窗輸入指令:
sudo pip3 install pushbullet.py
7. 撰寫植物監測器程式
現在我們就來建立我們最後的程式「plant_monitor.py」來測試植物監測器吧!
第 5 行:我們使用 pushbullet 程式庫,並授權 pb 讀取我們的 Pushbullet 帳號(請將前面複製的 API 填入「 Your Access Token」中)。
第 6 行:為已經連接的 Pushbullet ,並且要接收通知的裝置設定一個名稱,裝置名稱可以在 Pushbullet 網站上找到,或是使用 print(pb.devices) 行,如第 5 行所設定的。
第 12 ~ 15 行:設定 alert 警示通知,其中 device 可以設定多個想要接收通知的裝置。並且發送「Plant monitor alert:」,加上依據第 17 ~ 27 行 while True: 迴圈條件顯示的 message 文字串。最後加入 60 秒的 sleep(當然也可以更長),這樣才不會一次發送多個通知。
第 17 ~ 27 行:在 while True: 迴圈中,我們將濕度與水位(以 mV 為單位)分別設置閾值 500 和 1000(可根據自己喜好更改),當感測器檢測到低於設定的閾值時,便會觸發相關警示訊息。
四、小結
根據以上的實作步驟,我們完成了植物監測器,如此一來,當植物需要澆水時,就會收到警示通知囉!
如果想要幫植物監測器升級的話,可以建立一個當土壤太乾燥時會自動澆水的系統。自動澆水系統可以透過電磁閥來控制供水裝置的開關或水泵,那麼就需要繼電器擴展板來控制繼電磁閥或水泵,這樣才能讓 Raspberry Pi 樹莓派輸出更高的電壓和電流喔!
這次樹莓派感測器實作就分享到這邊啦!還想看我們分享什麼樣的內容呢?歡迎大家填寫問卷或者寫信建議我們唷!