本文譯自樹莓派雜誌 113 期(MagPi issue 113),原文標題為 Build a simple weather station(圖片來源取自雜誌內頁),相關原始程式碼可參考官方程式碼。本篇與原文同樣使用 CC 3.0 BY-NC-SA 授權,歡迎標註原作者轉載,若有任何不妥與指教敬請告知。
一、前言
「樹莓派感測器實作」系列實作,我們已經製作了火焰與瓦斯洩漏警報系統,以及入侵者警報器。這次要使用感測器來量測溫度、相對濕度、紫外線等天氣條件。
因為這次實作有感測器使用類比輸出,正好可以學習如何使用類比數位轉換器(ADC)將類比轉換為數位訊號。
二、所需設備
1. DHT11 溫濕度感測器 x1
2. 紫外線感測器 x1
3. MCP3008 ADC x1
4. 麵包板 x1
5. 杜邦線材
三、實作步驟
1. 連接 DHT11 溫濕度感測器
DHT11 溫濕度感測器可以用來量測溫度和相對溼度,當然也能升級使用 DHT22 或是 BME280(可量測氣壓)。
DHT11 溫濕度感測器結合熱敏電阻與電容式濕度感測器,輸出數位訊號,使用上相當容易。
首先,關閉 Raspberry Pi 樹莓派的電源,將 DHT11 溫濕度感測器連接到開發板,如下圖表所示:
Raspberry Pi 樹莓派 | DHT11 溫濕度感測器 |
3.3 V | VCC |
GND | GND |
IO14 | DO |
2. 安裝 DHT11 溫濕度感測器程式庫
當連接好 DHT11 溫濕度感測器後,開啟 Raspberry Pi 樹莓派的電源,若是連接正確將會看到感測器亮起紅燈。
因為 DHT11 輸出二進制數值到樹莓派的 IO14 腳位,因此我們需要將其轉換成十二進制的數值。最簡單的方式,就是直接使用現成的 Python 程式庫,我們這次使用的是szazo’s DHT11 程式庫,在終端機視窗輸入以下指令便可以安裝:
pip3 install dht11
3. 溫度與溼度測試
首先,我們要撰寫一個 Python 程式「dht11_test.py」,用來讀取感測器溫濕度的輸出。從電腦桌面的選單中,打開 Thonny IDE 軟體平台,開始撰寫程式。
第 1~7 行:由於 DHT11 程式庫是使用 RPi.GPIO Python 程式庫,因此我們要在一開始導入 RPi.GPIO 並設為 GPIO,接著初始化 GPIO 進行標準清理以將所有引腳重置為輸入。
第 9~13 行:設定一個迴圈 while True: ,讀取 GPIO14 的數值。如果結果為有效值(例如非錯誤),將顯示溫度與濕度的數值在 Thonny Shell 顯示窗。顯示訊息的格式為 %-3.1f,代表每個參數輸出為至少三位數字,並包括一位小數。最後我們加入了 end = “\r” ,如此一來每次顯示文字就都會出現在同一行。
開始執行 dht11_test.py 程式,可以嘗試在感測器旁呼氣,檢查溫度與濕度是否有正常運作讀取數值。
4. 連接類比數位轉換器(ADC)
由於紫外線感測器輸出為類比訊號,所以我們要利用類比數位轉換器 MCP3008 (ADC, analogue-to-digital converter)來將數值作轉換讀取,轉換器總共有 8 個輸入通道。
因為 MCP3008 是 SPI 通訊介面,所以我們需要透過 Python 3 在 Raspberry Pi 配置工具啟用 SPI,在終端機視窗輸入以下指令便可安裝:
sudo apt-get install python3-spidev
首先,關閉 Raspberry Pi 樹莓派的電源,將 MCP3008 放置在麵包板中間,連接到開發板如圖 1,接線請參照下表:
Raspberry Pi 樹莓派 | MCP3008 |
IO8 | CEo |
IO10 | MOSI |
IO9 | MISO |
IO11 | SCLK |
5. 連接紫外線感測器
前面已成功連接完類比數位轉換器(ADC)了,接著紫外線感測器連接到開發板如圖 1,接線請參照下表:
Raspberry Pi 樹莓派 | 紫外線感測器 |
3.3 V | VCC |
GND | GND |
再將紫外線感測器依照下表連接到 MCP3008:
紫外線感測器 | MCP3008 |
AOUT | 0 |
小提示
紫外線感測器可以任意連接到 MCP3008 的 8 個輸入通道,本實作使用第 0 個輸入通道。
6. 紫外線測試
現在我們就來建立一個程式「uv_test.py」來測試紫外線感測器吧!
第 1~3 行:這次我們使用 GPIO Zero 程式庫,方便使用的 MCP3008 類別。並指定 uv 為 MCP3008(0) 去讀取感測器的類比輸出訊號。
第 5~6 行:設定一個迴圈 while True: ,將感測器輸出的值(範圍為 0~1)乘上 3.3 最大電壓以獲得準確的數值。
如果你在室內,數值顯示會非常低,為了要檢測是否正常運作,可以將紫外線感測器移到室外,或是拿著感測器伸出窗外,也可以使用紫外線燈(例如驗鈔用的檢測燈),這樣也能夠看到數值的改變。
7. 紫外線指數
我們從紫外線感測器讀取到正確的電壓,但是這代表什麼意思呢?我們還需要轉換這些數值轉換成國際標準的紫外線指數,這樣對我們才有用處。
第 5~32 行:在「uv_index.py」程式碼中,我們建立一個 uv_range 功能,以及一系列的 if 和 elif 來處理感測器所讀取到的數直落在哪個範圍(將 uv mv 轉換為微伏特),並設定相對應的紫外線指數(uv_index)。
小提示
我們估計的範圍是依據網路上紫外線感測器的典型電壓值表,但可能會因為溫度而有所差異。
8. 整合所有程式碼
最後,就把前面所撰寫好的 DHT11 與紫外線指數程式碼合併在一起吧!
第 1~8 行:在「weather.py」中,我們可以同時使用 RPi.GPIO 和 GPIO Zero 程式庫(後者是基於前者),但是我們在設定任何 GPIO Zero 數值前,需要初始化 GPIO 腳位。
第 12~39 行:我們使用 uv_range 功能去判定紫外線數值。
第 41~45 行:在 while True: 迴圈中加入呼叫。
第 46 行:加入顯示數值的功能。
9. 實測氣象站
如果你想要將簡易氣象站放置在戶外,那麼就需要一個電子產品專用的防水外殼。或者可以把它放在幾個相連的排水管彎頭裡(如同 The MagPi issue 92),在這種情況下,建議使用 Raspberry Pi Zero W 以節省空間。
另外將會需要使用 USB 線延長電源給簡易氣象站,如果你想要遠端讀取輸出的數值,那麼可以透過 SSH 連線或網路儀表板。你也需要將 Raspberry Pi 樹莓派連至網路路由器,若是要用無線連線,根據簡易氣象站與路由器的距離,可能會需要一個 Wi-Fi 擴大器。
四、小結
我們完成了一個簡易的氣象站,如果想要改善它,可以增加氣壓感測器,如 BMP280,或將 DHT11 換成 BME280,BMP280 可以量測溫度、溼度和氣壓,但是需要使用不同的 Python 程式庫。
如果是將簡易氣象站安裝在戶外,可以增加特別的天氣感測器,例如風速計、雨量、風向,如同 SparkFun SEN-15901 氣象儀套件中所介紹的那樣。
下一次我們要使用水分與液體感測器去監測植物,有興趣的夥伴們請幫我們多多分享並持續關注我們喔!下次見~