PM2.5感測器
-
-
PMS5003T感測器介紹
PMS5003T感測器是一款可以用來測量空氣中的PM2.5、溫度等物理量,並且將它轉換為數字的感測器。
- 將感測器接上樹莓派的GPIO
-
讀取PM2.5的Python程式碼
pip install pyserial#!/usr/bin/env python3 """讀取 PMS5003 的 PM1.0 / PM2.5 / PM10(Raspberry Pi OS Trixie, pyserial)""" import struct import time import serial PORT = "/dev/serial0" # Pi 5 若沒有 serial0,改用 /dev/ttyAMA0 BAUD = 9600 FRAME_LEN = 32 def read_frame(ser): """同步到 0x42 0x4D header,回傳完整 32-byte frame(含 header)""" while True: b = ser.read(1) if b != b"\x42": continue if ser.read(1) != b"\x4d": continue rest = ser.read(FRAME_LEN - 2) if len(rest) != FRAME_LEN - 2: continue # timeout,重來 frame = b"\x42\x4d" + rest # 驗證 checksum:前 30 bytes 總和 == 最後 2 bytes if sum(frame[:30]) != struct.unpack(">H", frame[30:])[0]: continue return frame def parse(frame): # 長度 + 13 筆資料 + checksum = 15 個 uint16 (big-endian) v = struct.unpack(">15H", frame[2:]) return { "pm1_cf1": v[1], "pm25_cf1": v[2], "pm10_cf1": v[3], # 標準顆粒 (CF=1) "pm1": v[4], "pm25": v[5], "pm10": v[6], # 大氣環境值 (一般用這組) "n0_3": v[7], "n0_5": v[8], "n1_0": v[9], # 每 0.1L 顆粒數 "n2_5": v[10], "n5_0": v[11], "n10": v[12], } def main(): with serial.Serial(PORT, BAUD, timeout=2) as ser: ser.reset_input_buffer() print("PMS5003 讀取中,Ctrl+C 結束") while True: d = parse(read_frame(ser)) print(time.strftime("%H:%M:%S"), f"PM1.0={d['pm1']:3d} PM2.5={d['pm25']:3d} PM10={d['pm10']:3d} µg/m³") if __name__ == "__main__": try: main() except KeyboardInterrupt: pass#!/usr/bin/env python3 """讀取 PMS5003T 的 PM1.0 / PM2.5 / PM10 / 溫度 / 濕度(Raspberry Pi OS Trixie, pyserial)""" import struct import time import serial PORT = "/dev/serial0" # Pi 5 若沒有 serial0,改用 /dev/ttyAMA0 BAUD = 9600 FRAME_LEN = 32 def read_frame(ser): """同步到 0x42 0x4D header,回傳完整 32-byte frame(含 header)""" while True: b = ser.read(1) if b != b"\x42": continue if ser.read(1) != b"\x4d": continue rest = ser.read(FRAME_LEN - 2) if len(rest) != FRAME_LEN - 2: continue # timeout,重來 frame = b"\x42\x4d" + rest # 驗證 checksum:前 30 bytes 總和 == 最後 2 bytes if sum(frame[:30]) != struct.unpack(">H", frame[30:])[0]: continue return frame def parse(frame): # 長度 + 13 筆資料 + checksum = 15 個 uint16 (big-endian) v = struct.unpack(">15H", frame[2:]) temp = struct.unpack(">h", frame[24:26])[0] / 10.0 # Data11,有號 int16,°C humi = v[12] / 10.0 # Data12,%RH return { "pm1_cf1": v[1], "pm25_cf1": v[2], "pm10_cf1": v[3], # 標準顆粒 (CF=1) "pm1": v[4], "pm25": v[5], "pm10": v[6], # 大氣環境值 (一般用這組) "n0_3": v[7], "n0_5": v[8], "n1_0": v[9], "n2_5": v[10], # 每 0.1L 顆粒數 "temp": temp, "humi": humi, } def main(): with serial.Serial(PORT, BAUD, timeout=2) as ser: ser.reset_input_buffer() print("PMS5003T 讀取中,Ctrl+C 結束") while True: d = parse(read_frame(ser)) print(time.strftime("%H:%M:%S"), f"PM1.0={d['pm1']:3d} PM2.5={d['pm25']:3d} PM10={d['pm10']:3d} µg/m³ " f"T={d['temp']:.1f}°C RH={d['humi']:.1f}%") if __name__ == "__main__": try: main() except KeyboardInterrupt: pass
-
PMS5003T感測器介紹
