ESPECIFICACIONES TÉCNICAS
- Tensión de alimentación……………………….…………12VDC
- Corriente de alimentación………………….……………120mA
- Entadas digitales 5-12VDC……………………….……8
- Entradas Análogas……………………………………………….2
- Salidas RLY…………………………………………………………5
-
- Tensión AC…………..……….………………….….……250V
- Corriente AC…………………………………………….10A
- Tensión DC………………………………………………30V
- Corriente DC……………………………………………10A
-
- Entorno de programación………………………..………..Arduino IDE
- Salidas para leds………………………………………………………….3
- Salidas para pantalla Display de 7 seg…………………….4Dig
- Pulsadores de configuracion…………………………………….Sí
- Comunicación I2C……………………………….……..………..Sí
- Condiciones ambientales min……………………….….-40°
- Condiciones ambientales max…………………..……….150°
- Dimensiones……………………………………………………….160x100mm
- Empotrable………………………………….……………………Sí
- wifi………………………………………………………………………………Sí
- Bluetooth……………………………………………………………………Sí
- Programación directa (PC-Tarjeta electrónica)…………Sí
LISTA DE MATERIALES

| Comment | Designator | Footprint | Value | Manufacturer Part | Manufacturer | Supplier Part |
| 100nF | C1,C2,C5,C6,C7,C8,C9,C10,C11, C15,C17,C18,C19,C20,C21,C22, C23,C24,C25 |
C0603 | 100nF | CC0603KRX7R9BB104 | YAGEO(国巨) | C14663 |
| 470uF | C3 | CAP-SMD_BD10.0-L10.3-W10.3-LS11.3-FD | 470uF | VT1V471M1010 | ROQANG(容强) | C310845 |
| 1uF | C4,C14 | C1206 | 1uF | CL31B105KBHNNNE | SAMSUNG(三星) | C1848 |
| 220uF | C12 | CAP-SMD_BD8.0-L8.3-W8.3-LS9.3-FD-2 | 220uF | UCD1V221MNL1GS | Nichicon(尼吉康) | C136294 |
| 470uF | C13,C16 | CAP-SMD_BD10.0-L10.3-W10.3-FD | 470uF | CS1E471M-CRG10 | ROQANG(容强) | C5162351 |
| WJ2EDGR-5.08-8P | CN1 | CONN-TH_8P-P5.08_WJ2EDGR-5.08-8P | WJ2EDGR-5.08-8P | KANGNEX(康奈克斯电气) | C31423 | |
| WJ2EDGR-5.08-2P | CN2,CN6,CN7,CN8,CN9,CN10,CN11 | CONN-TH_WJ2EDGR-5.08-2P | WJ2EDGR-5.08-2P | KANGNEX(康奈克斯电气) | C8383 | |
| ZX-XH2.54-3PZZ | CN3,CN4 | CONN-TH_3P-P2.54_2501S-3P | ZX-XH2.54-3PZZ | Megastar(兆星) | C7429633 | |
| ZX-XH2.54-4PZZ | CN5 | CONN-TH_4P-P2.50_4PIN | ZX-XH2.54-4PZZ | Megastar(兆星) | C7429634 | |
| SS34 | D1,D2,D3,D4,D5,D6,D7 | SMA_L4.3-W2.6-LS5.2-RD | SS34 | MDD(辰达半导体) | C8678 | |
| SS210 | D8,D9 | SMA_L4.3-W2.6-LS5.2-RD | SS210 | MDD | C14996 | |
| BZT52C3V3 | D10,D11 | SOD-123_L2.7-W1.6-LS3.7-RD | BZT52C3V3 | MDD | C173413 | |
| 1N4148W | D12,D13,D14,D15,D16 | SOD-123F_L2.7-W1.6-LS3.8-RD | 1N4148W | ST(先科) | C81598 | |
| 1N4007 | D17,D18,D19,D20,D21 | DO-41_BD2.4-L4.7-P8.70-D0.9-RD | ||||
| xcfuse(旭程) | F1,F2 | FUSE-TH_L22.6-W9.0 | 5x20BLX-A型保险丝支架XC-7 | xcfuse(旭程) | C3131 | |
| 68uH | L1 | IND-SMD_L7.1-W6.6-1 | 68uH | PSPMAA0605H-680M-IGF | PROD(谱罗德) | C2983094 |
| 22uH | L2 | IND-SMD_L5.0-W5.0 | 22uH | FNR5040S220MT | cjiang(长江微电) | C167971 |
| L2004 | LCD1 | LCD20X04 | ||||
| KT-0805G | LED1,LED2,LED3,LED4,LED5, LED6,LED7,LED8,LED9,LED10,LED11 |
LED0805-R-RD | KT-0805G | KENTO | C2297 | |
| FJ4401AH | LED12 | LED-SEG-TH_12P-L40.4-W16.0-P2.54-S12.70-BL | FJ4401AH | 志浩 | C28536 | |
| XL-502SURC | LED13 | LED-TH_BD5.9-P2.54-FD-1 | XL-502SURC | XINGLIGHT(成兴光) | C2895484 | |
| 333-2SUGC/S400-A4 | LED14 | LED-TH_BD5.8-P2.54-FD | 333-2SUGC/S400-A4 | EVERLIGHT(亿光) | C87637 | |
| 333-2UYC/S530-A3-L | LED15 | LED-TH_BD5.4-P2.54-FD | 333-2UYC/S530-A3-L | EVERLIGHT(亿光) | C73644 | |
| NCD0805R1 | LED16,LED17,LED18,LED19,LED20 | LED0805-R-RD | NCD0805R1 | 国星光电 | C84256 | |
| WJ128V-5.0-2P | P1,P2 | CONN-TH_2P-P5.00_WJ128V-5.0-2P | WJ128V-5.0-2P | KANGNEX(康奈克斯电气) | C8269 | |
| MMBT3904 | Q1,Q2 | SOT-23-3_L2.9-W1.3-P1.90-LS2.4-BR | MMBT3904 | CJ(江苏长电/长晶) | C20526 | |
| S8550(RANGE:120-200) | Q3,Q4 | SOT-23-3_L2.9-W1.6-P1.90-LS2.8-BR | S8550(RANGE:120-200) | CJ(江苏长电/长晶) | C105432 | |
| MMBT2222A 1P | Q5,Q6,Q7,Q8,Q9,Q10 | SOT-23-3_L2.9-W1.3-P1.90-LS2.4-BR | MMBT2222A 1P | CJ(江苏长电/长晶) | C8512 | |
| 2.2kΩ | R1,R2,R3,R4,R5,R6,R25,R26,R76, R77,R78,R79,R80 |
R0805 | 2.2kΩ | 0805W8F2201T5E | UNI-ROYAL(厚声) | C17520 |
| 10kΩ | R7,R8,R9,R10,R11,R12,R23,R24, R27,R28,R32,R34,R44,R47,R48,R49, R66,R67,R68,R69,R70 |
R0603 | 10kΩ | 0603WAF1002T5E | UNI-ROYAL(厚声) | C25804 |
| 1kΩ | R13,R14,R15,R16,R17,R18,R19,R20, R21,R22,R33,R35,R36,R37,R38,R41, R45,R46,R71,R72,R73,R74,R75 |
R0603 | 1kΩ | 0603WAF1001T5E | UNI-ROYAL(厚声) | C21190 |
| 10kΩ | R29,R30 | R1206 | 10kΩ | 1206W4F1002T5E | UNI-ROYAL(厚声) | C17902 |
| 10kΩ | R31 | RES-ADJ-SMD_3P-L3.0-W3.8-P1.75-BR | 10kΩ | TC33X-2-103E | BOURNS | C719176 |
| 680Ω | R39,R40 | R0805 | 680Ω | 0805W8F6800T5E | UNI-ROYAL(厚声) | C17798 |
| 330Ω | R42,R43,R50,R51,R52,R53,R54,R55, R56,R57,R58,R59,R60,R61,R62,R63, R64,R65 |
R0805 | 330Ω | 0805W8F3300T5E | UNI-ROYAL(厚声) | C17630 |
| SRD-12VDC-SL-C | RELAY1,RELAY2,RELAY3,RELAY4, RELAY5 |
RELAY-TH_SRD-XXVDC-XL-C | SRD-12VDC-SL-C | 松乐 | C30431 | |
| TC-6610-9-260G | SW1,SW2,SW3,SW4 | SW-TH_4P-L5.0-W5.0-P4.50-LS6.5 | TC-6610-9-260G | HCTL(华灿天禄) | C2845257 | |
| MSS22D18G2 | SW5 | SW-TH_MSS22D18GX | MSS22D18G2 | SHOU HAN(首韩) | C431542 | |
| Test-Point | TP1,TP2 | Test-Point-0.5mm | ||||
| EL3H7(B)(TA)-G | U1,U2,U3,U4,U5,U6,U10,U11,U17, U18,U19,U20,U21 |
SOP-4_L4.4-W2.8-P1.27-LS7.0-TL | EL3H7(B)(TA)-G | EVERLIGHT(亿光) | C32565 | |
| CH340C | U7 | SOP-16_L10.0-W3.9-P1.27-LS6.0-BL | CH340C | WCH(南京沁恒) | C84681 | |
| XL1509-5.0E1 | U8 | SOIC-8_L5.0-W4.0-P1.27-LS6.0-BL | XL1509-5.0E1 | XLSEMI(芯龙) | C61063 | |
| LM2594M-3.3 | U9 | SOP-8_L4.9-W3.9-P1.27-LS6.0-BL | LM2594M-3.3 | UMW(广东友台半导体) | C3029048 | |
| PCF8574T/TR | U12 | SO-16_L10.3-W7.5-P1.27-LS10.3-BL | PCF8574T/TR | HGSEMI(华冠) | C2987288 | |
| ESP32-WROOM-32E-N4 | U13 | WIFI-SMD_ESP32-WROOM-32E | ESP32-WROOM-32E-N4 | ESPRESSIF(乐鑫) | C701341 | |
| 74HC595D,118 | U14,U15 | SOIC-16_L9.9-W3.9-P1.27-LS6.0-BL | 74HC595D,118 | Nexperia(安世) | C5947 | |
| ULN2003ADR | U16 | SOIC-16_L9.9-W3.9-P1.27-LS6.0-BL | ULN2003ADR | TI(德州仪器) | C7512 | |
| 74HC14D,653 | U22 | SOIC-14_L8.7-W3.9-P1.27-LS6.0-BL | 74HC14D,653 | Nexperia(安世) | C5605 | |
| LM358DR2G | U23 | SOIC-8_L5.0-W4.0-P1.27-LS6.0-BL | LM358DR2G | ON(安森美) | C7950 | |
| USB-TYPE-C-018 | USB1 | USB-C_SMD-TYPE-C-31-M-12 | USB-TYPE-C-018 | DEALON(德艺隆) | C2927038 |
CODIGO

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// =============================================
// PROTOTIPOS DE FUNCIONES
// =============================================
void finalizarDispensado();
void mostrarDespedida();
void resetearSistema();
void mostrarBienvenida();
void calcularLitros();
void controlBotones();
void controlOzonizador();
void actualizarLCD();
void IRAM_ATTR coinInterrupt(); // Nueva ISR para monedas
// =============================================
// CONFIGURACIÓN LCD 20x4 (I2C)
// =============================================
LiquidCrystal_I2C lcd(0x27, 20, 4);
// =============================================
// DEFINICIÓN DE PINES
// =============================================
#define PUL_INI_REA 27
#define PUL_PAUSA 33
#define COIN_ACEP 12
#define FLOW_SEN 14
#define SEN_NIV_INF 35
#define BOMBA_DIS_AGUA 4
#define OZONO 16
#define LED_PUBLI 15
// =============================================
// VARIABLES GLOBALES
// =============================================
volatile unsigned int pulsos_flujo = 0;
float cantidad_ingresada = 0.0;
float litros_a_dispensar = 0.0;
bool dispensando = false;
bool pausado = false;
unsigned long tiempo_ozono = 0;
bool ozono_activo = false;
// Constantes de conversión
const float MONTO_CURVA = 3.5;
const float LITROS_CURVA = 7.0;
const float MONTO_MAX = 9.0;
const float LITROS_MAX = 20.0;
const float FACTOR_CURVA = (LITROS_MAX - LITROS_CURVA) / (MONTO_MAX - MONTO_CURVA);
// Control de tiempos
unsigned long ultimo_tiempo_moneda = 0;
const int debounce_moneda = 20;
unsigned long ultimo_refresco = 0;
// =============================================
// INTERRUPCIÓN SENSOR DE FLUJO
// =============================================
void IRAM_ATTR contarPulsoFlujo() {
if (digitalRead(FLOW_SEN)) pulsos_flujo++;
}
void IRAM_ATTR coinInterrupt() {
if (digitalRead(SEN_NIV_INF) == HIGH) { // Solo si hay agua
if (millis() - ultimo_tiempo_moneda > 20) { // Debounce de 20ms
cantidad_ingresada += 0.10; // 10 céntimos por pulso
if (!ozono_activo) { // Activar ozonizador en primer pulso
ozono_activo = true;
tiempo_ozono = millis();
}
ultimo_tiempo_moneda = millis();
}
}
}
// =============================================
// SETUP INICIAL
// =============================================
void setup() {
// Configuración de pines
pinMode(PUL_INI_REA, INPUT);
pinMode(PUL_PAUSA, INPUT);
pinMode(COIN_ACEP, INPUT_PULLDOWN);
pinMode(FLOW_SEN, INPUT_PULLDOWN);
pinMode(SEN_NIV_INF, INPUT);
pinMode(BOMBA_DIS_AGUA, OUTPUT);
pinMode(OZONO, OUTPUT);
pinMode(LED_PUBLI, OUTPUT);
attachInterrupt(digitalPinToInterrupt(FLOW_SEN), contarPulsoFlujo, RISING);
attachInterrupt(digitalPinToInterrupt(COIN_ACEP), coinInterrupt, RISING);
// Inicializar LCD
Wire.begin(21, 22);
lcd.init();
lcd.backlight();
mostrarBienvenida();
digitalWrite(LED_PUBLI, HIGH);
}
// =============================================
// LOOP PRINCIPAL
// =============================================
void loop() {
controlOzonizador();
controlBotones();
dispensarAgua();
actualizarLCD();
}
// =============================================
// FUNCIONES DE CONTROL PRINCIPALES
// =============================================
void controlBotones() {
static unsigned long ultimo_boton = 0;
if (millis() - ultimo_boton > 200) {
// Botón INICIO/REANUDAR
if (digitalRead(PUL_INI_REA) && cantidad_ingresada >= 0.10) {
if (!dispensando) {
calcularLitros();
dispensando = true;
pausado = false;
} else if (pausado) {
pausado = false;
}
}
// Botón PAUSA
if (digitalRead(PUL_PAUSA) && dispensando) {
pausado = !pausado;
digitalWrite(BOMBA_DIS_AGUA, pausado ? LOW : HIGH);
}
ultimo_boton = millis();
}
}
void dispensarAgua() {
if (dispensando && !pausado) {
digitalWrite(BOMBA_DIS_AGUA, HIGH);
float litros = pulsos_flujo / 450.0; // Ajustar según sensor
if (litros >= litros_a_dispensar) {
finalizarDispensado();
}
} else {
digitalWrite(BOMBA_DIS_AGUA, LOW);
}
}
// =============================================
// FUNCIONES DE CÁLCULO Y RESET
// =============================================
void calcularLitros() {
if (cantidad_ingresada <= 3.4) {
litros_a_dispensar = cantidad_ingresada;
} else {
litros_a_dispensar = LITROS_CURVA + (cantidad_ingresada - MONTO_CURVA) * FACTOR_CURVA;
}
}
void finalizarDispensado() {
digitalWrite(BOMBA_DIS_AGUA, LOW);
dispensando = false;
mostrarDespedida();
resetearSistema();
}
void resetearSistema() {
cantidad_ingresada = 0.0;
litros_a_dispensar = 0.0;
pulsos_flujo = 0;
pausado = false;
}
// =============================================
// FUNCIONES DE VISUALIZACIÓN
// =============================================
void mostrarBienvenida() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bienvenidos a AGUA_V");
if (digitalRead(SEN_NIV_INF) == LOW) {
lcd.setCursor(0, 2);
lcd.print(" ESCASES DE AGUA");
lcd.setCursor(0, 3);
lcd.print("NO INSERTE MONEDAS");
} else {
lcd.setCursor(0, 2);
lcd.print(" INSERTE MONEDAS");
lcd.setCursor(0, 3);
lcd.print(" desde 10 Centimos");
}
}
void actualizarLCD() {
if (millis() - ultimo_refresco > 500) {
lcd.backlight();
if (dispensando) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dispensando:");
lcd.setCursor(0, 2);
lcd.print(String(pulsos_flujo / 450.0, 1) + " / " + String(litros_a_dispensar, 1) + " Litros ");
} else if (cantidad_ingresada > 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("INSERTANDO MONEDAS");
lcd.setCursor(0, 2);
lcd.print("Saldo: S/. = ");
lcd.print(cantidad_ingresada, 1);
pulsos_flujo = 0;
} else {
mostrarBienvenida();
}
ultimo_refresco = millis();
}
}
void mostrarDespedida() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dispensado:");
lcd.setCursor(0, 1);
lcd.print(String(litros_a_dispensar, 1) + " Litros");
lcd.setCursor(0, 2);
lcd.print(" ¡Gracias!");
delay(2000);
mostrarBienvenida();
}
// =============================================
// FUNCIONES AUXILIARES
// =============================================
void controlOzonizador() {
if (ozono_activo) {
digitalWrite(OZONO, HIGH); // Mantener activo
if (millis() - tiempo_ozono >= 7000) { // 7seg
digitalWrite(OZONO, LOW);
ozono_activo = false;
}
} else {
digitalWrite(OZONO, LOW); // Asegurar apagado
}
}


