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


ระบบเฝ้าระวังและตรวจจับความผิดปกติของเครื่องจักรในอุตสาหกรรม (Machine Condition Monitoring & Anomaly Detection) โดยใช้บอร์ด ESP32 ทำงานร่วมกับเซนเซอร์ 3 ชนิด และส่งข้อมูลขึ้น Google Sheets / Google Apps Script เพื่อนำไปทำ Dashboard หรือระบบแจ้งเตือนต่อไป
1. ภาพรวมโครงสร้างระบบ (System Architecture)
โค้ดนี้ประกอบด้วย 3 ส่วนหลัก ที่สอดคล้องกับหลักการ IoT:
- Data Acquisition (การอ่านค่าจากโลกจริง):
- DS18B20: วัดอุณหภูมิเครื่องจักร
- SCT-013: วัดกระแสไฟฟ้า RMS (การใช้พลังงาน)
- ADXL345: วัดแรงสั่นสะเทือนแบบ 3 แกน (X, Y, Z)
- Edge Analytics (การวิเคราะห์ข้อมูลบนอุปกรณ์):
- Self-Learning Calibration: เรียนรู้สภาวะปกติของเครื่องจักรเองตอนเริ่มต้น
- Z-Score Statistical Analysis: คำนวณความผิดปกติเชิงสถิติจากแรงสั่นสะเทือน
- Multi-threshold Evaluation: ประเมินความเสี่ยงออกเป็น 3 ระดับ (
NORMAL,WARNING,CRITICAL)
- 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()
- เริ่มต้นระบบ Serial Monitor และเชื่อมต่อ WiFi
- เริ่มการทำงานของเซนเซอร์
tempSensor.begin()และaccel.begin()(พร้อมตั้งสเกล ADXL345 ไปที่ ±16g) - เรียก
learnVibrationBaseline()เพื่อเก็บค่า Calibration พื้นฐานทันทีเมื่อเปิดเครื่อง
ใน loop()
- อ่านค่ากระแส (Irms), อุณหภูมิ (T), และค่าสั่นสะเทือนพร้อม Z-Score
- ประเมินเงื่อนไขความปลอดภัย (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";
}
- แสดงผลออกทาง Serial Monitor
- เรียกฟังก์ชันส่ง 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