
จากบทความ การใช้ Median Filter ในการกำจัดค่า Spike (Noise) จากเซนเซอร์
คำถามต่อไปคือ:
“ทำอย่างไรให้ข้อมูล ‘นิ่ง’ แต่ยัง ‘ตอบสนองไว’ เมื่อมีการเปลี่ยนแปลงจริง?”
นี่คือจุดที่ Adaptive EMA (Exponential Moving Average) เข้ามามีบทบาทสำคัญ
ปัญหาที่ Median Filter ยังแก้ไม่จบ
แม้ Median จะตัด Noise ได้ดี แต่ยังมีปัญหา:
- ค่าอุณหภูมิ "กระพริบ" เล็กน้อย (micro fluctuation)
- กราฟยังไม่เรียบ (ไม่เหมาะกับ dashboard)
- การแสดงผล real time ยังดู "ไม่นิ่งพอ"
ดังนั้นเราต้องมี Layer ที่ 2: Smoothing
กลไก Adaptive EMA (Exponential Moving Average)
EMA คือการถ่วงน้ำหนักข้อมูลใหม่กับค่าเดิม:
float newValue = (alpha * correctedValue) + ((1 - alpha) * emaTemp);
ความหมายของตัวแปร
correctedValue= ค่าที่ผ่าน Median แล้วemaTemp= ค่า EMA ก่อนหน้าalpha= ค่าความไว (0 → นิ่ง, 1 → ไวมาก)
แนวคิด "Adaptive" (ปรับตัวอัตโนมัติ)
หัวใจสำคัญคือ เราไม่ใช้ alpha คงที่
float alpha = (diff > changeThreshold) ? alphaFast : alphaSlow;
2 โหมดการทำงาน
1. โหมดนิ่ง (Stable Mode)
เมื่อ:
- อุณหภูมิเปลี่ยนเล็กน้อย
diff <= changeThreshold
ใช้:
alpha = alphaSlow;
ผลลัพธ์:
- ค่าจะ "นิ่ง"
- ลดการสั่นของตัวเลข
- กราฟเรียบสวย
2. โหมดตอบสนองไว (Responsive Mode)
เมื่อ:
- มีการเปลี่ยนแปลงจริง เช่น เปิดตู้
diff > changeThreshold
ใช้:
alpha = alphaFast;
ผลลัพธ์:
- ค่าปรับตามทันที
- ไม่ lag
- เห็นเหตุการณ์จริงแบบ realtime
การเลือกค่า Parameter
| Parameter | ค่าแนะนำ |
|---|---|
| alphaSlow | 0.05 – 0.15 |
| alphaFast | 0.4 – 0.7 |
| changeThreshold | 0.3 – 0.8 °C |
หลักการ:
- alphaSlow ยิ่งต่ำ → ยิ่งนิ่ง
- alphaFast ยิ่งสูง → ยิ่งไว
Step Limiter: ด่านสุดท้ายของความ "เนียน"
แม้ EMA จะช่วย smoothing แล้ว แต่บางครั้งยังเกิด “jump” เล็ก ๆ เราจึงเพิ่ม Step Limiter
แนวคิด
จำกัดการเปลี่ยนแปลงต่อรอบ:
float delta = newValue - emaTemp; if (delta > maxStep) delta = maxStep; if (delta < -maxStep) delta = -maxStep; newValue = emaTemp + delta;
ค่าที่แนะนำ
maxStep = 0.12; // °C ต่อรอบ
ผลลัพธ์
- กราฟ "ไหลลื่น" เหมือนอนาล็อก
- ไม่มีการกระโดด
- UX ดีขึ้นมาก (โดยเฉพาะ Dashboard)
🔗 Data Pipeline (เวอร์ชัน Production)
รวมทั้งหมดจะได้ pipeline แบบนี้:
Raw Sensor
↓
Median Filter
↓
Adaptive EMA
↓
Step Limiter
↓
Validation (Physical Check)
↓
MQTT → Cloud
เปรียบเทียบก่อน-หลัง
| วิธี | ผลลัพธ์ |
|---|---|
| Raw Data | Noise สูง, ใช้ไม่ได้ |
| Median Only | ถูกต้อง แต่ยังสั่น |
| EMA คงที่ | นิ่ง แต่ช้า |
| Adaptive EMA | นิ่ง + เร็ว |
| + Step Limiter | เรียบเนียนระดับ Production |
Insight จากการใช้งานจริง
จากการ deploy ในระบบจริง:
- ✔ ไม่มี False Alarm
- ✔ กราฟนิ่งระดับใช้งานทางการแพทย์
- ✔ รองรับการเปิด-ปิดตู้ถี่
- ✔ ข้อมูลเชื่อถือได้ (Data Integrity สูง)
บทสรุป (Key Takeaway)
"Data ที่ดี ไม่ใช่แค่ 'ถูกต้อง' แต่ต้อง 'นิ่ง' และ 'ตอบสนองทัน' พร้อมกัน"
การใช้:
- Median Filter → ตัด Noise
- Adaptive EMA → คุมความนิ่ง + ความไว
- Step Limiter → ทำให้ UX สมบูรณ์
คือสูตรที่ทำให้ระบบ IoT จาก “Prototype” กลายเป็น Production-Grade System
แนวคิดต่อยอด
- Kalman Filter (ระดับ advanced)
- Dynamic Threshold จากสถิติจริง
- AI-based anomaly detection
- Edge ML สำหรับพฤติกรรมอุณหภูมิ