สวัสดีครับนักศึกษาทุกคน ในบทที่แล้วเราสั่งงานและดูค่าผ่านมือถือได้แล้ว แต่ลองจินตนาการดูนะครับ… ถ้าเราทำ “ระบบเตือนไฟไหม้” เราคงไม่ได้เปิดจอมือถือดูตลอด 24 ชั่วโมงจริงไหมครับ? เราต้องการให้มือถือสั่นหรือส่งเสียงเตือนทันทีที่อุณหภูมิสูงเกินกำหนด
ในบทนี้เราจะมาเรียนรู้วิธีเขียนโปรแกรมให้ ESP32 ตัดสินใจ “แจ้งเตือน” (Push Notification) เข้ามือถือของเราผ่าน Blynk โดยใช้ฟีเจอร์ที่เรียกว่า Events และเทคนิคการเขียนโค้ดเพื่อป้องกันไม่ให้แจ้งเตือนรัวจนมือถือค้างครับ
1. สร้าง Event บนหน้าเว็บ (Web Console)
ใน Blynk รุ่นใหม่ การจะส่งข้อความเตือนได้ เราต้องไปลงทะเบียน “เหตุการณ์” (Event) ไว้บนเว็บก่อนครับ ไม่สามารถส่งข้อความมั่วๆ จากโค้ดได้เหมือนรุ่นเก่า
- Login เข้า blynk.cloud
- ไปที่เมนู Templates -> เลือก Template เดิมของเรา
- กดแถบ Events ด้านบน
- กด + Add New Event
- Event Name: ตั้งชื่อ เช่น
High Temp Alarm - Event Code: ตั้งรหัสที่จะเอาไปใช้ในโค้ด (ห้ามวรรค) เช่น
high_temp<– จำคำนี้ให้ดี! - Type: เลือก
Critical(สีแดง) หรือWarning(สีเหลือง) - Description: ใส่ข้อความที่จะให้เด้งเตือน เช่น “อันตราย! อุณหภูมิสูงเกินกำหนดแล้ว”
- Event Name: ตั้งชื่อ เช่น
- ไปที่แถบ Notifications (ในหน้าต่างเดียวกัน)
- ติ๊กถูกช่อง Send notification to
- เลือก Device Owner (ส่งหาเจ้าของเครื่อง)
- กด Create และอย่าลืมกด Save มุมขวาบนของ Template
2. คำสั่ง Blynk.logEvent()
เมื่อเราตั้งค่าเสร็จแล้ว ใน Arduino IDE เราจะใช้คำสั่งนี้เพื่อสั่งยิงแจ้งเตือนครับ:
Blynk.logEvent("high_temp");
// ใส่ Event Code ที่เราตั้งไว้ในขั้นตอนที่ 1
และถ้าอยากแนบข้อความเพิ่มเติมไปแบบ Real-time ก็ทำได้:
Blynk.logEvent("high_temp", "รีบกลับบ้านด่วน! ไฟไหม้แล้ว!");
3. กับดักยอดฮิต: การแจ้งเตือนรัว (Flooding)
นี่คือจุดที่นักศึกษาตกม้าตายบ่อยที่สุด! ลองดูโค้ดนี้ครับ:
// ** โค้ดที่ผิด (ห้ามทำตาม) **
void loop() {
Blynk.run();
int temp = readTemp();
if (temp > 40) {
Blynk.logEvent("high_temp"); // ส่งแจ้งเตือน
}
}
เกิดอะไรขึ้น? เนื่องจาก loop ทำงานเร็วมาก (เป็นพันครั้งต่อวินาที) ถ้านักศึกษาใช้วิธีนี้ มือถือจะสั่นรัวๆ เป็นพันครั้งจนค้าง และ Blynk Server จะแบน (Ban) บอร์ดของเราชั่วคราวข้อหา Spam ครับ
ทางแก้: เราต้องใช้ตัวแปร Flag (ธงบอกสถานะ) มาช่วยจำว่า “เตือนไปแล้วนะ อย่าเพิ่งเตือนซ้ำ”
4. ปฏิบัติการ: ระบบเตือนความร้อนพร้อมระบบกัน Spam
เราจะเขียนโปรแกรมจำลองว่า ถ้าอุณหภูมิ (ค่า Random) เกิน 80 ให้แจ้งเตือนแค่ครั้งเดียว และจะแจ้งเตือนใหม่ได้อีกครั้งก็ต่อเมื่ออุณหภูมิลดลงสู่ปกติแล้วเท่านั้น
โค้ดโปรแกรม:
// ... (ส่วนประกาศ 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. ทดสอบผลลัพธ์
- Upload โค้ดลงบอร์ด
- เปิด Serial Monitor ดูค่าที่สุ่มออกมา
- รอจนกว่าค่าจะเกิน 80:
- ที่ Serial Monitor จะขึ้นว่า
ALARM! ... - ที่มือถือ จะมี Notification เด้งเตือนลงมาทันที!
- ที่ Serial Monitor จะขึ้นว่า
- สังเกตต่อ: แม้ค่าจะยังเกิน 80 อยู่ (เช่น 85, 90) มันจะไม่แจ้งเตือนซ้ำแล้ว (เพราะติด Flag)
- รอจนกว่าค่าจะต่ำกว่า 75: ระบบจะรีเซ็ต และพร้อมเตือนใหม่เมื่อร้อนขึ้นอีกครั้ง
สรุปท้ายบท
การใช้ Events ร่วมกับ Flag Logic คือหัวใจของการสร้างระบบ Automation ที่มีความเสถียรครับ เทคนิคนี้ไม่ได้ใช้แค่กับการแจ้งเตือน แต่ใช้กับการสั่งเปิด-ปิดพัดลม หรือปั๊มน้ำอัตโนมัติได้ด้วย เพื่อป้องกันไม่ให้อุปกรณ์ทำงานตัด-ต่อถี่เกินไปจนพังครับ
ภารกิจต่อไป: ตอนนี้เราได้ระบบ Real-time ที่สมบูรณ์แล้ว แต่… ถ้าเราอยากดูข้อมูลย้อนหลังล่ะ? ว่าเมื่อวานอุณหภูมิเป็นเท่าไหร่? หรืออยากเก็บสถิติการใช้ไฟ? ในบทความหน้า เราจะมาพูดถึงเรื่อง “Database & Data Logging” การเก็บข้อมูลลงฐานข้อมูลและการดึงมาแสดงผลครับ
หมายเหตุ:
- จุดที่ยากสำหรับบทนี้คือ Logic (ตรรกะ) ของ Flag (
isNotified) และ Hysteresis (ร้อนเกิน 80 ตัดที่ 75) ครับ อาจจะต้องอธิบายเสริมบนกระดานให้นักศึกษาเห็นภาพ State Machine ง่ายๆ - อย่าลืมย้ำนักศึกษาให้ไปสร้าง Event บนเว็บก่อนเขียนโค้ด ไม่งั้นคำสั่ง
logEventจะไม่ทำงานครับ
