前言
在我們的日常生活中,空氣品質的重要性不言而喻。尤其在都市中,空氣污染問題日益嚴重,我們需要實時監控空氣品質,以確保我們的健康。在這篇文章中,筆者將分享如何使用 Raspberry Pi Pico W 來操作空氣品質感測器,並將相關數值上傳到 Google 試算表,是一個相當簡單但是功能強大的物聯網應用喔!
筆者將會逐步介紹連接硬體、編寫軟體和解析數據的過程,讓你可以輕鬆地建立自己的空氣品質監控系統,隨時掌握周遭環境的空氣品質。
撰寫/攝影 |
許鈺莨 (ChatGPT協作編輯) |
時間 |
小時 |
材料表 |
|
難度 |
2(滿分5) |
本文
本專題分享如何操作 Raspberry Pi Pico W 開發板來取得空氣品質、溫溼度、PM2.5 的數值,並顯示在OLED螢幕中,最後再透過 IFTTT 將感測器數值上傳到 Google 試算表。本專題配合Thonny IDE撰寫MicroPython程式,來讀取空氣品質數值,有關於 Raspberry Pi Pico W連接Thonny IDE撰寫MicroPython程式,可以查看下段的前導文章。
前導文章
● 透過Thonny IDE撰寫
有關於Raspberry Pi Pico W透過Thonny IDE撰寫MicroPython程式,請看【使用Raspberry Pi Pico W和MicroPython進行物聯網應用開發】,文中詳細說明xkk7Raspberry Pi Pico W如何與Thonny IDE連接,並且分享了匯入感測器模組的函式庫作法。
● 雲端監測
本文使用的雲端平台是由 IFTTT 串接 Google Sheets, IFTTT 設定部分請參考【LinkIt 7697空氣品質偵測並上傳Google表單(空氣盒子2.0)】。
感測器接線圖
這次所使用的感測器,除沿用之前文章所說明的 PMS5003 粉塵感測器和OLED螢幕外,還用到了 SGP30 二氧化碳感測器和 DHT22 溫濕度感測器,以下說明這兩種感測器模組的線路圖。
● SGP30接線圖
● DHT22接線圖
如何查看內建函式庫
本文所需要的 python 函式庫模組,如DHT22的dht模組和雲端IFTTT時需要的requests,在Raspberry Pi Pico W中已經有內建了,需在互動環境(Shell)中輸入下列指令,可查看內建的函式庫。
撰寫程式碼
請由此下載本文程式碼
PMS5003_DHT22_SGP30_IFTTT.py
import machine
import utime
import dht
from ssd1306 import SSD1306_I2C
from adafruit_sgp30 import Adafruit_SGP30
from time import sleep
import network
import ntptime
import urequests
# 初始化 SGP30和OLED的I2C
i2c_sgp = machine.SoftI2C(sda=machine.Pin(8), scl=machine.Pin(9))
i2c_oled = machine.SoftI2C(sda=machine.Pin(4), scl=machine.Pin(15))
# 初始化 OLED
oled_width = 128
oled_height = 64
oled = SSD1306_I2C(oled_width, oled_height, i2c_oled)
# 初始化 UART
uart = machine.UART(0, baudrate=9600, tx=machine.Pin(0), rx=machine.Pin(1), timeout=1000)
uart.init(9600, bits=8, parity=None, stop=1)
# 初始化 DHT22
dht22 = dht.DHT22(machine.Pin(2))
# 初始化 SGP30
sgp30 = Adafruit_SGP30(i2c_sgp)
# ...
# 設置變數
# ...
pm1_cf = 0
pm25_cf = 0
pm10_cf = 0
temp = 0
humidity = 0
eco2 = 0
tvoc = 0
# 決定OLED切換顯示感測器數值的變數
display_sensor = 0
# 獲得現在時間
start_time = utime.time()
# 初始化WiFi
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
wifi_ssid = "XXXXXXX"
wifi_password = "XXXXXX"
sta_if.connect(wifi_ssid, wifi_password)
#輸入IFTTT資訊
IFTTT_API_KEY = "XXXXXXXXXXXXX"
IFTT_EVEN_NAME="XXXXXXXXXXX"
while True:
current_time = utime.time()
# 得到DHT22數值
dht22.measure()
temp = dht22.temperature()
humidity = dht22.humidity()
# 得到PMS5003數值
data = bytearray(uart.read(32))
# 得到SGP30數值
eco2 = sgp30.co2eq
tvoc = sgp30.tvoc
if data is not None and len(data) >= 10 and data[0] == 0x42 and data[1] == 0x4d:
pm1_cf = int.from_bytes(data[4:6], 'big')
pm25_cf = int.from_bytes(data[6:8], 'big')
pm10_cf = int.from_bytes(data[8:10], 'big')
if current_time - start_time >= 3:
# 每3秒鐘切換數值顯示
display_sensor = (display_sensor + 1) % 3
start_time = current_time
oled.fill(0)
if display_sensor == 0:
# 顯示PMS5003數值
oled.text("PM1.0: %d ug/m3" % pm1_cf, 0, 22)
oled.text("PM2.5: %d ug/m3" % pm25_cf, 0, 38)
oled.text("PM10 : %d ug/m3" % pm10_cf, 0, 54)
elif display_sensor == 1:
# 顯示DHT22數值
oled.text("Temp: %3.1f C" % temp, 0, 22)
oled.text("Humidity: %3.1f %%" % humidity, 0, 38)
else:
# 顯示SGP30數值
oled.text("eCO2: %d ppm" % eco2, 0, 22)
oled.text("TVOC: %d ppb" % tvoc, 0, 38)
oled.show()
# 上傳data 到 IFTTT
sensor_readings = {
'value1': pm25_cf,
'value2': temp,
'value3': eco2
}
print('Printing sensorredings')
print(sensor_readings)
request_headers = {'Content-Type': 'application/json'}
request = urequests.post(
'https://maker.ifttt.com/trigger/' + IFTT_EVEN_NAME +'/with/key/' + IFTTT_API_KEY,
json=sensor_readings,
headers=request_headers
)
print(request.text)
request.close()
sleep(1)
如何自動執行程式
如果希望自動執行程式,只需要將上述程式碼檔名改成 main.py
之後存入 Raspberry Pi Pico W中即可,說明如下。
開啟檔案>另存新檔
選Raspberry Pi Pico>將檔案名稱改成”main.py”
執行結果
執行程式之後,就會在 Thonny IDE 中看到相關訊息,開啟對應的 Google 試算表之後也會看到數值一筆筆進來了。
如果無法順利執行程式,請檢查先前所有設定與感測器接線,預祝成功囉!
〈Raspberry Pi Pico W 空氣品質檢測系統 — 上傳感測器數值到 Google 試算表〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。