บทความ: สร้างระบบวัดระดับน้ำด้วย ESP32 และ Ultrasonic Sensor

เรียนรู้วิธีสร้างระบบวัดระดับน้ำในถังเก็บน้ำด้วย ESP32 และเซ็นเซอร์วัดระยะทางอัลตราโซนิค พร้อมแจ้งเตือนผ่าน Line Notify และ CynoIoT Platform

📅 29 มีนาคม 2026⏱️ 15 นาที🎯 ระดับเริ่มต้น

📌 ภาพรวมโปรเจกต์

ในช่วงเทศกาลสงกรานต์และฤดูร้อน การมีระบบตรวจสอบระดับน้ำในถังเก็บน้ำเป็นสิ่งสำคัญ เพื่อไม่ให้น้ำหมดหรือล้นเกิน บทความนี้จะพาคุณสร้างระบบวัดระดับน้ำด้วย 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เชื่อมต่อกับคำอธิบาย
VCC5V หรือ 3.3Vไฟเลี้ยง
TrigGPIO 5 (D5)ส่งสัญญาณ Trigger
EchoGPIO 18 (D18)รับสัญญาณ Echo
GNDGNDกราวด์

⚠️ ข้อควรระวัง

  • • 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 และเก็บประวัติข้อมูลไว้วิเคราะห์

✨ ขั้นตอนการเชื่อมต่อ

  1. สมัครสมาชิกและสร้าง Device ใน CynoIoT Dashboard
  2. รับ API Key และ Device ID
  3. เพิ่ม Library สำหรับ CynoIoT ใน Arduino IDE
  4. อัปเดตโค้ดเพื่อส่งข้อมูลไปยัง 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. 1
    อัปโหลดโค้ด: อัปโหลดโค้ดทั้งหมดไปยัง ESP32
  2. 2
    เปิด Serial Monitor: ตั้งค่า Baud rate ที่ 115200
  3. 3
    ทดสอบวัดระยะ: ใช้มือหรือวัตถุวางหน้าเซ็นเซอร์
  4. 4
    ตรวจสอบค่า: ดูว่าระยะทางและเปอร์เซ็นต์ถูกต้องหรือไม่
  5. 5
    ทดสอบแจ้งเตือน: ปรับระดับน้ำให้ต่ำกว่า 20% หรือสูงกว่า 90%
  6. 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