📑 เนื้อหาในบทความ
📌 ภาพรวมโปรเจกต์
ในช่วงเทศกาลสงกรานต์และฤดูร้อน การมีระบบตรวจสอบระดับน้ำในถังเก็บน้ำเป็นสิ่งสำคัญ เพื่อไม่ให้น้ำหมดหรือล้นเกิน บทความนี้จะพาคุณสร้างระบบวัดระดับน้ำด้วย ESP32 และ Ultrasonic Sensor (HC-SR04) พร้อมส่งข้อมูลไปยังแพลตฟอร์ม CynoIoT และแจ้งเตือนผ่าน Line Notify
✨ จุดเด่นของโปรเจกต์
- • วัดระดับน้ำได้แม่นยำ 误差 < 2cm
- • แจ้งเตือนเมื่อน้ำเกือบหมดหรือเกินเกณฑ์
- • ตรวจสอบได้ผ่าน CynoIoT Dashboard
- • ประหยัดไฟด้วย Deep Sleep Mode
หลักการทำงาน
Ultrasonic Sensor จะส่งคลื่นเสียงความถี่สูงและวัดเวลาที่ใช้สะท้อนกลับจากผิวน้ำ จากนั้น ESP32 จะคำนวณระยะทางและแปลงเป็นระดับน้ำเป็นเปอร์เซ็นต์ ข้อมูลจะถูกส่งไปยัง CynoIoT Platform และแจ้งเตือนผ่าน Line Notify
🔧 อุปกรณ์ที่ต้องใช้
⚡ Hardware
ESP32 DevKit
ไมโครคอนโทรลเลอร์หลัก
~฿150
HC-SR04 Ultrasonic Sensor
เซ็นเซอร์วัดระยะทาง
~฿40
Jumper Wires
สายเชื่อมต่อ
~฿30
Breadboard (Optional)
บอร์ดทดลอง
~฿50
💻 Software & Tools
Arduino IDE
สำหรับเขียนและอัปโหลดโค้ด
CynoIoT Account
แพลตฟอร์ม IoT (ฟรี)
Line Notify Token
สำหรับแจ้งเตือน (ฟรี)
USB Cable
Micro USB สำหรับ ESP32
💡 คำแนะนำ
ราคาอุปกรณ์โดยประมาณ: ~฿270 (ไม่รวมถังน้ำ) สามารถซื้ออุปกรณ์เหล่านี้ได้ที่ร้านขายอุปกรณ์อิเล็กทรอนิกส์ทั่วไป
🔌 การต่อวงจร
ขาของ HC-SR04 Ultrasonic Sensor
| ขา HC-SR04 | เชื่อมต่อกับ | คำอธิบาย |
|---|---|---|
| VCC | 5V หรือ 3.3V | ไฟเลี้ยง |
| Trig | GPIO 5 (D5) | ส่งสัญญาณ Trigger |
| Echo | GPIO 18 (D18) | รับสัญญาณ Echo |
| GND | GND | กราวด์ |
⚠️ ข้อควรระวัง
- • HC-SR04 ใช้ไฟ 5V แต่ ESP32 ใช้ไฟ 3.3V ควรใช้ตัวต้านทานลดแรงดันที่ขา Echo
- • หรือใช้ Logic Level Converter เพื่อความปลอดภัย
- • ตรวจสอบการต่อขาก่อนเชื่อมต่อกับไฟเลี้ยง
การติดตั้งถังน้ำ
1. ติดตั้ง Ultrasonic Sensor ที่ฝาถังน้ำด้านบนสุด
2. วัดความสูงของถังน้ำ (เช่น 200 cm)
3. ตั้งค่า threshold สำหรับแจ้งเตือน (เช่น 20% และ 90%)
4. ติดตั้ง ESP32 ในกล่องกันน้ำ
💻 โค้ดโปรแกรม
ส่วนที่ 1: การตั้งค่าและการวัดระยะทาง
// ตั้งค่าขา GPIO สำหรับ Ultrasonic Sensor
const int trigPin = 5; // Trigger Pin
const int echoPin = 18; // Echo Pin
// ตั้งค่าความสูงของถังน้ำ (เซนติเมตร)
const float tankHeight = 200.0; // ปรับตามขนาดถังจริง
// ตั้งค่า threshold สำหรับแจ้งเตือน (เปอร์เซ็นต์)
const int lowLevelThreshold = 20; // แจ้งเตือนเมื่อน้ำเหลือ 20%
const int highLevelThreshold = 90; // แจ้งเตือนเมื่อน้ำเกิน 90%
// ตั้งค่า WiFi
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
// ตัวแปรสำหรับเก็บข้อมูล
float duration, distance;
float waterLevel, waterPercent;
unsigned long lastTime = 0;
const long interval = 60000; // อ่านค่าทุก 60 วินาที
void setup() {
Serial.begin(115200);
// ตั้งค่าขา Ultrasonic Sensor
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// เชื่อมต่อ WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
}
void loop() {
unsigned long currentTime = millis();
// อ่านค่าระยะทางทุก 60 วินาที
if (currentTime - lastTime >= interval) {
lastTime = currentTime;
// ส่งสัญญาณ Trigger
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// อ่านค่า Echo
duration = pulseIn(echoPin, HIGH);
// คำนวณระยะทาง (cm)
distance = duration * 0.034 / 2;
// คำนวณระดับน้ำ
waterLevel = tankHeight - distance;
waterPercent = (waterLevel / tankHeight) * 100;
// แสดงผลใน Serial Monitor
Serial.printf("Distance: %.2f cm | Water Level: %.2f%%\n",
distance, waterPercent);
// ตรวจสอบ threshold และแจ้งเตือน
checkThresholds();
// TODO: ส่งข้อมูลไปยัง CynoIoT
// sendToCynoIoT(waterLevel, waterPercent);
}
}ส่วนที่ 2: ฟังก์ชันตรวจสอบและแจ้งเตือน
#include <WiFi.h>
#include <HTTPClient.h>
// Line Notify Token
const char* lineToken = "YOUR_LINE_NOTIFY_TOKEN";
// ฟังก์ชันตรวจสอบ threshold และแจ้งเตือน
void checkThresholds() {
static bool lowAlertSent = false;
static bool highAlertSent = false;
// ตรวจสอบระดับน้ำต่ำ
if (waterPercent <= lowLevelThreshold && !lowAlertSent) {
String message = "⚠️ แจ้งเตือน: ระดับน้ำในถังเหลือน้อย!\n";
message += "ระดับน้ำปัจจุบัน: " + String(waterPercent, 1) + "%\n";
message += "กรุณาเติมน้ำเพิ่ม";
sendLineNotify(message);
lowAlertSent = true;
highAlertSent = false; // Reset high alert
}
// ตรวจสอบระดับน้ำสูง
if (waterPercent >= highLevelThreshold && !highAlertSent) {
String message = "✅ แจ้งเตือน: ระดับน้ำในถังเต็มแล้ว!\n";
message += "ระดับน้ำปัจจุบัน: " + String(waterPercent, 1) + "%\n";
message += "สามารถหยุดเติมน้ำได้แล้ว";
sendLineNotify(message);
highAlertSent = true;
lowAlertSent = false; // Reset low alert
}
// Reset alerts เมื่อระดับน้ำปกติ
if (waterPercent > lowLevelThreshold + 10 &&
waterPercent < highLevelThreshold - 10) {
lowAlertSent = false;
highAlertSent = false;
}
}
// ฟังก์ชันส่งข้อความ Line Notify
void sendLineNotify(String message) {
HTTPClient http;
http.begin("https://notify-api.line.me/api/notify");
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
http.addHeader("Authorization", "Bearer " + String(lineToken));
String httpRequestData = "message=" + message;
int httpResponseCode = http.POST(httpRequestData);
if (httpResponseCode > 0) {
Serial.print("Line Notify sent. Response code: ");
Serial.println(httpResponseCode);
} else {
Serial.print("Error sending Line Notify. Response code: ");
Serial.println(httpResponseCode);
}
http.end();
}🌐 เชื่อมต่อ CynoIoT Platform
CynoIoT Platform ช่วยให้คุณตรวจสอบข้อมูลระดับน้ำได้ทุกที่ทุกเวลาผ่าน Dashboard และเก็บประวัติข้อมูลไว้วิเคราะห์
✨ ขั้นตอนการเชื่อมต่อ
- สมัครสมาชิกและสร้าง Device ใน CynoIoT Dashboard
- รับ API Key และ Device ID
- เพิ่ม Library สำหรับ CynoIoT ใน Arduino IDE
- อัปเดตโค้ดเพื่อส่งข้อมูลไปยัง CynoIoT
โค้ดเพิ่มเติมสำหรับ CynoIoT
// ตั้งค่า CynoIoT
const char* cynoiotApiKey = "YOUR_CYNOIOT_API_KEY";
const char* cynoiotDeviceId = "YOUR_DEVICE_ID";
const char* cynoiotServer = "api.cynoiot.com";
// ฟังก์ชันส่งข้อมูลไปยัง CynoIoT
void sendToCynoIoT(float level, float percent) {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi not connected");
return;
}
HTTPClient http;
// สร้าง URL สำหรับส่งข้อมูล
String url = String("https://") + cynoiotServer +
"/api/v1/devices/" + cynoiotDeviceId + "/data";
http.begin(url);
http.addHeader("Content-Type", "application/json");
http.addHeader("Authorization", "Bearer " + String(cynoiotApiKey));
// สร้าง JSON payload
String payload = "{";
payload += "\"water_level\":" + String(level, 2) + ",";
payload += "\"water_percent\":" + String(percent, 2) + ",";
payload += "\"distance\":" + String(distance, 2);
payload += "}";
// ส่งข้อมูล
int httpResponseCode = http.POST(payload);
if (httpResponseCode > 0) {
Serial.print("CynoIoT data sent. Response: ");
Serial.println(httpResponseCode);
} else {
Serial.print("Error sending to CynoIoT. Response: ");
Serial.println(httpResponseCode);
}
http.end();
}🧪 การทดสอบระบบ
ขั้นตอนการทดสอบ
- 1อัปโหลดโค้ด: อัปโหลดโค้ดทั้งหมดไปยัง ESP32
- 2เปิด Serial Monitor: ตั้งค่า Baud rate ที่ 115200
- 3ทดสอบวัดระยะ: ใช้มือหรือวัตถุวางหน้าเซ็นเซอร์
- 4ตรวจสอบค่า: ดูว่าระยะทางและเปอร์เซ็นต์ถูกต้องหรือไม่
- 5ทดสอบแจ้งเตือน: ปรับระดับน้ำให้ต่ำกว่า 20% หรือสูงกว่า 90%
- 6ตรวจสอบ Line Notify: รับข้อความแจ้งเตือนหรือไม่
💡 เคล็ดลับการใช้งาน
- • ปรับค่า tankHeight ให้ตรงกับขนาดถังน้ำจริง
- • ปรับ threshold ตามความต้องการของคุณ
- • ใช้ Deep Sleep Mode ถ้าต้องการประหยัดไฟเพิ่ม
- • เพิ่มฟิลเตอร์เพื่อลด noise ในการวัด
🔧 ปัญหาที่พบบ่อยและวิธีแก้ไข
ปัญหา: ค่าระยะทางไม่ถูกต้อง หรือกระโดก
สาเหตุ: สัญญาณรบกวน หรือเซ็นเซอร์ไม่ได้วางแนวตั้ง
วิธีแก้: ใช้เฉลี่ยค่าหลายๆ ครั้ง หรือเพิ่มฟิลเตอร์
// ใช้เฉลี่ยค่า 5 ครั้งเพื่อลด noise
float readDistance() {
float sum = 0;
for(int i = 0; i < 5; i++) {
// อ่านค่าระยะทาง
sum += distance;
delay(10);
}
return sum / 5;
}ปัญหา: ไม่ได้รับแจ้งเตือน Line Notify
สาเหตุ: Token ผิด หรือไม่ได้เชื่อมต่ออินเทอร์เน็ต
วิธีแก้: ตรวจสอบ Token, WiFi connection และ Serial Monitor
ปัญหา: ESP32 รีสตาร์ทบ่อย (Watchdog Reset)
สาเหตุ: ใช้ delay() นานเกินไป
วิธีแก้: ใช้ millis() แทน delay()
ปัญหา: ใช้ไฟมากเกินไป
สาเหตุ: อ่านค่าบ่อยเกินไป
วิธีแก้: เพิ่มระยะห่างการอ่านค่า หรือใช้ Deep Sleep Mode
// Deep Sleep เพื่อประหยัดไฟ (นอน 1 นาที)
void goToDeepSleep() {
Serial.println("Going to deep sleep...");
ESP.deepSleep(60e6); // 60 วินาที
}🎉 สรุป
ในบทความนี้ คุณได้เรียนรู้วิธีสร้างระบบวัดระดับน้ำด้วย ESP32 และ Ultrasonic Sensor พร้อมระบบแจ้งเตือนผ่าน Line Notify และเชื่อมต่อกับ CynoIoT Platform
✅ สิ่งที่คุณทำได้แล้ว:
- • วัดระดับน้ำในถังเก็บน้ำได้อัตโนมัติ
- • แจ้งเตือนเมื่อน้ำเกือบหมดหรือเต็มถัง
- • ตรวจสอบข้อมูลได้ทุกที่ผ่าน CynoIoT Dashboard
- • ประหยัดไฟด้วย Deep Sleep Mode
🚀 ถัดไป:
- • เพิ่มเซ็นเซอร์วัดคุณภาพน้ำ (pH, TDS)
- • สร้างระบบควบคุมปั๊มน้ำอัตโนมัติ
- • เชื่อมต่อหลายถังน้ำพร้อมกัน
- • วิเคราะห์การใช้น้ำด้วย CynoIoT Analytics