找回密碼
 立即註冊
惟家LINE群QRCODE
    查看: 0|回覆: 0

    PM2.5 感測器 DIY 與空氣清淨機聯動(ESPHome 完整設定)

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    買一台有顯示的空氣清淨機很貴,
    但自己做一個 PM2.5 感測器大概一千多塊,而且數據能接進 HA



    先講標準

    台灣《室內空氣品質標準》(2012 年公告)訂的是:


    • PM2.5:35 μg/m³(二十四小時值)
    • PM10:75 μg/m³(二十四小時值)


    注意:這個法規的管理對象是公告場所,不是住宅。
    但可以當有依據的參考。

    實際感受的對照(PM2.5,μg/m³):


    • 0-15 —— 很好
    • 15-35 —— 普通,符合法規標準
    • 35-54 —— 對敏感族群不良
    • 54-150 —— 明顯不良
    • 150 以上 —— 很糟


    室內 PM2.5 的來源

    很多人以為只有室外空污才會影響,其實室內來源也很多:


    • 煎炒炸 —— 這是最大來源,炒菜時廚房可能飆到 200 以上
    • 燒香、蠟燭、蚊香
    • 吸菸
    • 掃地、鋪床(揚塵)
    • 寵物
    • 開窗時的室外空污


    DIY 的零件清單


    • ESP32 開發板 —— 約 200-300 元
    • PMS5003 或 PMSA003 粉塵感測器 —— 約 600-800 元
    • SHT30 或 SCD40(溫濕度,選配)—— 約 200-400 元
    • 杜邦線、麵包板或洞洞板 —— 約 100 元
    • 外殼(3D 列印或現成盒子)


    總共大約 1200-1600 元。

    為什麼選 PMS5003 系列


    • 雷射散射式,比紅外線式準很多
    • 同時輸出 PM1.0、PM2.5、PM10
    • ESPHome 有原生支援,接線簡單
    • 社群資料多


    接線
    1. PMS5003        ESP32
    2. -------        -----
    3. VCC     →      5V     (注意是 5V,不是 3.3V)
    4. GND     →      GND
    5. TX      →      GPIO16 (ESP32 的 RX)
    6. RX      →      GPIO17 (ESP32 的 TX)
    7. SET     →      不接(或接 3.3V 保持運作)
    8. RESET   →      不接
    複製代碼

    注意 TX 接 RX、RX 接 TX,這個接反是最常見的錯誤。



    ESPHome 設定檔
    1. esphome:
    2.   name: air-quality-living
    3.   friendly_name: 客廳空氣品質
    4. esp32:
    5.   board: esp32dev
    6.   framework:
    7.     type: esp-idf
    8. logger:
    9.   baud_rate: 0        # 關掉序列埠日誌,避免跟感測器搶 UART
    10. api:
    11.   encryption:
    12.     key: !secret api_key
    13. ota:
    14.   - platform: esphome
    15.     password: !secret ota_password
    16. wifi:
    17.   ssid: !secret wifi_ssid
    18.   password: !secret wifi_password
    19.   # IoT 網段的話記得設對
    20.   ap:
    21.     ssid: "AirQuality Fallback"
    22. uart:
    23.   rx_pin: GPIO16
    24.   tx_pin: GPIO17
    25.   baud_rate: 9600
    26. sensor:
    27.   - platform: pmsx003
    28.     type: PMSX003
    29.     pm_1_0:
    30.       name: "PM1.0"
    31.       filters:
    32.         - sliding_window_moving_average:
    33.             window_size: 10
    34.             send_every: 10
    35.     pm_2_5:
    36.       name: "PM2.5"
    37.       id: pm25
    38.       filters:
    39.         - sliding_window_moving_average:
    40.             window_size: 10
    41.             send_every: 10
    42.       on_value_range:
    43.         - above: 35
    44.           then:
    45.             - logger.log: "PM2.5 超過標準"
    46.     pm_10_0:
    47.       name: "PM10"
    48.       filters:
    49.         - sliding_window_moving_average:
    50.             window_size: 10
    51.             send_every: 10
    52.     update_interval: 60s
    53.   # 溫濕度(選配)
    54.   - platform: sht3xd
    55.     temperature:
    56.       name: "溫度"
    57.     humidity:
    58.       name: "濕度"
    59.     address: 0x44
    60.     update_interval: 60s
    61.   - platform: wifi_signal
    62.     name: "Wi-Fi 訊號"
    63.     update_interval: 300s
    64. # 讓感測器間歇運作,延長壽命
    65. switch:
    66.   - platform: template
    67.     name: "感測器風扇"
    68.     id: sensor_fan
    69.     optimistic: true
    70.     restore_mode: ALWAYS_ON
    複製代碼

    滑動平均濾波很重要 ——
    PMS5003 的原始讀值跳動很大,
    沒有濾波的話數字會一直閃,自動化也會亂觸發。

    感測器壽命的考量

    PMS5003 裡面有一顆小風扇,標稱壽命大約三年(連續運轉)

    想延長的話可以間歇運作
    1. interval:
    2.   - interval: 5min
    3.     then:
    4.       - switch.turn_on: sensor_fan
    5.       - delay: 30s          # 等風扇穩定
    6.       - component.update: pm25
    7.       - delay: 5s
    8.       - switch.turn_off: sensor_fan
    複製代碼

    但要注意:這樣就不能即時偵測(炒菜時可能五分鐘後才知道)。

    我自己是持續運轉,因為三年後換一個新的也才幾百塊,
    而即時性對自動化比較重要。



    自動化:空氣清淨機聯動

    基本版(智能插座控制)
    1. alias: PM2.5 自動清淨
    2. triggers:
    3.   - trigger: numeric_state
    4.     entity_id: sensor.living_room_pm2_5
    5.     above: 30
    6.     for: "00:03:00"
    7. actions:
    8.   - action: switch.turn_on
    9.     target: {entity_id: switch.air_purifier}
    10.   - wait_template: >
    11.       {{ states('sensor.living_room_pm2_5') | float(999) < 15 }}
    12.     timeout: "02:00:00"
    13.   - delay: "00:15:00"          # 再跑十五分鐘
    14.   - action: switch.turn_off
    15.     target: {entity_id: switch.air_purifier}
    16. mode: restart
    複製代碼

    進階版(可調風速的清淨機)
    1. alias: PM2.5 依濃度調整風速
    2. triggers:
    3.   - trigger: state
    4.     entity_id: sensor.living_room_pm2_5
    5. actions:
    6.   - variables:
    7.       pm: "{{ states('sensor.living_room_pm2_5') | float(0) }}"
    8.       speed: >
    9.         {% if pm > 80 %}100
    10.         {% elif pm > 50 %}75
    11.         {% elif pm > 30 %}50
    12.         {% elif pm > 15 %}25
    13.         {% else %}0
    14.         {% endif %}
    15.   - if: "{{ speed | int == 0 }}"
    16.     then:
    17.       - action: fan.turn_off
    18.         target: {entity_id: fan.air_purifier}
    19.     else:
    20.       - action: fan.set_percentage
    21.         target: {entity_id: fan.air_purifier}
    22.         data: {percentage: "{{ speed | int }}"}
    23. mode: restart
    複製代碼

    炒菜時自動加強
    1. alias: 煮飯時空氣清淨全開
    2. triggers:
    3.   - trigger: numeric_state
    4.     entity_id: sensor.kitchen_pm2_5
    5.     above: 60
    6. actions:
    7.   - action: switch.turn_on
    8.     target: {entity_id: switch.kitchen_exhaust}
    9.   - action: fan.set_percentage
    10.     target: {entity_id: fan.air_purifier}
    11.     data: {percentage: 100}
    12.   - action: script.smart_announce
    13.     data:
    14.       area: occupied
    15.       message: 廚房空氣品質下降,已加強抽風
    16. mode: single
    複製代碼

    開窗建議

    有室外 PM2.5 資料的話(HA 有台灣環境部的空品整合,
    或者用氣象相關整合),可以比對:
    1. template:
    2.   - binary_sensor:
    3.       - name: 適合開窗
    4.         unique_id: good_to_open_window
    5.         state: >
    6.           {{ states('sensor.outdoor_pm2_5') | float(999) < 20
    7.              and states('sensor.living_room_pm2_5') | float(0) > 25
    8.              and states('sensor.outdoor_temperature') | float(99) < 28
    9.              and states('sensor.outdoor_humidity') | float(100) < 75 }}
    複製代碼

    四個條件都要成立才建議開窗
    外面空氣好、裡面比較差、溫度舒適、濕度不會太高。

    濾網更換提醒
    1. template:
    2.   - sensor:
    3.       - name: 清淨機累計運轉時數
    4.         unique_id: purifier_hours
    5.         # 用 history_stats 算
    6.         state: "{{ states('sensor.purifier_runtime') }}"
    7. sensor:
    8.   - platform: history_stats
    9.     name: purifier_runtime
    10.     entity_id: switch.air_purifier
    11.     state: "on"
    12.     type: time
    13.     start: "{{ states('input_datetime.filter_changed') | as_timestamp }}"
    14.     end: "{{ now() }}"
    複製代碼

    配一個提醒:
    1. alias: 該換濾網了
    2. triggers:
    3.   - trigger: numeric_state
    4.     entity_id: sensor.purifier_runtime
    5.     above: 2000        # 小時,依你的濾網規格調整
    6. actions:
    7.   - action: notify.mobile_app_charles
    8.     data:
    9.       title: 空氣清淨機
    10.       message: >
    11.         累計運轉 {{ states('sensor.purifier_runtime') | round(0) }} 小時,
    12.         該換濾網了
    13. mode: single
    複製代碼

    換完之後重設 input_datetime.filter_changed。

    放置位置


    • 高度 1-1.5 公尺
    • 不要放在空氣清淨機的出風口(數字會假性偏低)
    • 不要放在窗邊(會被室外影響)
    • 廚房的話放在離爐具兩公尺左右(太近會爆表,太遠反應慢)
    • 離地太近會測到揚塵


    校正

    PMS5003 不能校正(沒有校正介面)。

    要確認準不準的話


    • 跟商用的機器比對
    • 或者放在室外跟官方測站的數據比對(會有差,但趨勢應該一致)


    DIY 感測器的絕對值可能有誤差,但趨勢是可靠的 ——
    對自動化來說這樣就夠了。

    ---

    我做這個的動機其實很簡單:

    想知道「炒菜的時候到底有多糟」。

    答案是:炒個菜廚房可以到 250,而且半小時後客廳也會上升到 60

    有了數據之後,我家的習慣改變了 ——
    炒菜一定開抽油煙機到最大,而且炒完再抽十分鐘

    這個行為改變的價值,遠大於那台空氣清淨機。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

    Archiver|手機版|惟家的智能論壇

    GMT+8, 2026-9-24 10:31 , Processed in 0.086981 second(s), 25 queries .

    快速回覆 返回頂部 返回列表