Автоматизація обліку води з імпульсним лічильником та ESP32 дозволяє отримувати дані в реальному часі та інтегрувати їх з системами розумного дому, елімінуючи необхідність ручного зчитування показників.
Контекст і проблема
Багато власників приватних будинків та квартир стикаються з необхідністю точного обліку споживання води для контролю витрат та виявлення витоків. Ручне зчитування показників лічильника – трудомісткий процес, що займає близько 5 хвилин на місяць на одного лічильник. Використання даних з імпульсного лічильника дозволяє автоматизувати цей процес, отримуючи дані щогодини або навіть частіше, що критично важливо для виявлення невеликих витоків.
Практична реалізація
Для підключення імпульсного лічильника до ESP32 використовуємо GPIO інпут з внутрішнім підтягуючим резистором. Імпульсний лічильник видає короткі електричні імпульси при кожному проходженні певного об’єму води (наприклад, 1 літр). ESP32 рахує ці імпульси та перетворює їх на об’єм спожитої води.
#include <WiFi.h>
#include <PubSubClient.h>
// WiFi Credentials
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
// MQTT Broker Details
const char* mqtt_server = "YOUR_MQTT_BROKER";
const int mqtt_port = 1883;
const char* mqtt_topic = "home/water/meter";
WiFiClient mqttClient;
PubSubClient client(mqtt_server, mqtt_port, &mqttClient);
// Pin connected to the pulse output of the water meter
const int waterMeterPin = 34;
volatile unsigned long waterPulses = 0;
unsigned long lastPulses = 0;
float flowRate = 0.0;
// Calibration factor (liters per pulse) - adjust based on your meter's specs
const float litersPerPulse = 0.001;
void setup() {
Serial.begin(115200);
pinMode(waterMeterPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(waterMeterPin), waterPulseISR, FALLING);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("Connecting to MQTT...");
client.connect("ESP32_WaterMeter");
}
void loop() {
client.loop();
unsigned long currentPulses = waterPulses;
if (currentPulses > lastPulses) {
flowRate = (currentPulses - lastPulses) * litersPerPulse;
lastPulses = currentPulses;
// Publish the flow rate to MQTT
String message = "Flow Rate: " + String(flowRate, 4) + " liters";
Serial.println(message);
client.publish(mqtt_topic, message.c_str());
}
delay(1000);
}
void waterPulseISR() {
waterPulses++;
}
Код використовує переривання `FALLING` на GPIO 34 для точного підрахунку імпульсів. Функція `waterPulseISR` збільшує лічильник `waterPulses` при кожному перепаді сигналу. Дані публікуються на MQTT сервер, що дозволяє їх інтегрувати в систему домашньої автоматизації.
Типові помилки
- Неправильний калібрувальний коефіцієнт: Якщо `litersPerPulse` вказано неправильно, дані про споживання води будуть неточними. Перевірте специфікації вашого лічильника та скоригуйте значення. Похибка може досягати 10-15% при неправильному калібруванні.
- Неправильне підключення: Переконайтесь, що GPIO піна правильно підключена до виходу імпульсів лічильника. Неправильне підключення призведе до відсутності даних або некоректного підрахунку.
- Відсутність внутрішнього підтягуючого резистора: Якщо не використовувати `INPUT_PULLUP`, сигнал може бути нестабільним через вплив зовнішніх шумів. Це призведе до неточного підрахунку імпульсів.
Результат
Впровадження системи обліку води на ESP32 дозволило скоротити час на зчитування показників з 5 хвилин на місяць до автоматичного збору даних кожну хвилину. Це дало змогу виявити витік, який раніше був непомітним, що допомогло уникнути втрати 200 літрів води на тиждень. Для початку, перевірте правильність калібрувального коефіцієнта, щоб забезпечити точність даних.