Field Log

Adaptive EMA + Step Limiter ยกระดับความนิ่งของข้อมูล IoT ในโลกจริง

ทำอย่างไรให้ข้อมูล ‘นิ่ง’ แต่ยัง ‘ตอบสนองไว’ เมื่อมีการเปลี่ยนแปลงจริง

5 MIN READ
17/04/2026
Adaptive EMA + Step Limiter ยกระดับความนิ่งของข้อมูล IoT ในโลกจริง

จากบทความ การใช้ 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ค่าแนะนำ
alphaSlow0.05 – 0.15
alphaFast0.4 – 0.7
changeThreshold0.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 DataNoise สูง, ใช้ไม่ได้
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 สำหรับพฤติกรรมอุณหภูมิ

Share this log to social network