清淨機開了,空氣有變好嗎?阿明博士用 PMS5003T 觀察粉塵
內容整理:台灣智能感測科技|導讀角色:阿明博士
空氣清淨機開了一陣子,想知道環境有沒有變化,除了看機器上的燈號,也可以自己記錄一條粉塵趨勢。這一篇,阿明博士用 ESP32-S3 搭配 PMS5003T,查看 PM1.0、PM2.5、PM10,並把溫濕度一起留下來。
PMS5003T 可透過 UART 將 PM1.0、PM2.5、PM10 與溫濕度資料交給 ESP32-S3,再由 ESPHome 網頁顯示。感測器使用 5V 供電,但 UART 訊號是 3.3V,接線時要分開看待。
- 查看 PM1.0、PM2.5、PM10 的變化
- 一起保留溫濕度,方便理解量測條件
- 比較清淨機使用前後的環境趨勢
先固定位置,再比較前後變化
把感測器放在固定、有代表性的位置,記下清淨機開關的時間,再觀察讀值。不要一下放在出風口,一下移到門邊,最後卻把兩段數字當成同一個條件比較。
PMS5003T 是帶有溫濕度資料的粉塵感測器。範例保留它的內部溫濕度,也另外讀取 SHT20,讓你知道粉塵變化時,周圍濕度是否也在改變。不同位置或模組附近的溫度不必完全一樣,保留名稱比較有幫助。
接線時,最容易搞混的是這兩件事
第一件是供電:PMS5003T 的風扇需要 5V,但通訊訊號使用 3.3V。5V 只接到電源 VCC,不能接到 ESP32 的訊號腳。
第二件是 TX 和 RX:感測器送出資料的 TXD,要接到主板接收資料的 RX;反過來,主板 TX 接感測器 RXD。下方接線圖已把方向畫出來,依端子名稱逐條核對即可。
開機後,先讓感測器穩定下來
本課讓風扇連續運轉,再每 10 秒更新一次顯示值,方便看趨勢。開機或感測器重新上電後,先等待至少 30 秒,再開始採用讀值。網頁也會提供最近是否收到封包的狀態,避免線鬆了卻還把舊數字當成新數字。
範例的預熱計時是從主板開機開始算。如果只重開感測器、主板沒有重開,仍要自行重新等待;主板上的計時不會知道感測器曾經斷電。
看 PM2.5 趨勢,不急著把它變成一個分數
本課顯示的是環境用的質量濃度,單位是 µg/m³。它不是直接拿瞬間值換名字成 AQI,也沒有把不同用途的標準顆粒物欄位混在同一條曲線。先看固定位置的前後變化,比單看一個瞬間數字更有意義。
水霧、高濕度和油煙可能影響光學粒子量測,也可能污染感測器。平常的環境變化就足夠做觀察,不需要為了示範製造煙霧,或把加濕器對著進風口噴。
選購與安裝時,再注意這些細節
PMS5003、PMS5003T、PMS5003ST 的功能不同。本課設定固定為 PMS5003T,不含甲醛欄位;它的部分封包位置用來放溫濕度,也不能再當成其他型號的大粒徑計數。
進風、出風都要保持通暢,避免風又繞回進風口,也不要塞進密閉盒。參考原廠接頭編號辨識腳位,不以線材顏色猜測。
先準備這些材料
| 材料 | 準備重點 |
|---|---|
| ESP32-S3 N16R8 | 主板、資料 USB 線、2.4GHz Wi-Fi |
| SHT20 I²C 模組 | 商品 6129,使用 3.3V 供電 |
| PMS5003T | 穩定 5V 供電、3.3V UART;確認型號尾碼 T |
主板請確認為 WROOM-1-N16R8,範例使用 16MB Flash 與 Octal PSRAM。接線先斷電,表格中的 GPIO 是腳位名稱,不是排針從上往下數的位置。
照著圖,把線一條條接好
依名稱逐條對照接線

