在嵌入式系統開發中,感測器扮演著重要的角色,用於取得環境資訊。本文將介紹如何使用 Raspberry Pi 搭配不同感測器,包含 MCP3008 模組、TMP36 溫度感測器以及 Sense HAT,來測量電壓、溫度、濕度和氣壓等環境引數。首先,我們將說明如何使用 MCP3008 模組和電壓分割器電路測量電池電壓,並提供 Python 程式碼範例。接著,將介紹如何使用 TMP36 溫度感測器和 MCP3008 測量環境溫度,並將其轉換為攝氏和華氏溫度。此外,本文也會說明如何讀取 Raspberry Pi CPU 溫度,並討論使用 Sense HAT 取得更全面的環境資料,包含溫度、濕度和氣壓,以及如何避免 Sense HAT 讀數受 Raspberry Pi CPU 熱量影響的技巧。

使用MCP3008模組測量電池電壓

硬體設定

首先,我們需要將MCP3008模組連線到麵包板,然後使用電池夾將9V電池連線到麵包板。這個設定可以用來測量電池的電壓,如圖13-12所示。

程式碼

以下是用於測量電池電壓的程式碼(ch_13_adc_scaled.py):

from gpiozero import MCP3008
import time

R1 = 10000.0  # 第一個電阻的阻值
R2 = 3300.0  # 第二個電阻的阻值

analog_input = MCP3008(channel=0)  # 初始化MCP3008模組

while True:
    reading = analog_input.value  # 讀取模擬輸入值
    voltage_adc = reading * 3.3  # 將讀取值轉換為電壓
    voltage_actual = voltage_adc / (R2 / (R1 + R2))  # 將電壓進行比例縮放
    
    print("電池電壓=" + str(voltage_actual))  # 輸出電池電壓
    
    time.sleep(1)  # 暫停1秒

執行程式碼

執行程式碼後,電池的電壓將被顯示出來:

$ sudo python adc_scaled.py
電池電壓=8.62421875

警告

請注意,這個程式碼只能用於測量低電壓的直流電壓,不能用於測量高電壓的交流電壓或任何型別的交流電壓。同時,在連線任何高於9V的電源之前,請仔細閱讀相關討論,以免損壞MCP3008模組。

討論

這個程式碼與Recipe 13.6非常相似,主要差異在於比例縮放使用了兩個電阻的值。這兩個電阻的值儲存在R1R2變數中。當您執行程式碼時,電池的電壓將被顯示出來。請注意,在連線任何高於9V的電源之前,請仔細閱讀相關討論,以免損壞MCP3008模組。

電壓分割器的應用

電壓分割器是一種常見的電子電路元件,用於將輸入電壓分割成兩個或多個部分。其工作原理是透過兩個或多個電阻器的組合,將輸入電壓分割成不同比例的電壓。

電壓分割器的公式

電壓分割器的輸出電壓可以使用以下公式計算:

Vout = Vin * R2 / (R1 + R2)

其中,Vout是輸出電壓,Vin是輸入電壓,R1和R2是兩個電阻器的阻值。

電壓分割器的應用範例

假設我們有兩個電阻器,R1和R2,分別為10kΩ和3.3kΩ。如果我們將9V的電壓應用於電壓分割器,則輸出電壓Vout可以計算如下:

Vout = 9V * 3.3kΩ / (10kΩ + 3.3kΩ) = 2.45V

這意味著輸出電壓Vout約為2.45V。

電壓分割器的優點

電壓分割器有許多優點,包括:

  • 可以將高電壓降低到安全的水平
  • 可以將電壓訊號分割成多個部分
  • 可以用於測量電阻值

使用電壓分割器的注意事項

使用電壓分割器時,需要注意以下幾點:

  • 電阻器的阻值應該選擇合適,以避免過載
  • 電壓分割器的輸出電壓應該在安全範圍內
  • 電壓分割器應該正確連線,以避免短路或開路

使用電阻式感測器與ADC

電阻式感測器可以用於測量環境的物理引數,例如光照度、溫度等。透過使用電壓分割器,可以將感測器的電阻值轉換為電壓訊號,然後使用ADC(Analog-to-Digital Converter)將其轉換為數字訊號。

實驗步驟

  1. 準備材料:麵包板、跳線、MCP3008 ADC晶片、10kΩ電阻器、光敏電阻器等。
  2. 將光敏電阻器和10kΩ電阻器連線到麵包板上,形成電壓分割器。
  3. 將MCP3008 ADC晶片連線到Raspberry Pi上。
  4. 編寫程式,使用SPI協定讀取ADC的資料。
  5. 執行程式,觀察資料的變化。

程式範例

import spidev

# 開啟SPI連線
spi = spidev.SpiDev()
spi.open(0, 0)

# 讀取ADC資料
def read_adc(adc_channel):
    adc_value = spi.xfer2([1, (8 + adc_channel) << 4, 0])
    return ((adc_value[1] & 3) << 8) + adc_value[2]

# 讀取光敏電阻器的資料
while True:
    reading = read_adc(0)
    voltage = reading * 3.3 / 1024
    print(f"Reading={reading:.2f} Voltage={voltage:.2f}")

