ระบบเฝ้าระวังและตรวจจับความผิดปกติของเครื่องจักรในอุตสาหกรรม (Machine Condition Monitoring & Anomaly Detection) โดยใช้บอร์ด ESP32

ระบบเฝ้าระวังและตรวจจับความผิดปกติของเครื่องจักรในอุตสาหกรรม (Machine Condition Monitoring & Anomaly Detection) โดยใช้บอร์ด ESP32 ทำงานร่วมกับเซนเซอร์ 3 ชนิด และส่งข้อมูลขึ้น Google Sheets / Google Apps Script เพื่อนำไปทำ Dashboard หรือระบบแจ้งเตือนต่อไป

1. ภาพรวมโครงสร้างระบบ (System Architecture)

โค้ดนี้ประกอบด้วย 3 ส่วนหลัก ที่สอดคล้องกับหลักการ IoT:

  1. Data Acquisition (การอ่านค่าจากโลกจริง):
    • DS18B20: วัดอุณหภูมิเครื่องจักร
    • SCT-013: วัดกระแสไฟฟ้า RMS (การใช้พลังงาน)
    • ADXL345: วัดแรงสั่นสะเทือนแบบ 3 แกน (X, Y, Z)
  2. Edge Analytics (การวิเคราะห์ข้อมูลบนอุปกรณ์):
    • Self-Learning Calibration: เรียนรู้สภาวะปกติของเครื่องจักรเองตอนเริ่มต้น
    • Z-Score Statistical Analysis: คำนวณความผิดปกติเชิงสถิติจากแรงสั่นสะเทือน
    • Multi-threshold Evaluation: ประเมินความเสี่ยงออกเป็น 3 ระดับ (NORMAL, WARNING, CRITICAL)
  3. Data Telemetry (การส่งต่อข้อมูล):
    • ส่งข้อมูล JSON ผ่าน HTTP POST ไปยัง Google Apps Script (Web App)

2. อธิบายโค้ด

ส่วนที่ 1: การนำเข้า ไลบรารี และตั้งค่าคอนฟิก (Header & Config)

C++

#include <WiFi.h>
#include <HTTPClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>
#include <math.h>
  • อธิบาย: นำเข้าไฟล์ไลบรารีสำหรับจัดการ WiFi, HTTP POST, เซนเซอร์ DS18B20 (OneWire), ADXL345 (I2C via Wire) และฟังก์ชันทางคณิตศาสตร์ (math.h)

C++

#define SCT_PIN 34         // ADC Pin สำหรับ SCT-013
#define ONE_WIRE_BUS 4     // DS18B20 Data Pin
  • อธิบาย: กำหนดขาพอร์ตใช้งาน โดย Pin 34 เป็นขา ADC สำหรับรับสัญญาณแรงดันอนาล็อกจากวงจรไฟ Bias ของ SCT-013 และ Pin 4 ใช้สื่อสาร bus เดียวกับ DS18B20

C++

float tempCriticalLimit    = 75.0;  // °C
float currentCriticalLimit = 50.0;  // A
const float TEMP_WARN_LIMIT   = 60.0;  // °C
const float ANOMALY_THRESHOLD = 3.0;   // Z-Score Baseline
const float Z_CRITICAL_RATIO  = 1.5;   // 3.0 * 1.5 = 4.5
const float Z_WARN_RATIO      = 1.0;   // 3.0 * 1.0 = 3.0
  • อธิบายเกณฑ์ประเมิน:
    • อุณหภูมิ: เฝ้าระวังตั้งแต่ 60.0°C ขึ้นไป และวิกฤตเมื่อถึง 75.0°C
    • กระแสไฟฟ้า: วิกฤตเมื่อเกิน 50.0A
    • Z-Score (สั่นสะเทือน): เกณฑ์วิกฤตคือ Z ≥4.5 และเกณฑ์เตือนภัยคือ Z ≥ 3.0

ส่วนที่ 2: ระบบ Self-Learning (เรียนรู้ค่าสั่นสะเทือนพื้นฐาน)

C++

void learnVibrationBaseline() { ... }

คอนเซปต์สำคัญในการสอน: ก่อนจะรู้ว่าเครื่องจักร “สั่นผิดปกติ” ระบบต้องรู้ก่อนว่า “ตอนทำงานปกติสั่นแค่ไหน”

1. อ่านค่าแรงสั่นสะเทือนสุ่ม 100 ครั้ง (LEARN_SAMPLES = 100):

คำนวณความเข้มการสั่นสะเทือนรวมจาก 3 แกนด้วย Vector Magnitude:

2. หาค่าเฉลี่ย (µ – Mean):

3. หาส่วนเบี่ยงเบนมาตรฐาน (sigma – Standard Deviation):

4. ป้องกัน Error: ใส่ if (vib_baseline_std < 0.001) vib_baseline_std = 0.001; เพื่อป้องกันไม่ให้ส่วนเบี่ยงเบนมาตรฐานเป็น 0 ซึ่งจะส่งผลให้เกิดข้อผิดพลาด Division by Zero ในการคำนวณ Z-Score ภายหลัง

ส่วนที่ 3: ฟังก์ชันอ่านค่าเซนเซอร์และการคำนวณทางสถิติ

1. การอ่านค่ากระแสไฟฟ้า RMS (readCurrentRMS)

C++

