// Este switch es el que habilita/deshabilita el
// flujo de agua accionando la electrovalvula.
#define PIN_MAIN_SWITCH 13
// El buzzer es la alerta que se da con el consumo
// que se va teniendo de acuerdo a los umbrales establecidos.
#define PIN_BUZZER 4
// Este relay lo que hace es accionar la electrovalvula para
// permitir el paso del agua.
#define PIN_FLOW_RELAY 27
// Este sensor informa el flujo de agua que está corriendo
// para censar el consumo.
#define PIN_FLOW_SENSOR 15
#define UMBRAL_CONSUMO_MAX 10
// Este factor de multiplicación ajusta la señal enviada por el
// caudalimetro para obtener un valor en Litros.
#define FACTOR_AJUSTE_SENSOR_A_CONSUMO_AGUA 0.00024
float consumoLitros = 0.0;
bool valveOpen = false;
void setup() {
Serial.begin(115200);
Serial.println("AguaSMART");
Serial.println("Simulador Medidor de Agua (ESP32) - arranca");
// Inputs
pinMode(PIN_MAIN_SWITCH, INPUT);
pinMode(PIN_FLOW_SENSOR, INPUT);
// // Outputs
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_FLOW_RELAY, OUTPUT);
// Empiezo con el relay apagado.
digitalWrite(PIN_FLOW_RELAY, LOW);
}
void loop() {
// Si el interruptor principal está en posición apagado no hago nada.
if (digitalRead(PIN_MAIN_SWITCH) == LOW) {
digitalWrite(PIN_FLOW_RELAY, LOW);
valveOpen = false;
mostrarEstado();
return;
}
// // Leo flujo de agua para calcular consumo.
int lecturaSensorFlujo = analogRead(PIN_FLOW_SENSOR);
consumoLitros += lecturaSensorFlujo * FACTOR_AJUSTE_SENSOR_A_CONSUMO_AGUA;
// // Si pasé el umbral de consumo máximo apago el flujo de agua.
// // Aviso con señal de alarma
if (consumoLitros > UMBRAL_CONSUMO_MAX){
digitalWrite(PIN_FLOW_RELAY, LOW);
valveOpen = false;
alarmaFuerte();
mostrarEstado();
return;
}
// // Permito flujo de agua - LED prendido -> válvula abierta
digitalWrite(PIN_FLOW_RELAY, HIGH);
valveOpen = true;
mostrarEstado();
delay(1000); // this speeds up the simulation
}
void mostrarEstado(){
Serial.print("Consumo (L): ");
Serial.print(consumoLitros, 3);
Serial.print(" | Válvula: ");
Serial.print(valveOpen ? "ABIERTO" : "CERRADO");
Serial.print(" | LIMITE: ");
Serial.println(UMBRAL_CONSUMO_MAX);
delay(1000);
}
void alarmaFuerte() {
static unsigned long lastToggle = 0;
static bool on = false;
unsigned long t = millis();
if (t - lastToggle >= 250) {
lastToggle = t;
on = !on;
if (on) tone(PIN_BUZZER, 2500);
else noTone(PIN_BUZZER);
}
}Alarma sonora
Entrada de agua (Relay + Electroválvula)
Se simula con un Relay + Led en wokwi
Interruptor para
habilitar/deshabilitar
entrada de agua
Control de flujo de agua (Caudalímetro)
Simulado con un switch y un potenciometro
para imitar que se abra/cierre una canilla con +/- caudal