結果分析

執行程式後,可以觀察到資料的變化。當光敏電阻器受到光照時,其電阻值會降低,導致輸出電壓升高。相反,當光敏電阻器受到遮蔽時,其電阻值會升高,導致輸出電壓降低。這些變化可以用於測量環境的光照度等物理引數。

圖表翻譯

  graph LR
    A[光敏電阻器] -->|連線|> B[10kΩ電阻器]
    B -->|連線|> C[MCP3008 ADC晶片]
    C -->|SPI協定|> D[Raspberry Pi]
    D -->|讀取資料|> E[資料變化]

內容解密

以上程式和圖表展示瞭如何使用電阻式感測器和ADC來測量環境的物理引數。透過使用電壓分割器,可以將感測器的電阻值轉換為電壓訊號,然後使用ADC將其轉換為數字訊號。這些數字訊號可以用於分析環境的變化,並進行相應的控制和調整。

使用TMP36和MCP3008 ADC晶片測量溫度

問題描述

您想要使用TMP36溫度感測器和模數轉數字轉換器(ADC)來測量溫度。

解決方案

使用MCP3008 ADC晶片。但是,如果您不需要多個模數通道,您應該考慮使用DS18B20數字溫度感測器,它更準確且不需要單獨的ADC晶片(詳見配方13.12)。

所需元件

-麵包板和跳線(見“原型裝置和套件”) -MCP3008八通道ADC IC(見“積體電路”) -TMP36溫度感測器(見“積體電路”)

連線圖

圖13-15顯示了使用麵包板的連線圖。 圖13-15. 使用TMP36和ADC

程式碼

from gpiozero import MCP3008
import time

analog_input = MCP3008(channel=0)

while True:
    reading = analog_input.value
    voltage = reading * 3.3
    temp_c = voltage * 100 - 50
    temp_f = temp_c * 9.0 / 5.0 + 32
    print("Temp C={:.2f}\tTemp F={:.2f}".format(temp_c, temp_f))
    time.sleep(1)

內容解密:

上述程式碼使用gpiozero函式庫來控制MCP3008 ADC晶片。首先,建立一個MCP3008物件,指定通道為0。然後,進入一個無限迴圈中,不斷讀取ADC的值,並計算出對應的電壓、攝氏溫度和華氏溫度。最後,列印預出攝氏和華氏溫度。

執行結果

$ python3 ch_13_adc_tmp36.py
Temp C=18.64 Temp F=65.55

圖表翻譯:

  flowchart TD
    A[開始] --> B[初始化MCP3008]
    B --> C[讀取ADC值]
    C --> D[計算電壓]
    D --> E[計算攝氏溫度]
    E --> F[計算華氏溫度]
    F --> G[列印溫度]
    G --> H[等待1秒]
    H --> C

圖表說明:

上述流程圖顯示了程式碼的執行流程。首先,初始化MCP3008 ADC晶片,然後讀取ADC值,計算出對應的電壓、攝氏溫度和華氏溫度,最後列印預出溫度,並等待1秒後再次讀取ADC值。

測量溫度:TMP36 與 Raspberry Pi CPU 溫度

TMP36 溫度感測器

TMP36 是一種熱電偶型溫度感測器,可以將溫度轉換為電壓訊號。根據 TMP36 的資料表,溫度(以攝氏度為單位)可以透過以下公式計算:溫度(攝氏度)= 電壓(伏特)× 100 - 50。

以下是三組測量資料:

  • 溫度(攝氏度)= 20.25,對應的華氏度為 68.45
  • 溫度(攝氏度)= 23.47,對應的華氏度為 74.25
  • 溫度(攝氏度)= 25.08,對應的華氏度為 77.15

TMP36 的精確度約為 2°C,因此不適合需要高精確度的應用。另外,當長導線連線到 TMP36 時,其精確度可能會降低。為了獲得更高的精確度,可以使用 DS18B20 數字溫度感測器,其精確度約為 0.5%。

Raspberry Pi CPU 溫度

要測量 Raspberry Pi 的 CPU 溫度,可以使用 os 庫存取 Broadcom 晶片內建的溫度感測器。以下是 Python 程式碼範例(ch_13_cpu_temp.py):

import os, time

while True:
    dev = os.popen('/opt/vc/bin/vcgencmd measure_temp')
    cpu_temp = dev.read()
    print(cpu_temp)
    time.sleep(1)

這個程式會不斷地讀取 CPU 溫度並印出結果。注意,印出的訊息是一個包含 temp=C 的字串。

內容解密:

  • os.popen() 函式用於開啟一個管道,並執行指定的命令。在這個例子中,命令是 /opt/vc/bin/vcgencmd measure_temp,它會讀取 CPU 溫度。
  • dev.read() 用於讀取管道的輸出,即 CPU 溫度。
  • print(cpu_temp) 用於印出 CPU 溫度。
  • time.sleep(1) 用於暫停 1 秒鐘,然後再次讀取 CPU 溫度。

