</>CoderDIY
← Quay lại danh sách
Bài viết

Cảm biến rò rỉ nước thông minh với ESP8266

Tác giả: CoderDIY··Đọc bằng tiếng Anh
💧

Rò rỉ nước dưới bồn rửa, sau máy giặt hay gần máy nước nóng thường không ai phát hiện ngay — đến khi thấy sàn nhà ướt hoặc trần nhà tầng dưới loang ố thì thiệt hại đã đáng kể. Một cảm biến rò rỉ nước nhỏ, giá vài chục nghìn đồng, kết hợp với ESP8266 có thể phát hiện giọt nước đầu tiên và gửi cảnh báo ngay lập tức tới điện thoại, kể cả khi không có ai ở nhà.

Nguyên lý hoạt động

  1. Cảm biến rò rỉ nước dạng hai đường mạch song song (giống cảm biến độ ẩm đất nhưng đặt nằm trên sàn) — khi khô, hai đường mạch cách điện hoàn toàn; khi có nước tiếp xúc, nước dẫn điện nhẹ tạo thành mạch kín, điện trở giảm mạnh.
  2. ESP8266 đọc tín hiệu digital hoặc analog từ cảm biến liên tục; khi giá trị vượt ngưỡng phát hiện nước, coi như có rò rỉ.
  3. Để tránh báo động giả do nhiễu tức thời, hệ thống yêu cầu tín hiệu nước phải ổn định qua vài lần đọc liên tiếp trước khi xác nhận cảnh báo thật.
  4. Khi xác nhận rò rỉ, ESP8266 gửi tin nhắn khẩn qua Telegram Bot API kèm vị trí lắp đặt (ví dụ “Rò rỉ nước: dưới bồn rửa bếp”), đồng thời có thể kích còi báo động cục bộ để người trong nhà nghe thấy ngay.
<rect x="10" y="20" width="140" height="60" rx="10" class="box" />
<text x="80" y="45" text-anchor="middle" class="label">Đọc cảm biến</text>
<text x="80" y="62" text-anchor="middle" class="label">liên tục</text>

<rect x="170" y="20" width="140" height="60" rx="10" class="box" />
<text x="240" y="45" text-anchor="middle" class="label">Vượt ngưỡng nước?</text>
<text x="240" y="62" text-anchor="middle" class="label">(vài lần liên tiếp)</text>

<rect x="330" y="20" width="140" height="60" rx="10" class="box" />
<text x="400" y="45" text-anchor="middle" class="label">Kích còi báo động</text>
<text x="400" y="62" text-anchor="middle" class="label">tại chỗ</text>

<rect x="490" y="20" width="140" height="60" rx="10" class="box" />
<text x="560" y="45" text-anchor="middle" class="label">Gửi Telegram</text>
<text x="560" y="62" text-anchor="middle" class="label">kèm vị trí lắp</text>

<line x1="150" y1="50" x2="170" y2="50" class="arrow" />
<line x1="310" y1="50" x2="330" y2="50" class="arrow" />
<line x1="470" y1="50" x2="490" y2="50" class="arrow" />

<path d="M 560 80 L 560 190 L 80 190 L 80 80" class="arrow" fill="none" />
<text x="320" y="210" text-anchor="middle" class="sublabel">Tiếp tục đọc liên tục để phát hiện sớm nhất có thể</text>
Vòng lặp phát hiện rò rỉ: đọc cảm biến, xác nhận qua vài lần đọc để tránh báo giả, kích còi và gửi cảnh báo ngay khi xác nhận.

Linh kiện

  • ESP8266 (NodeMCU hoặc Wemos D1 Mini, có WiFi tích hợp)
  • Module cảm biến rò rỉ nước (dạng mạch hở hai đường dẫn điện, giá rẻ và dễ mua)
  • Còi buzzer nhỏ (tùy chọn) để báo động tại chỗ
  • Nguồn 5V (adapter USB nhỏ, đặt gần ổ điện tại vị trí lắp)
  • Dây dẫn dài đủ để đặt cảm biến ở vị trí thấp nhất (sàn nhà, dưới ống nước) trong khi board đặt cao hơn tránh ẩm
<rect x="235" y="70" width="170" height="100" rx="10" class="box" />
<text x="320" y="125" text-anchor="middle" class="label">ESP8266</text>

<rect x="20" y="30" width="150" height="70" rx="10" class="box" />
<text x="95" y="70" text-anchor="middle" class="label">Cảm biến nước</text>