float readCurrentRMS() {
  const int SAMPLES = 300;
  float sum_sq = 0.0;

  for (int i = 0; i < SAMPLES; i++) {
    int raw = analogRead(SCT_PIN);
    float voltage = ((raw - 2048) / 4095.0) * 3.3; // ลบ Offset Center (~1.65V)
    sum_sq += voltage * voltage;
    delayMicroseconds(500);
  }

  float v_rms = sqrt(sum_sq / SAMPLES);
  float current_rms = v_rms * 60.0; // อัตราส่วน SCT-013 60A/1V
  
  if (current_rms < 0.2) current_rms = 0.0; // Noise Filter
  return current_rms;
}
  • หลักการทำงาน: สัญญาณกระแส AC เป็นคลื่นไซน์ (Sine wave) จึงต้องใช้วิธี Root Mean Square (RMS)
  • สูตรการแปลงแรงดัน: ESP32 มี ADC 12-bit (0 – 4095) และจุดศูนย์กลางวงจร DC Bias อยู่ที่ 1.65V (ค่าประมาณ 2048)
  • คูณอัตราส่วนหม้อแปลง: เอาค่า Vrms ที่ได้คูณด้วย 60.0 ตามสเปกของหม้อแปลง SCT-013 รุ่น 60A/1V

2. การวัดแรงสั่นสะเทือนและคำนวณ Z-Score (readVibrationAndZScore)

C++

void readVibrationAndZScore(float &mag, float &z_score) {
  sensors_event_t event;
  accel.getEvent(&event);

  mag = sqrt(pow(event.acceleration.x, 2) + 
             pow(event.acceleration.y, 2) + 
             pow(event.acceleration.z, 2));

  // Z-Score = (X - Mean) / StdDev
  z_score = (mag - vib_baseline_mean) / vib_baseline_std;
}
  • หลักการคำนวณ Z-Score:
  • ความหมายทางสถิติที่ใช้สอน: ค่า Z-Score คือตัวบอกว่า “แรงสั่นสะเทือนในปัจจุบัน เบี่ยงเบนไปจากค่าปกติที่เคยเรียนรู้มากี่เท่าของ Standard Deviation”
    • Z = 0 : สั่นปกติเหมือนตอน Calibration
    • Z = 3.0 : เริ่มสั่นผิดปกติจากเดิมอย่างมีนัยสำคัญ
    • Z ≥ 4.5 : มีแรงสั่นสะเทือนสูงผิดปกติอย่างรุนแรง

ส่วนที่ 4: การส่งข้อมูลเข้า Google Apps Script (sendToGoogleScript)

C++

void sendToGoogleScript(float temp, float vib, float current, float z_score, String status) {
  ...
  HTTPClient http;
  http.begin(GOOGLE_SCRIPT_URL);
  http.addHeader("Content-Type", "application/json");
  http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
  ...
}
  • จุดสำคัญที่ต้องเน้นย้ำ:
    • http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS)จำเป็นมาก เพราะ Google Web App จะทำการ Redirect (HTTP 302) ไปยัง Server ปลายทางเสมอ หากไม่ใส่คำสั่งนี้ ESP32 จะส่งข้อมูลไม่สำเร็จ
    • ข้อมูลถูกจัดรูปแบบเป็น JSON Format ก่อนส่งผ่านเมธอด HTTP POST

ส่วนที่ 5: การทำงานใน setup() และ loop()

ใน setup()

  1. เริ่มต้นระบบ Serial Monitor และเชื่อมต่อ WiFi
  2. เริ่มการทำงานของเซนเซอร์ tempSensor.begin() และ accel.begin() (พร้อมตั้งสเกล ADXL345 ไปที่ ±16g)
  3. เรียก learnVibrationBaseline() เพื่อเก็บค่า Calibration พื้นฐานทันทีเมื่อเปิดเครื่อง

ใน loop()

  1. อ่านค่ากระแส (Irms), อุณหภูมิ (T), และค่าสั่นสะเทือนพร้อม Z-Score
  2. ประเมินเงื่อนไขความปลอดภัย (Logic Decision Tree):

C++

if (currentTemp >= tempCriticalLimit || 
    currentRMS >= currentCriticalLimit || 
    zScore >= (ANOMALY_THRESHOLD * Z_CRITICAL_RATIO)) {
  statusStr = "CRITICAL";
} 
else if (currentTemp >= TEMP_WARN_LIMIT || zScore >= (ANOMALY_THRESHOLD * Z_WARN_RATIO)) {
  statusStr = "WARNING";
} 
else {
  statusStr = "NORMAL";
}
  1. แสดงผลออกทาง Serial Monitor
  2. เรียกฟังก์ชันส่ง JSON ขึ้น Cloud แล้วหน่วงเวลา 5 วินาที (delay(5000)) ก่อนทำรอบถัดไป

3. สรุปประเด็นสำคัญ

รายการคำอธิบาย
Predictive Maintenanceการตรวจวัดสุขภาพเครื่องจักรล่วงหน้าเพื่อป้องกันเครื่องจักรเสียกระทันหัน
Self-Learning (Calibration)ระบบเรียนรู้โปรไฟล์แรงสั่นของเครื่องด้วยตนเอง ไม่ต้องตั้งค่าแบบ Manual
Z-Score Detectionเครื่องมือทางสถิติที่ช่วยแยกแยะระหว่าง “สัญญาณรบกวนปกติ” กับ “ความผิดปกติจริง”
RMS Calculationวิธีคำนวณค่าไฟ AC ให้ถูกต้องโดยการหาค่าเฉลี่ยกำลังสองสมบูรณ์
HTTP Redirect Handlingข้อควรระวังสำคัญในการส่งข้อมูลเข้า Google Apps Script ด้วยบอร์ด IoT

ตัวอย่าง Code Machine Condition Monitoring & Anomaly Detection โดยใช้บอร์ด ESP32

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • เปิดใช้งานตลอด

บันทึกการตั้งค่า