作者/圖片來源: CIRCUS Pi
「樹莓派感測器實作」系列實作,我們已經製作了火焰與瓦斯洩漏警報系統,以及入侵者警報器。這次要使用感測器來量測溫度、相對濕度、紫外線等天氣條件。
因為這次實作有感測器使用類比輸出,正好可以學習如何使用類比數位轉換器(ADC)將類比轉換為數位訊號。
所需設備
2. 紫外線感測器 x1
4. 麵包板 x1
5. 杜邦線材
實作步驟
1. 連接 DHT11 溫濕度感測器
DHT11 溫濕度感測器可以用來量測溫度和相對溼度,當然也能升級使用 DHT22 或是 BME280(可量測氣壓)。
DHT11 溫濕度感測器結合熱敏電阻與電容式濕度感測器,輸出數位訊號,使用上相當容易。
首先,關閉 Raspberry Pi 樹莓派的電源,將 DHT11 溫濕度感測器連接到開發板,如下圖表所示:

圖1. 簡易氣象站接線圖
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,接線請參照下表:
5. 連接紫外線感測器
前面已成功連接完類比數位轉換器(ADC)了,接著紫外線感測器連接到開發板如圖 1,接線請參照下表:
再將紫外線感測器依照下表連接到 MCP3008:
小提示
紫外線感測器可以任意連接到 MCP3008 的 8 個輸入通道,本實作使用第 0 個輸入通道。none
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)。
小提示
我們估計的範圍是依據網路上紫外線感測器的典型電壓值表,但可能會因為溫度而有所差異。none
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 氣象儀套件中所介紹的那樣。
下一次我們要使用水分與液體感測器去監測植物,有興趣的夥伴們請幫我們多多分享並持續關注我們喔!下次見~
註
本文譯自樹莓派雜誌 113 期(MagPi issue 113),原文標題為 Build a simple weather station(圖片來源取自雜誌內頁),相關原始程式碼可參考官方程式碼。
本篇與原文同樣使用 CC 3.0 BY-NC-SA 授權,歡迎標註原作者轉載,若有任何不妥與指教敬請告知。
(本文經同意轉載自CIRCUS Pi、原文連結;責任編輯:謝涵如)
- 【CIRCUS Pi】ESP32教學系列:用ESP32玩91段電子紙 - 2025/03/24
- 【CIRCUS Pi】ESP32教學系列:硬體中斷 - 2024/12/25
- 【CIRCUS Pi】使用 Arduino UNO R4 WiFi 輕鬆製作 LED Matrix 動畫 - 2024/10/14
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!