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 Smart Cooker Whistle Counter พร้อม MAX4466
Smart Cooker Whistle Counter จาก CircuitDigest ใช้ ESP32 และ MAX4466 ตรวจจับและนับเสียงหวีดของหม้อแรงดัน
Key Takeaways
  • ใช้ 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 อ่านระดับเสียงอย่างต่อเนื่อง

Pressure CookerMAX4466ESP32 ADCWhistle DetectionCounterCircuitDigest CloudLINE Alert

ผู้ใช้ตั้ง Target จำนวน Whistle จาก Dashboard เช่น 3 ครั้ง แล้วเปิด Listening Mode

เมื่อ ESP32 ตรวจพบเสียง Whistle ที่ผ่านเงื่อนไข ระบบจะเพิ่ม Counter ทีละหนึ่ง และส่งค่ากลับไปยัง Dashboard

เมื่อ Count ถึง Target ระบบจะหยุด Listening และในเวอร์ชันที่ดัดแปลงนี้ จะส่ง Push Message ผ่าน LINE Messaging API

โปรเจกต์นี้เป็นตัวช่วยแจ้งเตือน ไม่ใช่ระบบควบคุมความปลอดภัย: ESP32 ไม่ได้ปิดเตา ไม่ได้อ่านแรงดันในหม้อ และไม่ได้ตรวจว่าอาหารสุกหรือไม่

อุปกรณ์ที่ต้องใช้

อุปกรณ์ 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 อย่างไร?

Circuit Diagram ต่อ MAX4466 Microphone Module กับ ESP32 GPIO34
Wiring Diagram จาก CircuitDigest: MAX4466 ส่ง Analog Signal เข้า GPIO34 ของ 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

Peak-to-Peak:
ΔV = Vmax − Vmin

3. แปลงเป็นค่า dB

Current GitHub Code ใช้สมการ:

dB = 41.52 × log10(ΔV) + 64.02

ค่านี้เป็นส่วนหนึ่งของ 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 วินาที
หมายเหตุเรื่อง Source: ข้อความบางช่วงในบทความ CircuitDigest ระบุ Minimum Duration และ Cooldown ต่างจาก Current GitHub Sketch ดังนั้นบทความนี้ยึดค่าจาก Repository ปัจจุบันเป็นหลัก: 100 ms และ 10 วินาที

ทำไมต้องมี Cooldown ป้องกันการนับเสียงซ้ำ?

เสียง Whistle หนึ่งครั้งไม่ได้เกิดเป็น Spike จุดเดียวเสมอไป แต่อาจมีเสียงก้องหรือระดับเสียงแกว่งขึ้นลงหลายครั้ง

ถ้าใช้ Threshold อย่างเดียว ระบบมีโอกาสตีความ Whistle เดียวเป็นหลายครั้ง

Current Code จึงมีทั้ง:

  • Minimum Whistle Duration เพื่อกรองเสียงกระแทกสั้นเกินไป
  • ON Threshold และ OFF Threshold แยกกัน
  • Cooldown 10 วินาทีหลัง Whistle ที่นับสำเร็จ
เสียงสูงกว่า 60 dBอยู่นาน ≥ 100 msลดต่ำกว่า 50 dBCount +1Cooldown 10 s

ตั้ง CircuitDigest Cloud Dashboard

Dashboard ทำหน้าที่เป็น Control Panel ของโปรเจกต์ ทั้งกำหนด Target และดูสถานะจาก ESP32

1. Sign up / Login

หน้า Sign up และ Login ของ CircuitDigest Cloud
เริ่มจากสมัครหรือเข้าสู่ระบบ CircuitDigest Cloud

2. สร้าง Device ใหม่

หน้าสร้าง Device ใหม่ใน CircuitDigest Cloud
เพิ่ม Device สำหรับ ESP32 Cooker Whistle Counter

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
หน้าสร้าง Variable ใหม่ใน CircuitDigest Cloud
สร้าง Variable สำหรับรับและส่งข้อมูลกับ ESP32
รายการ Variables ของ Cooker Whistle Counter
รายการ Variables ที่ใช้ในโปรเจกต์
การเพิ่ม Widget ใน CircuitDigest Cloud Dashboard
เพิ่ม Slider, Switch และตัวแสดงค่าให้สัมพันธ์กับ Variables

เปลี่ยนจาก 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 ส่งข้อความแจ้งเตือนไปยังผู้ใช้

Target ReachedESP32HTTPS POSTLINE Messaging APILINE 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

อย่าใส่ Token จริงลง GitHub: Channel Access Token เป็น Credential ควรเก็บเป็นความลับ ตัวอย่าง Code ในบทความจึงใช้ Placeholder เท่านั้น

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

ESP32 LINE Messaging API Adaptation
#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 เดิมเรียก:

Replace Notification Call
// Original
// sendWhatsAppAlert(whistleCount);

// LINE adaptation
sendLineAlert(whistleCount);
Security: client.setInsecure() ข้ามการตรวจสอบ TLS Certificate และถูกใช้ที่นี่เพื่อคงโครงสร้าง Demo ให้ใกล้กับต้นฉบับ ไม่ควรถือเป็นรูปแบบ Security สำหรับ Production Deployment และห้ามเผยแพร่ Channel Access Token จริง

Program Flow ทั้งระบบหลังเปลี่ยนเป็น LINE

รูป Program Workflow ของ Source เดิมผูกกับ WhatsApp ดังนั้นบทความนี้ใช้ Flow แบบ HTML เพื่อไม่ทำให้ผู้อ่านสับสน

Boot ESP32Connect Wi-FiCircuitDigest CloudRead MAX4466Calculate dBDetect WhistleCount +1Compare TargetSend LINE PushStop Listening

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 นี้

ห้าม Copy Threshold แบบตายตัว: ห้องครัวแต่ละแห่งมีเสียงพื้นหลัง, ระยะจาก Microphone, เสียงพัดลม และเสียงภาชนะต่างกัน จึงอาจต้องปรับ Threshold หลังทดลองจริง

ดูการทำงานจริงของโปรเจกต์ต้นฉบับ

วิดีโอนี้เป็น 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 ต้นฉบับ

ดาวน์โหลด Source Code ต้นฉบับแบบ ZIP

อ่าน Official LINE Messaging API — Send Messages

References / แหล่งข้อมูลต้นฉบับ

อยากเริ่ม Project ESP32 หรือ IoT แบบนี้?

ถ้ากำลังทดลอง ESP32, Microphone Sensor, Development Board หรืออุปกรณ์สำหรับ IoT Project สามารถสอบถามทีม Globalbyte เรื่องบอร์ดและอุปกรณ์ที่เหมาะกับ Project ได้

Disclaimer: บทความนี้เป็นการสรุปและเรียบเรียงจากแหล่งข้อมูลภาษาอังกฤษ อาจมีความคลาดเคลื่อน กรุณาตรวจสอบ Source ต้นฉบับก่อนลงมือทำ

ส่วน 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 ตามคำแนะนำของผู้ผลิตและหลักความปลอดภัยตามปกติ

 

แท็ก


Blog posts