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 } }