IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series ESP32 & Cảm biến: Bài 29 – Đọc cảm biến Water Flow YF-S201: đo lưu lượng nước & theo dõi realtime

Trong các hệ tưới cây tự động, giám sát nước, smart garden, smart home, không chỉ biết đất khô hay ướt là đủ.
Ta cần biết thêm một câu hỏi rất quan trọng:

“Nước có thực sự đang chảy không? Chảy bao nhiêu?”

Đó là lúc Water Flow Sensor YF-S201 phát huy tác dụng.

1. Cảm biến YF-S201 là gì?

YF-S201 là cảm biến đo lưu lượng nước dựa trên:

  • Cánh quạt bên trong
  • Hall sensor tạo xung (pulse) khi nước chảy

👉 Tần số xung ∝ lưu lượng nước

2. Thông số cơ bản YF-S201

  • Điện áp: 5V
  • Tín hiệu: Digital pulse
  • Lưu lượng: ~1 – 30 L/phút
  • Hệ số phổ biến:450 pulses ≈ 1 lít nước

📌 Đây là cảm biến đủ chính xác cho DIY & hệ tưới, không phải công nghiệp.

3. Khi nào nên dùng YF-S201?

Rất phù hợp cho:

  • Kiểm tra nước có chảy hay không
  • Đo lượng nước tưới cây
  • Phát hiện van mở nhưng không có nước
  • Ghi log lượng nước tiêu thụ

👉 Kết hợp cực tốt với:

  • Soil Moisture (Bài 28)
  • Relay / Solenoid valve
  • Rule Engine

4. Chuẩn bị phần cứng

Thiết bị

  • ESP32-C3 SuperMini
  • Water Flow Sensor YF-S201
  • Ống nước

Đặc điểm tín hiệu

  • Dây vàng: tín hiệu xung
  • Xung dạng open-collector → cần pull-up

5. Nối dây YF-S201 với ESP32

YF-S201ESP32-C3
Red5V
BlackGND
YellowGPIO4

📌 GPIO nên hỗ trợ interrupt.

6. Nguyên lý đo lưu lượng

Cách đo:

  1. Đếm số xung trong 1 khoảng thời gian
  2. Tính:Flow (L/min) = pulses / 450 × 60

7. Ví dụ 1: Đọc lưu lượng nước (local)

#define FLOW_PIN 4

volatile unsigned long pulseCount = 0;
unsigned long lastMeasure = 0;

void IRAM_ATTR onPulse() {
  pulseCount++;
}

void setup() {
  Serial.begin(115200);
  pinMode(FLOW_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(FLOW_PIN), onPulse, FALLING);
}

void loop() {
  if (millis() - lastMeasure >= 1000) {
    lastMeasure = millis();

    unsigned long pulses = pulseCount;
    pulseCount = 0;

    float flowRate = (pulses / 450.0) * 60.0;

    Serial.print("Flow rate: ");
    Serial.print(flowRate);
    Serial.println(" L/min");
  }
}

📌 Đo theo cửa sổ 1 giây là đủ cho realtime.

8. Dữ liệu lưu lượng trong tư duy IoT

YF-S201 sinh telemetry dạng số, rất phù hợp cho:

  • Chart realtime
  • Tính tổng lượng nước
  • Trigger cảnh báo

Payload gợi ý:

{
  "ts": 1760000000,
  "metrics": {
    "flow_lpm": 3.2
  }
}

9. Ví dụ 2: Gửi lưu lượng realtime lên IoTLabs Cloud MQTT

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

#define FLOW_PIN 4

volatile unsigned long pulseCount = 0;

const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_PASS";

const char* MQTT_HOST = "mqtt.iotlabs.vn";
const int MQTT_PORT = 8883;
const char* MQTT_USER = "YOUR_MQTT_USER";
const char* MQTT_PASS = "YOUR_MQTT_PASS";

const char* MQTT_TOPIC =
  "iotlabs/<orgId>/devices/<deviceId>/telemetry";

WiFiClientSecure net;
PubSubClient mqtt(net);

void IRAM_ATTR onPulse() {
  pulseCount++;
}

void connectWiFi() {
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
}

void connectMQTT() {
  net.setInsecure();
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  while (!mqtt.connected()) {
    mqtt.connect("esp32c3-flow", MQTT_USER, MQTT_PASS);
    delay(1000);
  }
}

unsigned long lastSend = 0;

void setup() {
  Serial.begin(115200);
  pinMode(FLOW_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(FLOW_PIN), onPulse, FALLING);

  connectWiFi();
  connectMQTT();
}

void loop() {
  if (!mqtt.connected()) connectMQTT();
  mqtt.loop();

  if (millis() - lastSend > 1000) {
    lastSend = millis();

    unsigned long pulses = pulseCount;
    pulseCount = 0;

    float flow = (pulses / 450.0) * 60.0;
    long ts = millis() / 1000;

    String payload = "{";
    payload += "\"ts\":" + String(ts) + ",";
    payload += "\"metrics\":{";
    payload += "\"flow_lpm\":" + String(flow, 2);
    payload += "}}";

    mqtt.publish(MQTT_TOPIC, payload.c_str());
    Serial.println(payload);
  }
}

10. Kinh nghiệm thực tế với YF-S201

  • Lắp đúng chiều mũi tên trên sensor
  • Tránh bọt khí (sai số)
  • Không dùng cho nước nóng
  • Nếu cần tổng lượng:
    • Cộng dồn pulses → lít → m³

11. Ứng dụng thực tế

Sau bài này, bạn có thể:

  • Đo lượng nước tưới mỗi ngày
  • Phát hiện van mở nhưng không có nước
  • Cảnh báo rò rỉ
  • Kết hợp:
    • Soil Moisture (khi khô → mở van)
    • Flow sensor (xác nhận nước chảy)

👉 Đây là bước rất gần hệ tưới cây hoàn chỉnh.

12. Tổng kết Bài 29

Bạn đã:

  • Đọc lưu lượng nước bằng YF-S201
  • Xử lý interrupt trên ESP32
  • Chuẩn hoá dữ liệu lưu lượng
  • Gửi telemetry realtime lên IoTLabs Cloud