Journal

Multi-Sensor AQI Fusion: รวมสัญญาณ PM2.5 + CO2 + TVOC ด้วย Kalman Filter ส่งแจ้งเตือน LINE

Multi-Sensor AQI Fusion: Combining PM2.5 + CO2 + TVOC Signals with Kalman Filter for LINE Alerts

12 พฤษภาคม 2569 · 1 นาที
smart→ INTELLIGENCE

Multi-Sensor AQI Fusion: เกินกว่าแค่ PM2.5

การวัดคุณภาพอากาศภายในบ้านด้วย sensor เพียงชนิดเดียว เช่น PM2.5 ให้ภาพที่ไม่ครบถ้วน อาคารที่ PM2.5 ต่ำอาจยังมี CO2 สูงจาก occupancy หรือ TVOC สูงจากเฟอร์นิเจอร์ใหม่ Multi-Sensor Fusion รวมสัญญาณหลายแหล่งสร้าง Indoor Air Quality (IAQ) Score ที่สมบูรณ์

Sensor Stack ที่แนะนำ

| Sensor | Parameter | Accuracy | ราคา (THB) | |--------|-----------|----------|------------| | SDS011 | PM2.5, PM10 | ±15% | 600 | | BME680 | Temp, Humid, TVOC, bVOC | ±15% TVOC | 350 | | SCD40 | CO2 (NDIR) | ±50 ppm | 1,200 | | SGP41 | NOₓ Index | - | 800 | ทั้งหมด interface ผ่าน I2C/UART กับ ESP32 หรือ Raspberry Pi

Kalman Filter สำหรับ PM2.5

SDS011 มี noise สูงในสภาพอากาศ Bangkok (ความชื้นสูง) Kalman Filter ลด noise และ smooth การเปลี่ยนแปลงกะทันหัน:

python class KalmanFilter:     def __init__(self, process_variance=1e-3, measurement_variance=1e-1):         self.estimate = 0         self.error = 1         self.Q = process_variance         self.R = measurement_variance      def update(self, measurement):         # Predict         self.error += self.Q         # Update         K = self.error / (self.error + self.R)         self.estimate += K * (measurement - self.estimate)         self.error = (1 - K) * self.error         return self.estimate  kf_pm25 = KalmanFilter(process_variance=1e-4, measurement_variance=0.5) smoothed = kf_pm25.update(raw_pm25_reading)

ผลลัพธ์: ลด noise จาก ±8 μg/m³ เหลือ ±2 μg/m³ ใน 95% percentile

IAQ Composite Score Algorithm

คำนวณ IAQ Score 0–500 โดยใช้ weighted sum:

python def calculate_iaq_score(pm25, co2, tvoc, temp, humid):     # Normalize each parameter to 0-100 sub-score     pm_score = min(100, pm25 / 75.0 * 100)  # 75 μg/m³ = AQI 150     co2_score = min(100, max(0, (co2 - 400) / (2000 - 400) * 100))     tvoc_score = min(100, tvoc / 500.0 * 100)  # 500 ppb = poor     temp_score = min(100, abs(temp - 24) / 8 * 100)  # ideal 24°C     humid_score = min(100, abs(humid - 50) / 30 * 100)  # ideal 50%      iaq = (pm_score * 0.40 + co2_score * 0.30 +            tvoc_score * 0.15 + temp_score * 0.10 +            humid_score * 0.05)     return iaq

น้ำหนัก: PM2.5 (40%) เป็นหลักเนื่องจากผลต่อสุขภาพสูงสุด, CO2 (30%) บ่งบอก ventilation, TVOC (15%), อุณหภูมิและความชื้น (15%)

Home Assistant YAML Integration

yaml template:   - sensor:       - name: "IAQ Composite Score"         unit_of_measurement: "IAQ"         state: >           {% set pm25 = states('sensor.pm25_kalman_filtered') | float %}           {% set co2 = states('sensor.scd40_co2') | float %}           {% set tvoc = states('sensor.bme680_tvoc') | float %}           {{ [((pm25/75)*40) + ((co2-400)/1600*30) + (tvoc/500*15), 0] | max | round(1) }}

LINE OA Broadcast Automation

ส่ง LINE OA ถึงสมาชิกในบ้านเมื่อ IAQ เกินเกณฑ์: | IAQ Score | ระดับ | การแจ้งเตือน | |-----------|-------|-------------| | 0–25 | ดีมาก | ไม่แจ้ง | | 26–50 | ดี | ไม่แจ้ง | | 51–100 | ปานกลาง | แจ้งเตือน LINE ช่วงเช้า | | 101–150 | ไม่ดี | แจ้งเตือนทันที + เปิด purifier | | >150 | อันตราย | Critical Alert + ปิด outdoor intake |

คำถามที่พบบ่อย

ทำไมต้องใช้ Kalman Filter แทนการ average ค่า?
Simple moving average มี lag สูงและตอบสนองช้าต่อการเปลี่ยนแปลงจริง Kalman Filter balance ระหว่าง smoothing และ responsiveness โดยปรับ gain ตาม uncertainty ทำให้ตรวจจับ PM2.5 spike จริงได้เร็วกว่า
SCD40 กับ SCD41 ต่างกันอย่างไร?
SCD41 มี on-chip temperature compensation ที่แม่นยำกว่าและรองรับ single-shot measurement mode ประหยัดพลังงานกว่า เหมาะสำหรับ battery-powered sensor node ราคาต่างกันประมาณ 200–300 บาท
IAQ Score calibrate กับมาตรฐานใด?
น้ำหนักและ threshold อ้างอิง WHO Air Quality Guidelines 2021 และ ASHRAE 62.1 สำหรับ indoor environments สามารถปรับน้ำหนักได้ตามความต้องการ เช่น บ้านที่มีเด็กเล็กอาจเพิ่มน้ำหนัก PM2.5 เป็น 50%