<rect x="470" y="30" width="150" height="70" rx="10" class="box" />
<text x="545" y="70" text-anchor="middle" class="label">Buzzer</text>

<line x1="170" y1="65" x2="235" y2="110" class="wire" />
<text x="180" y="95" text-anchor="middle" class="sublabel">Out → A0</text>

<line x1="405" y1="110" x2="470" y2="65" class="wire" />
<text x="455" y="95" text-anchor="middle" class="sublabel">D5</text>
Cảm biến nước đặt sát sàn nối về chân analog A0, buzzer nối chân D5 để phát âm báo động khi có nước.

Code mẫu

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

const char* WIFI_SSID = "ten-wifi";
const char* WIFI_PASS = "mat-khau-wifi";
const char* BOT_TOKEN = "TELEGRAM_BOT_TOKEN";
const char* CHAT_ID = "TELEGRAM_CHAT_ID";
const char* LOCATION_NAME = "Duoi bon rua bep";

const int SENSOR_PIN = A0;
const int BUZZER_PIN = D5;
const int WATER_THRESHOLD = 500; // hieu chinh theo cam bien thuc te, gia tri cang thap khi cang uot

WiFiClientSecure secureClient;
UniversalTelegramBot bot(BOT_TOKEN, secureClient);

bool leakActive = false;
int consecutiveWetReads = 0;
const int CONFIRM_READS = 3; // can 3 lan doc lien tiep de xac nhan, tranh bao gia

void setup() {
  Serial.begin(115200);
  pinMode(BUZZER_PIN, OUTPUT);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  secureClient.setInsecure();

  bot.sendMessage(CHAT_ID, "Cam bien ro ri nuoc tai " + String(LOCATION_NAME) + " da san sang.", "");
}

void loop() {
  int reading = analogRead(SENSOR_PIN);
  bool wetNow = reading < WATER_THRESHOLD;

  if (wetNow) {
    consecutiveWetReads++;
  } else {
    consecutiveWetReads = 0;
  }

  if (consecutiveWetReads >= CONFIRM_READS && !leakActive) {
    leakActive = true;
    digitalWrite(BUZZER_PIN, HIGH);
    bot.sendMessage(CHAT_ID, "CANH BAO RO RI NUOC: " + String(LOCATION_NAME), "");
    Serial.println("Da xac nhan ro ri, da gui canh bao!");
  } else if (!wetNow && leakActive) {
    leakActive = false;
    digitalWrite(BUZZER_PIN, LOW);
    bot.sendMessage(CHAT_ID, "Da het ro ri (hoac da lau kho): " + String(LOCATION_NAME), "");
  }

  delay(2000); // kiem tra moi 2 giay, du nhanh de phat hien som
}

Những lỗi thường gặp

  • Đặt board ESP8266 quá thấp, gần sát sàn khiến chính board bị hỏng khi nước lan tới — chỉ đặt phần cảm biến ở vị trí thấp, còn board chính nên gắn cao hơn, cách xa nguồn nước có thể tràn tới.
  • Không xác nhận qua nhiều lần đọc (CONFIRM_READS) khiến hệ thống báo động giả vì hơi ẩm hoặc bụi bẩn tạm thời trên cảm biến — luôn yêu cầu tín hiệu ổn định qua vài lần đọc liên tiếp.
  • Cảm biến kim loại trần bị oxy hóa theo thời gian làm giảm độ nhạy dần — nên chọn cảm biến có lớp mạ chống oxy hóa hoặc kiểm tra định kỳ, đặc biệt ở vị trí ẩm thường xuyên.
  • Chỉ có một cảm biến cho cả nhà bỏ sót các vị trí rò rỉ khác — với nhà có nhiều điểm nguy cơ (bếp, nhà tắm, máy giặt, máy nước nóng), nên lắp nhiều bộ độc lập, mỗi bộ có tên vị trí riêng trong tin nhắn cảnh báo.

Mở rộng

Tích hợp với van nước điện tử (solenoid valve) để tự động khóa nguồn nước tổng ngay khi phát hiện rò rỉ, kết hợp với dự án hộp thư thông minh ESP8266 nếu muốn tham khảo thêm cách gửi cảnh báo qua Telegram cho các cảm biến khác trong nhà, hoặc publish trạng thái qua MQTT để hiển thị chung trên dashboard Home Assistant.

Thẻ:#esp8266#sensors#safety

Bình luận