สวัสดีครับนักศึกษาทุกคน ในบทที่แล้วเราสั่งงานและดูค่าผ่านมือถือได้แล้ว แต่ลองจินตนาการดูนะครับ… ถ้าเราทำ “ระบบเตือนไฟไหม้” เราคงไม่ได้เปิดจอมือถือดูตลอด 24 ชั่วโมงจริงไหมครับ? เราต้องการให้มือถือสั่นหรือส่งเสียงเตือนทันทีที่อุณหภูมิสูงเกินกำหนด

ในบทนี้เราจะมาเรียนรู้วิธีเขียนโปรแกรมให้ ESP32 ตัดสินใจ “แจ้งเตือน” (Push Notification) เข้ามือถือของเราผ่าน Blynk โดยใช้ฟีเจอร์ที่เรียกว่า Events และเทคนิคการเขียนโค้ดเพื่อป้องกันไม่ให้แจ้งเตือนรัวจนมือถือค้างครับ


1. สร้าง Event บนหน้าเว็บ (Web Console)

ใน Blynk รุ่นใหม่ การจะส่งข้อความเตือนได้ เราต้องไปลงทะเบียน “เหตุการณ์” (Event) ไว้บนเว็บก่อนครับ ไม่สามารถส่งข้อความมั่วๆ จากโค้ดได้เหมือนรุ่นเก่า

  1. Login เข้า blynk.cloud
  2. ไปที่เมนู Templates -> เลือก Template เดิมของเรา
  3. กดแถบ Events ด้านบน
  4. กด + Add New Event
    • Event Name: ตั้งชื่อ เช่น High Temp Alarm
    • Event Code: ตั้งรหัสที่จะเอาไปใช้ในโค้ด (ห้ามวรรค) เช่น high_temp <– จำคำนี้ให้ดี!
    • Type: เลือก Critical (สีแดง) หรือ Warning (สีเหลือง)
    • Description: ใส่ข้อความที่จะให้เด้งเตือน เช่น “อันตราย! อุณหภูมิสูงเกินกำหนดแล้ว”
  5. ไปที่แถบ Notifications (ในหน้าต่างเดียวกัน)
    • ติ๊กถูกช่อง Send notification to
    • เลือก Device Owner (ส่งหาเจ้าของเครื่อง)
  6. กด Create และอย่าลืมกด Save มุมขวาบนของ Template

2. คำสั่ง Blynk.logEvent()

เมื่อเราตั้งค่าเสร็จแล้ว ใน Arduino IDE เราจะใช้คำสั่งนี้เพื่อสั่งยิงแจ้งเตือนครับ:

C++
Blynk.logEvent("high_temp"); 
// ใส่ Event Code ที่เราตั้งไว้ในขั้นตอนที่ 1

และถ้าอยากแนบข้อความเพิ่มเติมไปแบบ Real-time ก็ทำได้:

C++
Blynk.logEvent("high_temp", "รีบกลับบ้านด่วน! ไฟไหม้แล้ว!");

3. กับดักยอดฮิต: การแจ้งเตือนรัว (Flooding)

นี่คือจุดที่นักศึกษาตกม้าตายบ่อยที่สุด! ลองดูโค้ดนี้ครับ:

C++
// ** โค้ดที่ผิด (ห้ามทำตาม) **
void loop() {
  Blynk.run();
  int temp = readTemp();
  if (temp > 40) {
    Blynk.logEvent("high_temp"); // ส่งแจ้งเตือน
  }
}

เกิดอะไรขึ้น? เนื่องจาก loop ทำงานเร็วมาก (เป็นพันครั้งต่อวินาที) ถ้านักศึกษาใช้วิธีนี้ มือถือจะสั่นรัวๆ เป็นพันครั้งจนค้าง และ Blynk Server จะแบน (Ban) บอร์ดของเราชั่วคราวข้อหา Spam ครับ

ทางแก้: เราต้องใช้ตัวแปร Flag (ธงบอกสถานะ) มาช่วยจำว่า “เตือนไปแล้วนะ อย่าเพิ่งเตือนซ้ำ”


4. ปฏิบัติการ: ระบบเตือนความร้อนพร้อมระบบกัน Spam

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

โค้ดโปรแกรม:

C++
// ... (ส่วนประกาศ Library และ Template ID เหมือนบทที่แล้ว) ...