PMS5003T 使用 5V 供電,UART 為 3.3V 邏輯。
| 感測器接腳 | ESP32-S3/電源 | 核對事項 |
|---|---|---|
| SHT20 VCC | 主板 3V3 | 本課限 3.3V I²C 模組,先核對實物 |
| SHT20 GND | 主板 GND | 所有訊號參考共地 |
| SHT20 SDA | GPIO8 | 上拉至 3.3V |
| SHT20 SCL | GPIO9 | 100kHz;先用短線 |
| PMS5003T PIN1 VCC/PIN2 GND | 穩定 5V/共地 | 風扇不由 3V3 腳供電 |
| PMS5003T PIN5 TXD | GPIO18 RX | 3.3V UART |
| PMS5003T PIN4 RXD | GPIO17 TX | 3.3V UART |
| PMS5003T PIN3 SET/PIN6 RESET | 不接 | 依本型號內部上拉保持正常運作 |
| PMS5003T PIN7/PIN8 | 不接 | NC;從原廠接頭視圖辨識 PIN1 |
所有模組都要與主板共地。若使用外接電源,不要把外接 5V 和 USB 5V 直接並接,也不要把獨立 3.3V 穩壓器的輸出接到主板 3V3 輸出。先量好電壓,再接入訊號線。
把設定放進主板
- 下載整個 examples 資料夾,保留 components;把 secrets.yaml.example 複製成 secrets.yaml,填入自己的 Wi-Fi 與密碼。
- 依照Windows 燒錄指南安裝 ESPHome 2026.10.1,選擇本課 YAML,先檢查設定、再編譯與 USB 燒錄。
- 在 USB 日誌或路由器裝置清單找到主板 IP,瀏覽器輸入該 IP,再用 secrets 裡的網頁帳密登入。
以下命令在 examples 資料夾執行,COM5 請換成自己的埠號。USB 接頭、日誌與後續 OTA 更新的操作,都整理在共用指南。
..\.venv\Scripts\python.exe -m esphome config 03-pms5003t.yaml
..\.venv\Scripts\python.exe -m esphome compile 03-pms5003t.yaml
..\.venv\Scripts\python.exe -m esphome upload 03-pms5003t.yaml --device COM5
下載完整範例(含 03-pms5003t.yaml) · 下載完整範例(含 secrets.yaml.example)
完整 YAML:點此展開
esphome:
name: course-03-pms5003t
friendly_name: "PMS5003T 懸浮微粒監測"
min_version: 2026.10.1
compile_process_limit: 1
esp32:
board: esp32-s3-devkitc-1
flash_size: 16MB
framework:
type: esp-idf
psram:
mode: octal
speed: 80MHz
logger:
hardware_uart: USB_SERIAL_JTAG
level: DEBUG
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
power_save_mode: none
reboot_timeout: 0s
ota:
- platform: esphome
password: !secret ota_password
web_server:
port: 80
version: 3
local: true
auth:
type: digest
username: !secret web_username
password: !secret web_password
i2c:
id: sensor_bus
sda: GPIO8
scl: GPIO9
scan: true
frequency: 100kHz
external_components:
- source:
type: local
path: components
components: [sht20_local]
sensor:
- platform: sht20_local
id: sht20_driver
address: 0x40
update_interval: 10s
temperature:
id: sht_temperature
name: "SHT20 Temperature"
on_value:
then:
- lambda: |-
id(last_sht_ms) = millis();
id(sht_seen) = true;
humidity:
id: sht_humidity
name: "SHT20 Humidity"
on_value:
then:
- lambda: |-
id(last_rh_ms) = millis();
id(rh_seen) = true;
- platform: pmsx003
type: PMS5003T
uart_id: pms_uart
# Continuous active mode; no sleep/wake cycling in this lesson.
update_interval: 0s
pm_1_0:
name: "PMS5003T PM1.0 Atmospheric"
filters:
- throttle: 10s
pm_2_5:
id: pm25_value
name: "PMS5003T PM2.5 Atmospheric"
on_raw_value:
then:
- lambda: |-
id(last_pm_ms) = millis();
id(pm_seen) = true;
filters:
- throttle: 10s
pm_10_0:
name: "PMS5003T PM10 Atmospheric"
filters:
- throttle: 10s
temperature:
name: "PMS5003T Internal Temperature"
filters:
- throttle: 10s
humidity:
name: "PMS5003T Internal Humidity"
filters:
- throttle: 10s
globals:
- id: last_sht_ms
type: uint32_t
restore_value: false
initial_value: '0'
- id: sht_seen
type: bool
restore_value: false
initial_value: 'false'
- id: last_rh_ms
type: uint32_t
restore_value: false
initial_value: '0'
- id: rh_seen
type: bool
restore_value: false
initial_value: 'false'
- id: last_pm_ms
type: uint32_t
restore_value: false
initial_value: '0'
- id: pm_seen
type: bool
restore_value: false
initial_value: 'false'
binary_sensor:
- platform: template
name: "SHT20 Temperature Fresh"
lambda: |-
return id(sht_seen) && (uint32_t)(millis() - id(last_sht_ms)) < 35000;
- platform: template
name: "SHT20 Humidity Fresh"
lambda: |-
return id(rh_seen) && (uint32_t)(millis() - id(last_rh_ms)) < 35000;
- platform: template
name: "PMS5003T Packet Fresh"
lambda: |-
return id(pm_seen) && (uint32_t)(millis() - id(last_pm_ms)) < 15000;
- platform: template
name: "PMS5003T Warmup Complete"
lambda: 'return millis() > 30000;'
uart:
id: pms_uart
tx_pin: GPIO17
rx_pin: GPIO18
baud_rate: 9600
data_bits: 8
parity: NONE
stop_bits: 1
rx_buffer_size: 512
接好後,先試這幾件事
先從正常顯示開始,再試一次拔除、恢復或更換環境條件。這些小步驟有助於確認你看到的資料,確實來自現在的接線與位置。
| 測試項目 | 應觀察的結果 |
|---|---|
| 首次上電 | 風扇運作、正確封包、等待至少 30 秒 |
| 拔除 TXD 接收線 | 15 秒後 Packet Fresh 失效;保留舊 PM 值但不當即時值 |
| 感測器單獨重新上電 | 手動重新等待 30 秒;確認主板 Warmup 狀態不會自動重新計時 |
| 清淨機前後比較 | 固定位置、記錄溫濕度與運轉時間;不把單次值當成精度證明 |
遇到問題時,從這裡開始找
先查供電和共地,再核對端子名稱與訊號方向。I²C 裝置可看掃描位址;PMS5003T 走 UART,不會出現在 I²C 清單。接著確認設定的型號與最後一次更新時間,最後才檢查網頁或後端。資料停住時,不要先把它當成環境一直沒變。
材料與延伸閱讀
ESP32-S3 N16R8 主板 · SHT20 I²C 模組。依實際用途選擇所需感測器即可。
常見問題
PMS5003T 的內部溫濕度,和 SHT20 不一樣怎麼辦?
先確認兩者的位置、通風及熱源。模組附近的溫度和外置感測器可能不同;保留各自名稱與安裝條件,再比較趨勢,別直接平均成一個數字。

發佈留言
很抱歉,必須登入網站才能發佈留言。