圖表翻譯:

  flowchart TD
    A[開始] --> B[讀取 CPU 溫度]
    B --> C[印出 CPU 溫度]
    C --> D[暫停 1 秒鐘]
    D --> B

這個流程圖描述了程式的執行流程:讀取 CPU 溫度、印出 CPU 溫度、暫停 1 秒鐘,然後再次讀取 CPU 溫度。

使用 Raspberry Pi 感測環境引數

在本文中,我們將探討如何使用 Raspberry Pi 感測環境引數,包括溫度、濕度和氣壓。

測量 CPU 溫度

首先,我們可以使用 vcgencmd 命令來測量 CPU 溫度。以下是範例程式碼:

import os
import time

while True:
    dev = os.popen('/opt/vc/bin/vcgencmd measure_temp')
    cpu_temp_s = dev.read()[5:-3]  # top and tail string
    cpu_temp = float(cpu_temp_s)
    print(cpu_temp)
    time.sleep(1)

這個程式碼會不斷地讀取 CPU 溫度,並將其轉換為浮點數。

使用 Sense HAT 感測環境引數

如果您想要測量更多的環境引數,例如濕度和氣壓,您可以使用 Raspberry Pi Sense HAT。Sense HAT 是一個擴充板,內建了多個感測器,包括溫度、濕度、氣壓和加速度計等。

以下是使用 Sense HAT 感測環境引數的範例程式碼:

from sense_hat import SenseHat
import time

hat = SenseHat()
while True:
    t = hat.get_temperature()
    h = hat.get_humidity()
    p = hat.get_pressure()
    print(f"溫度:{t} 度C,濕度:{h} %,氣壓:{p} hPa")
    time.sleep(1)

這個程式碼會不斷地讀取溫度、濕度和氣壓,並將其印出。

使用 Sense HAT 感測器讀取溫度、濕度和氣壓

Sense HAT 是一款為 Raspberry Pi 設計的擴充板,內建多種感測器,包括溫度、濕度和氣壓感測器。以下是使用 Python 程式語言讀取 Sense HAT 感測器資料的範例:

import time
from sense_hat import SenseHat

sense = SenseHat()
while True:
    t = sense.get_temperature()
    h = sense.get_humidity()
    p = sense.get_pressure()
    print('Temp C:{:.2f} Hum:{:.0f} Pres:{:.0f}'.format(t, h, p))
    time.sleep(1)

這個程式會不斷讀取 Sense HAT 的溫度、濕度和氣壓資料,並將其印出到終端機。

討論

Sense HAT 的溫度感測器內建於濕度感測器中,且位於 Sense HAT 的印刷電路板 (PCB) 上。由於 Raspberry Pi 會產生熱量,Sense HAT 的溫度讀數可能會稍高。為了避免這個問題,可以使用 40 針排線將 Sense HAT 移離 Raspberry Pi。

另外,Sense HAT 的氣壓感測器也內建了一個溫度感測器,可以使用 get_temperature_from_pressure() 函式讀取。雖然檔案中沒有明確指出這個讀數是否比使用濕度感測器更準確,但在某些設定中,它可能會報告較低的溫度。

參考

若要開始使用 Sense HAT,可以參考配方 9.16。Sense HAT 的程式設計參考檔案可在此找到。Sense HAT 還具有加速度計、陀螺儀 (配方 13.15) 和磁力計 (配方 13.14) 等感測器,適合用於導航型別的專案。它還具有全綵色 8x8 LED 矩陣顯示器 (配方 14.3)。

從底層硬體連線到高階應用程式的全面檢視顯示,使用Raspberry Pi搭配各式感測器進行環境引數監控,展現了其應用於物聯網領域的巨大潛力。本文探討了利用MCP3008模組讀取類別比感測器數值,以及運用電壓分割器原理測量電池電壓和光敏電阻值,並深入分析了溫度感測器TMP36和Raspberry Pi內建CPU溫度感測器的應用。此外,更進一步介紹了Sense HAT的多功能整合方案,涵蓋溫度、濕度、氣壓等多種環境引數的擷取。

透過多維度效能指標的實測分析,可以發現,選擇合適的感測器和讀取方式至關重要。對於高精確度溫度測量,DS18B20數字溫度感測器更具優勢;而Sense HAT則提供了更全面的環境監控方案,但需注意PCB板溫度的影響。同時,程式碼範例的提供,降低了開發門檻,方便使用者快速上手。然而,不同感測器的精確度、穩定性和成本差異,仍需根據實際應用場景進行權衡。

展望未來,隨著感測器技術的持續發展和成本的降低,預期根據Raspberry Pi的環境監控系統將更普及且功能更強大。更精確、更低功耗、更易於整合的感測器將不斷湧現,結合邊緣運算和雲端服務,將催生更多創新應用。例如,智慧農業、智慧家居、環境監測等領域都將受益於此。

玄貓認為,Raspberry Pi結合各式感測器,為物聯網應用提供了低成本且高度客製化的解決方案。開發者應關注不同感測器的特性,並根據實際需求選擇最佳方案,才能最大化發揮Raspberry Pi的潛力。