BlynkTimer timer;
bool isNotified = false; // ตัวแปร Flag (ธง) เริ่มต้นเป็นเท็จ

void checkSensor() {
  // จำลองค่าความร้อน (สุ่ม 0-100)
  int temp = random(50, 100); 
  
  // ส่งค่าไปโชว์ที่ Gauge V1
  Blynk.virtualWrite(V1, temp);
  Serial.print("Temp: ");
  Serial.println(temp);

  // --- ตรรกะการแจ้งเตือน ---
  if (temp > 80 && isNotified == false) {
    // เงื่อนไข: ร้อนเกิน 80 และ "ยังไม่เคยแจ้งเตือน"
    
    Serial.println("ALARM! Sending Notification...");
    Blynk.logEvent("high_temp", "อุณหภูมิสูงเกิน 80 องศาแล้ว!");
    
    isNotified = true; // ปักธงว่า "แจ้งแล้วนะ" ครั้งหน้าจะได้ไม่เข้าเงื่อนไขนี้อีก
  }
  else if (temp < 75 && isNotified == true) {
    // เงื่อนไขรีเซ็ต: อุณหภูมิลดลงต่ำกว่า 75 และ "เคยแจ้งเตือนไปแล้ว"
    // (ใช้ 75 แทน 80 เพื่อทำ Hysteresis ป้องกันค่าแกว่ง)
    
    Serial.println("Normal. Reset Flag.");
    isNotified = false; // เอาธงออก เตรียมพร้อมแจ้งเตือนรอบใหม่
  }
}

void setup() {
  // ... (เชื่อมต่อ WiFi และ Blynk เหมือนเดิม) ...
  timer.setInterval(2000L, checkSensor); // เช็คทุก 2 วินาที
}

void loop() {
  Blynk.run();
  timer.run();
}

5. ทดสอบผลลัพธ์

  1. Upload โค้ดลงบอร์ด
  2. เปิด Serial Monitor ดูค่าที่สุ่มออกมา
  3. รอจนกว่าค่าจะเกิน 80:
    • ที่ Serial Monitor จะขึ้นว่า ALARM! ...
    • ที่มือถือ จะมี Notification เด้งเตือนลงมาทันที!
  4. สังเกตต่อ: แม้ค่าจะยังเกิน 80 อยู่ (เช่น 85, 90) มันจะไม่แจ้งเตือนซ้ำแล้ว (เพราะติด Flag)
  5. รอจนกว่าค่าจะต่ำกว่า 75: ระบบจะรีเซ็ต และพร้อมเตือนใหม่เมื่อร้อนขึ้นอีกครั้ง

สรุปท้ายบท

การใช้ Events ร่วมกับ Flag Logic คือหัวใจของการสร้างระบบ Automation ที่มีความเสถียรครับ เทคนิคนี้ไม่ได้ใช้แค่กับการแจ้งเตือน แต่ใช้กับการสั่งเปิด-ปิดพัดลม หรือปั๊มน้ำอัตโนมัติได้ด้วย เพื่อป้องกันไม่ให้อุปกรณ์ทำงานตัด-ต่อถี่เกินไปจนพังครับ

ภารกิจต่อไป: ตอนนี้เราได้ระบบ Real-time ที่สมบูรณ์แล้ว แต่… ถ้าเราอยากดูข้อมูลย้อนหลังล่ะ? ว่าเมื่อวานอุณหภูมิเป็นเท่าไหร่? หรืออยากเก็บสถิติการใช้ไฟ? ในบทความหน้า เราจะมาพูดถึงเรื่อง “Database & Data Logging” การเก็บข้อมูลลงฐานข้อมูลและการดึงมาแสดงผลครับ


หมายเหตุ:

  • จุดที่ยากสำหรับบทนี้คือ Logic (ตรรกะ) ของ Flag (isNotified) และ Hysteresis (ร้อนเกิน 80 ตัดที่ 75) ครับ อาจจะต้องอธิบายเสริมบนกระดานให้นักศึกษาเห็นภาพ State Machine ง่ายๆ
  • อย่าลืมย้ำนักศึกษาให้ไปสร้าง Event บนเว็บก่อนเขียนโค้ด ไม่งั้นคำสั่ง logEvent จะไม่ทำงานครับ