ESP32 ช่วยนับเสียงหม้อแรงดัน ครบแล้วส่ง LINE เตือน
ใครเคยทำกับข้าวไป ทำงานไป แล้วต้องคอยจำว่า “เมื่อกี้หม้อดังไปกี่ครั้งแล้ว?” โปรเจกต์นี้ใช้ ESP32 กับ MAX4466 ช่วยฟังเสียงหวีดของหม้อแรงดัน นับให้แบบอัตโนมัติ และเมื่อครบจำนวนที่ตั้งไว้ ก็ส่งข้อความแจ้งเตือนเข้า LINE ได้
ต้นฉบับจาก CircuitDigest ใช้ CircuitDigest Cloud สำหรับตั้งจำนวนเสียงที่ต้องการและดูค่าจาก ESP32 ส่วน Notification เดิมใช้ WhatsApp API แต่สำหรับบทความนี้เราจะปรับเฉพาะส่วนแจ้งเตือน ให้ใช้ LINE Official Account + LINE Messaging API ซึ่งเหมาะกับบริบทการใช้งานในประเทศไทยมากกว่า
Logic การตรวจจับเสียง, Wiring, MAX4466, CircuitDigest Cloud และวิธีนับ Whistle ยังคงอ้างอิงจากโปรเจกต์ต้นฉบับ
- ใช้ ESP32 Dev Kit ร่วมกับ MAX4466 Microphone Amplifier
- MAX4466 OUT ต่อเข้า GPIO34 ซึ่งเป็น ADC1 ของ ESP32
- โปรแกรมอ่านเสียงเป็นช่วง 20 ms และคำนวณ Peak-to-Peak
- Whistle เริ่มเมื่อระดับเสียงสูงกว่า 60 dB และสิ้นสุดเมื่อต่ำกว่า 50 dB
- Current GitHub Code ใช้ Minimum Whistle Duration 100 ms
- หลังนับ Whistle สำเร็จ มี Cooldown 10 วินาทีเพื่อลดการนับเสียงซ้ำ
- CircuitDigest Cloud ใช้ตั้ง Target, Start/Stop และดู Live Count / dB
- บทความนี้เปลี่ยน Notification จาก WhatsApp เป็น LINE Messaging API
โปรเจกต์นี้ทำอะไร?
ระบบจะวาง Microphone Module ไว้ในบริเวณที่สามารถรับเสียงหม้อแรงดันได้ แล้วให้ ESP32 อ่านระดับเสียงอย่างต่อเนื่อง
ผู้ใช้ตั้ง Target จำนวน Whistle จาก Dashboard เช่น 3 ครั้ง แล้วเปิด Listening Mode
เมื่อ ESP32 ตรวจพบเสียง Whistle ที่ผ่านเงื่อนไข ระบบจะเพิ่ม Counter ทีละหนึ่ง และส่งค่ากลับไปยัง Dashboard
เมื่อ Count ถึง Target ระบบจะหยุด Listening และในเวอร์ชันที่ดัดแปลงนี้ จะส่ง Push Message ผ่าน LINE Messaging API
อุปกรณ์ที่ต้องใช้
| อุปกรณ์ | Specification ตามโปรเจกต์ | จำนวน |
|---|---|---|
| Microcontroller | ESP32 Dev Kit / DevKitC | 1 |
| Microphone Amplifier | MAX4466 Electret Microphone Module พร้อม Adjustable Gain | 1 |
| Power | 5V USB Power Supply หรือ Power Bank | 1 |
| Prototype Accessories | Breadboard และ Jumper Wire | ตามต้องการ |
จุดเด่นของโปรเจกต์นี้คือ Hardware ไม่เยอะ เพราะงานตรวจจับทั้งหมดทำจาก Analog Microphone และ Logic ใน ESP32
ต่อ MAX4466 กับ ESP32 อย่างไร?
| MAX4466 | ESP32 | หน้าที่ |
|---|---|---|
| VCC | 3.3V | Power |
| GND | GND | Ground |
| OUT | GPIO34 | Analog Input |
Current Repository ใช้ GPIO34 หรือ ADC1_CH6 ซึ่งเป็น Input-only GPIO และช่วยหลีกเลี่ยงปัญหาที่อาจเกิดจากการใช้ ADC2 พร้อมกับ Wi-Fi บน ESP32
ESP32 รู้ได้อย่างไรว่าเสียงไหนคือ Whistle?
โปรเจกต์นี้ไม่ได้ใช้ AI Classification แต่ใช้การวัดความเปลี่ยนแปลงของ Analog Signal ในช่วงเวลาสั้น ๆ
1. อ่านเสียงในช่วง 20 ms
ESP32 อ่านค่า ADC จาก MAX4466 อย่างต่อเนื่อง ภายใน Sampling Window 20 ms แล้วหา Signal สูงสุดและต่ำสุด
2. หา Peak-to-Peak
ความต่างระหว่างค่าสูงสุดกับค่าต่ำสุด ถูกนำมาใช้เป็น Peak-to-Peak Amplitude
ΔV = Vmax − Vmin
3. แปลงเป็นค่า dB
Current GitHub Code ใช้สมการ:
ค่านี้เป็นส่วนหนึ่งของ Detection Logic ของโปรเจกต์ต้นฉบับ ไม่ควรนำไปถือเป็นเครื่องวัด Sound Pressure Level ที่ผ่านการ Calibration แบบเครื่องมือวัดมาตรฐาน
4. ใช้ Threshold แยก Whistle
| Parameter | Current GitHub Code |
|---|---|
| WHISTLE_ON_DB | 60.0 dB |
| WHISTLE_OFF_DB | 50.0 dB |
| MIN_WHISTLE_MS | 100 ms |
| WHISTLE_COOLDOWN_MS | 10,000 ms / 10 วินาที |
ทำไมต้องมี Cooldown ป้องกันการนับเสียงซ้ำ?
เสียง Whistle หนึ่งครั้งไม่ได้เกิดเป็น Spike จุดเดียวเสมอไป แต่อาจมีเสียงก้องหรือระดับเสียงแกว่งขึ้นลงหลายครั้ง
ถ้าใช้ Threshold อย่างเดียว ระบบมีโอกาสตีความ Whistle เดียวเป็นหลายครั้ง
Current Code จึงมีทั้ง:
- Minimum Whistle Duration เพื่อกรองเสียงกระแทกสั้นเกินไป
- ON Threshold และ OFF Threshold แยกกัน
- Cooldown 10 วินาทีหลัง Whistle ที่นับสำเร็จ
ตั้ง CircuitDigest Cloud Dashboard
Dashboard ทำหน้าที่เป็น Control Panel ของโปรเจกต์ ทั้งกำหนด Target และดูสถานะจาก ESP32
1. Sign up / Login
2. สร้าง Device ใหม่
3. สร้าง Variables
| Variable | หน้าที่ |
|---|---|
| analog-input-1 | ตั้ง Target Whistle Count |
| analog-input-2 | Start / Stop Listening |
| analog-input-3 | Live Whistle Count |
| analog-input-4 | Live Sound Level / dB |
เปลี่ยนจาก WhatsApp เป็น LINE สำหรับใช้งานในไทย
โปรเจกต์ CircuitDigest ต้นฉบับส่ง Notification ผ่าน WhatsApp API แต่เวอร์ชันนี้จะคง Sensor, ESP32, Detection Logic และ Cloud Dashboard เดิม แล้วเปลี่ยนเฉพาะ Notification Layer เป็น LINE Messaging API
ไม่ควรใช้ LINE Notify กับ Tutorial ใหม่แล้ว เพราะบริการ LINE Notify ยุติอย่างเป็นทางการตั้งแต่วันที่ 31 มีนาคม 2025
LINE แนะนำให้ใช้ Messaging API สำหรับกรณีที่ต้องการให้ LINE Official Account ส่งข้อความแจ้งเตือนไปยังผู้ใช้
ตั้ง LINE Official Account + Messaging API
สำหรับเวอร์ชันนี้ต้องมี LINE Official Account ที่เปิดใช้งาน Messaging API แล้ว
ข้อมูลที่ ESP32 ต้องใช้
| ข้อมูล | ใช้ทำอะไร? |
|---|---|
| Channel Access Token | ใช้ยืนยันสิทธิ์เมื่อเรียก LINE Messaging API |
| LINE User ID | ระบุผู้รับ Push Message |
LINE User ID ไม่ใช่เบอร์โทรศัพท์ และไม่ใช่ LINE ID ที่ใช้ค้นหาเพื่อน แต่เป็น User ID ที่ Messaging API ใช้อ้างถึงผู้ใช้
วิธีมาตรฐานวิธีหนึ่งคือรับ User ID จาก Webhook Event เมื่อผู้ใช้ Add Friend หรือส่งข้อความเข้าหา LINE Official Account
Push Message ของ LINE ใช้ Endpoint:
POST https://api.line.me/v2/bot/message/pushพร้อม Header: Authorization: Bearer {channel access token}
Code ส่ง LINE Alert จาก ESP32
ส่วนนี้เป็น เวอร์ชันดัดแปลงสำหรับบทความ Globalbyte ไม่ใช่ Code LINE จาก Repository ต้นฉบับ
เราจะเก็บโครงสร้าง WiFiClientSecure แบบที่โปรเจกต์เดิมใช้ แต่เปลี่ยน Host, Endpoint, Header และ JSON ให้ตรงกับ LINE Push Message API
#include <WiFiClientSecure.h>
#define LINE_CHANNEL_ACCESS_TOKEN "YOUR_LINE_CHANNEL_ACCESS_TOKEN"
#define LINE_USER_ID "YOUR_LINE_USER_ID"
const char* lineHost = "api.line.me";
void sendLineAlert(int completedWhistles) {
WiFiClientSecure client;
// ตัวอย่างนี้คงรูปแบบเดียวกับ Project ต้นฉบับ
// สำหรับ Production ควรใช้ Certificate Validation ที่เหมาะสม
client.setInsecure();
client.setTimeout(5000);
Serial.println("Connecting to LINE Messaging API...");
if (!client.connect(lineHost, 443)) {
Serial.println("LINE API connection failed");
return;
}
String message =
"หม้อแรงดันครบ " + String(completedWhistles) +
" เสียงแล้ว กรุณาตรวจสอบเตา";
String payload =
"{\"to\":\"" + String(LINE_USER_ID) + "\","
"\"messages\":[{"
"\"type\":\"text\","
"\"text\":\"" + message + "\""
"}]}";
client.println("POST /v2/bot/message/push HTTP/1.1");
client.println("Host: api.line.me");
client.println("Authorization: Bearer " +
String(LINE_CHANNEL_ACCESS_TOKEN));
client.println("Content-Type: application/json");
client.println("Connection: close");
client.print("Content-Length: ");
client.println(payload.length());
client.println();
client.print(payload);
unsigned long responseStart = millis();
while (client.connected() && !client.available()) {
if (millis() - responseStart > 5000) {
Serial.println("LINE API response timeout");
client.stop();
return;
}
delay(10);
}
if (client.available()) {
String statusLine = client.readStringUntil('\n');
Serial.println(statusLine);
if (statusLine.indexOf("200") >= 0) {
Serial.println("LINE alert sent successfully");
} else {
Serial.println("LINE alert may have failed");
}
}
while (client.available()) {
Serial.println(client.readStringUntil('\n'));
}
client.stop();
}
จากนั้นเปลี่ยนจุดที่ Code เดิมเรียก:
// Original
// sendWhatsAppAlert(whistleCount);
// LINE adaptation
sendLineAlert(whistleCount);
client.setInsecure() ข้ามการตรวจสอบ TLS Certificate และถูกใช้ที่นี่เพื่อคงโครงสร้าง Demo ให้ใกล้กับต้นฉบับ ไม่ควรถือเป็นรูปแบบ Security สำหรับ Production Deployment และห้ามเผยแพร่ Channel Access Token จริงProgram Flow ทั้งระบบหลังเปลี่ยนเป็น LINE
รูป Program Workflow ของ Source เดิมผูกกับ WhatsApp ดังนั้นบทความนี้ใช้ Flow แบบ HTML เพื่อไม่ทำให้ผู้อ่านสับสน
Dashboard ยังทำหน้าที่เหมือน Project เดิมทั้งหมด ต่างเพียงเมื่อ Target ครบแล้ว ESP32 เรียก sendLineAlert() แทน sendWhatsAppAlert()
Calibration MAX4466 ก่อนใช้งานจริง
Microphone Module มี Trimmer สำหรับปรับ Gain และควร Calibration ให้เหมาะกับสภาพแวดล้อมจริง
Repository อธิบายว่าควรสังเกต Ambient Sound และปรับ Module ให้ค่าห้องเงียบอยู่แถวประมาณ 30–40 dB ใน Logic ของโปรเจกต์
แต่ค่าที่แสดงไม่ได้ควรถูกใช้แทน เครื่องวัด SPL ที่ผ่านการ Calibration เพราะสูตรและ ADC ถูกใช้เป็น Detection Reference ของ Project นี้
ดูการทำงานจริงของโปรเจกต์ต้นฉบับ
วิดีโอนี้เป็น Demo จาก CircuitDigest และยังใช้ Notification Workflow เดิมของต้นฉบับ ส่วนบทความนี้ดัดแปลง Notification เป็น LINE ตาม Section ด้านบน
Troubleshooting
ค่าเสียงห้องเงียบสูงผิดปกติ
ทดลองปรับ Trimmer ของ MAX4466 และตรวจ Wiring ก่อน Repository ระบุว่าหากค่าห้องเงียบติดสูงผิดปกติ แม้ปรับแล้ว อาจต้องลองตรวจหรือเปลี่ยน Module
เสียง Whistle ไม่ถูกตรวจจับ
Source แนะนำให้ปรับ Threshold ให้เหมาะกับเสียงจริง โดยอาจลด WHISTLE_ON_DB หากเสียง Whistle ในสถานที่ใช้งานไม่ถึงค่าที่ตั้งไว้
Wi-Fi หลุด
Current Code ตรวจสถานะ Wi-Fi และ Restart ESP32 เมื่อ Connection หาย ดังนั้นควรตรวจ SSID และ Password ให้ถูกต้องก่อน Debug ส่วนอื่น
LINE ไม่ส่งข้อความ
ตรวจอย่างน้อย 4 จุด:
- Channel Access Token ถูกต้องและยังใช้งานได้
- LINE User ID ถูกต้อง
- ผู้รับสามารถรับ Push Message จาก Official Account ได้
- ESP32 เชื่อมต่อ Internet และเชื่อม
api.line.me:443ได้
FAQ: ESP32 Cooker Whistle Counter + LINE
1. โปรเจกต์นี้ใช้ Sensor อะไรตรวจเสียง?
ใช้ MAX4466 Electret Microphone Amplifier ส่ง Analog Signal เข้า ESP32
2. MAX4466 ต่อ ESP32 GPIO ไหน?
Current Project ใช้ GPIO34 หรือ ADC1_CH6
3. ระบบใช้ AI แยกเสียง Whistle หรือไม่?
ไม่ใช้ AI ระบบใช้ Peak-to-Peak Amplitude, dB Threshold, Minimum Duration และ Cooldown
4. Threshold ที่ใช้เท่าไร?
Current GitHub Code ใช้ 60 dB สำหรับ Whistle ON และ 50 dB สำหรับ Whistle OFF
5. ทำไมบทความ CircuitDigest กับ GitHub บางค่าถึงไม่ตรงกัน?
Source Article บางช่วงยังระบุ Minimum Duration และ Cooldown ต่างจาก Current Repository บทความนี้จึงยึด Current GitHub Code สำหรับรายละเอียด Program Logic
6. Current Code ใช้ Minimum Whistle Duration เท่าไร?
100 ms
7. Cooldown หลังนับ Whistle เท่าไร?
Current GitHub Code ใช้ 10 วินาที
8. ทำไมไม่ใช้ LINE Notify?
LINE Notify ยุติบริการแล้วตั้งแต่ 31 มีนาคม 2025 Tutorial นี้จึงใช้ LINE Messaging API ผ่าน LINE Official Account แทน
9. ส่ง LINE ด้วยเบอร์โทรศัพท์ได้หรือไม่?
ไม่ใช่ในรูปแบบ Push Message นี้ LINE Messaging API ใช้ LINE User ID เป็นตัวระบุผู้รับ
10. ต้องมี LINE Official Account หรือไม่?
ต้องมี Official Account ที่เปิดใช้งาน Messaging API สำหรับ Architecture ที่บทความนี้ใช้
11. ยังต้องใช้ CircuitDigest Cloud หรือไม่?
ใช้ เพราะบทความนี้เปลี่ยนเฉพาะ Notification Layer ส่วน Dashboard และ Variables ยังคงใช้ CircuitDigest Cloud ตามต้นฉบับ
12. LINE กับ CircuitDigest Cloud ทำหน้าที่ซ้ำกันหรือไม่?
ไม่เหมือนกัน CircuitDigest Cloud เป็น Dashboard และ Device Control ส่วน LINE ใช้เป็น Notification Channel เมื่อ Count ถึง Target
13. ระบบปิดเตาให้อัตโนมัติหรือไม่?
ไม่ Source ไม่มี Relay หรือระบบควบคุมเตา โปรเจกต์นี้ทำหน้าที่ตรวจจับ นับ และแจ้งเตือนเท่านั้น
14. สามารถใช้ Threshold เดียวกันได้ทุกครัวหรือไม่?
ไม่ควรรับประกันเช่นนั้น ระยะติดตั้งและ Ambient Noise ต่างกัน จึงควร Calibration และทดสอบกับสถานที่จริง
15. Repository ที่ดาวน์โหลดเป็นเวอร์ชัน LINE แล้วหรือยัง?
ไม่ GitHub ต้นฉบับยังใช้ WhatsApp Alert ส่วน LINE Code ในบทความนี้เป็นเวอร์ชันดัดแปลง จาก Project เดิมร่วมกับ Official LINE Messaging API
สรุป: เปลี่ยนหม้อธรรมดาให้มีตัวช่วยนับเสียงด้วย ESP32
จุดที่น่าสนใจของโปรเจกต์นี้คือ ไม่จำเป็นต้องใช้ AI หรือ Hardware ซับซ้อน ก็สามารถนำ Analog Microphone มาสร้าง IoT Project ที่แก้ Pain Point ในชีวิตประจำวันได้
MAX4466 ทำหน้าที่รับเสียง ESP32 วิเคราะห์ระดับเสียงและนับ Whistle ส่วน CircuitDigest Cloud ช่วยตั้ง Target และดูข้อมูลแบบ Real-time
สำหรับเวอร์ชัน Globalbyte เราปรับ Notification Layer จาก WhatsApp เป็น LINE Messaging API เพื่อให้เข้ากับการใช้งานในประเทศไทยมากขึ้น โดยไม่เปลี่ยน Detection Logic ของ Project ต้นฉบับ
สิ่งสำคัญคือระบบนี้ควรถูกมองเป็น ตัวช่วยนับและแจ้งเตือน ไม่ใช่ระบบ Safety ที่ใช้แทนการดูแลเตาหรือหม้อแรงดัน
โปรเจกต์นี้มี Code และ Cloud Setup หลายขั้น แนะนำอ่านต้นฉบับควบคู่กัน
Repository ต้นฉบับยังใช้ WhatsApp Notification ดังนั้นถ้าดาวน์โหลด Source Code ให้เปรียบเทียบกับ Section LINE Adaptation ในบทความนี้ ก่อน Upload ลง ESP32
อ่าน Tutorial ฉบับเต็มจาก CircuitDigest
เปิด GitHub Repository ต้นฉบับ
References / แหล่งข้อมูลต้นฉบับ
- CircuitDigest — Build a Smart Cooker Whistle Counter Using ESP32
- GitHub — Smart Cooker Whistle Counter using ESP32
- LINE Developers — Send messages with the Messaging API
- LINE Developers — Messaging API Reference
- LINE Developers — Receive Webhook Events and User IDs
- LINE Developers — LINE Notify Service Termination
- YouTube — ESP32 Smart Cooker Whistle Counter Demo
อยากเริ่ม Project ESP32 หรือ IoT แบบนี้?
ถ้ากำลังทดลอง ESP32, Microphone Sensor, Development Board หรืออุปกรณ์สำหรับ IoT Project สามารถสอบถามทีม Globalbyte เรื่องบอร์ดและอุปกรณ์ที่เหมาะกับ Project ได้
ส่วน LINE Messaging API ในบทความนี้ เป็นการดัดแปลง Notification Layer จากโปรเจกต์ CircuitDigest ต้นฉบับซึ่งใช้ WhatsApp โดยอ้างอิง Endpoint และ Request Structure จาก Official LINE Messaging API
LINE Notify ยุติบริการแล้วตั้งแต่วันที่ 31 มีนาคม 2025 ดังนั้นบทความนี้จึงใช้ LINE Official Account และ Messaging API แทน
ห้ามเผยแพร่ Wi-Fi Password, CircuitDigest API Key, Connection Key, LINE Channel Access Token หรือ Credential จริงใน GitHub หรือพื้นที่สาธารณะ
ค่า dB ที่คำนวณในโปรเจกต์นี้ใช้สำหรับ Detection Logic และไม่ควรถือเป็นค่าจาก Sound Level Meter ที่ผ่านการ Calibration ตามมาตรฐาน
โปรเจกต์นี้ไม่ใช่อุปกรณ์ Safety และไม่ได้ตรวจแรงดัน อุณหภูมิ สถานะเตา หรือสั่งปิดเตาอัตโนมัติ ผู้ใช้ยังต้องดูแลการใช้งาน Pressure Cooker ตามคำแนะนำของผู้ผลิตและหลักความปลอดภัยตามปกติ