INTRODUCCIÓN
Desde hace un buen tiempo llevo desarrollando una tarjeta electrónica que me permita controlar un dispensador de agua. Y sí efectivamente ya lo tenemos concluido, y en este video te enseñaré desde el esquemático electrónico, la creación de la tarjeta PCB y las conexiones con los dispositivos externos.
Primero veamos el planteamiento del problema, que deseamos lograr? Si bien es cierto los dispensadores de agua tiene que tener la característica de auto atención y que debe estar instado a la calle, o en una esquina. Ahora surge la pregunta, que componentes se requiere para lograr la automatización correspondiente? Primero, un dispensador de monedas, ya sea de una moneda o multimoneda, normalmente estos dispositivo suele tener estas características. Primero, para que el dispensador pueda filtrar las monedas se debe colocar a este molde, por ejemplo, si yo quiero que el litro de agua cueste 1 sol entonces pondré una moneda de 1 sol a esta parte, lo siguiente es reconocer los pines de salida y entrada, por el primer pin se alimenta con 12V por el tercer pin ingresa un 0V, estos dos son la entrada de alimentación, el segundo pin es la señal de salida de 0V, es decir, que cuando ingresa una moneda manda una señal de 0V, por último también tendremos una señal de salida de 0V, este pin normalmente es para los contadores mecánicos, pero para este proyecto no será necesario. Ahora para poder extraer el agua colocaremos una pequeña bombita, estos son los típicos que vemos en las peceras, o en los acuarios, que solo tienen dos cables y que se alimentan con 12V. ahora para poder administrar la salida del agua con la cantidad exacta colocaremos un sensor de flujo este tipo que tiene 3 cables, dos de alimentación Normalmente el color rojo para 12V y el color negro para cero voltios, finalmente el ultimo cable de color verde para la salida de la señal de los pulsos altos. Y obviamente para llevar una administración adecuada de estos dispositivos necesitamos una tarjeta de control, que crearemos nosotros mismos ya pueda ser usando los microcontroladores de Atmel, pic, esp32, etc, etc en este caso usaremos el microcontrolador atmega328P, Y para poder visualizar el proceso de llenado del líquido usaremos una pantalla de 20*4, finalmente para dar marcha al proceso integraremos un pulsador. Muy bien, estos son todos los dispositivos que vamos a usar. Ahora veamos el esquemático y la creación de la tarjeta PCB.
DATOS TÉCNICOS

- Tensión de alimentación……………………….…………12VDC
- Corriente de alimentación………………….……………28mA
- Entadas digitales 5-12VDC……………………….……6
- Entadas Analógicas 0-5VDC……………………….……2
- Salidas RLY…………………………………………………………4
-
- Tensión AC…………..……….………………….….……250V
- Corriente AC…………………………………………….10A
- Tensión DC………………………………………………30V
- Corriente DC……………………………………………10A
-
- Salidas RLY…………………………………………………………4
-
- TensiónDC…………..……….………………….….……12V
- Corriente DC…………………………………………….500mA
-
- Entorno de programación………………………..………..Arduino IDE
- Comunicación I2C……………………………….……..………..Sí
- DIP switch conf…………………………………………………………Sí
- Condiciones ambientales min……………………….….-40°
- Condiciones ambientales max…………………..……….150°
- Dimensiones……………………………………………………….85x65mm
- Empotrable………………………………….……………………Sí
- Programación directa (PC-Tarjeta electrónica)…………Sí
LISTA DE MATERIALES

Categoría | Cantidad | Referencias | Valor | PCB Package | Datasheet |
Condensadores | 2 | C1,C7 | 100uF | ELEC-RAD13 | |
Condensadores | 1 | C2 | 220uF | CAP SMD 6.3X7.7MM ALUMINUM 220UF/16V | |
Condensadores | 1 | C3 | 100nF | 1206_CAP | |
Condensadores | 2 | C4,C8 | 1000uF | ELEC-RAD20 | |
Condensadores | 10 | C5,C6,C9,C10,C11,C12,C13,C14,C15,C16 | 100nF | 0603_CAP | |
Condensadores | 4 | C17,C18,C19,C20 | 10uF | 1206_CAP | |
Resistencias | 7 | R1,R2,R3,R7,R9,R11,R24 | 1k | 0603_RES | |
Resistencias | 1 | R4 | 1M | 0603_RES | |
Resistencias | 13 | R5,R8,R10,R12,R13,R15,R17,R19,R21,R23,R25,R38,R39 | 10k | 0603_RES | |
Resistencias | 6 | R6,R14,R16,R18,R20,R22 | 2.2k | 1206_RES | |
Resistencias | 4 | R26,R27,R28,R29 | 4.7k | 0603_RES | |
Resistencias | 4 | R30,R31,R32,R33 | 220 | 0603_RES | |
Resistencias | 4 | R34,R35,R36,R37 | 1k | 1206_RES | |
Integrados | 1 | U1 | LM2576-5,0 | TO170P1410X464-6 | |
Integrados | 1 | U2 | ATMEGA328P | QFP80P900X900X120-32 | |
Integrados | 1 | U3 | CH340C | SO16 | |
Integrados | 5 | U4,U5,U6,U7,U8 | ILD207T | SO8 | |
Integrados | 1 | U9 | ULN2803 | SO18W | |
Transistores | 4 | Q1,Q2,Q3,Q4 | PMBT3904,215 | SOT23-3 | |
Diodos | 3 | D1,D2,D12 | B330A-13-F | SMA(DO-214AC) | |
Diodos | 5 | D3,D8,D9,D10,D11 | LED-RED | LEDC2012X120 | |
Diodos | 5 | D4,D5,D6,D7,D13 | 1N4148W | SOD-123 | |
Miscelánea | 1 | BTN1 | RST | BUTTON SMD 2P | |
Miscelánea | 1 | DSW1 | DIPSW_2 | SW-DIP2 | |
Miscelánea | 1 | F1 | 1A | FUSE SMD | |
Miscelánea | 1 | J1 | MICRO USB B | MICRO USB B | |
Miscelánea | 7 | J2,J3,J6,J7,J8,J9,J10 | TBLOCK-M3 | TERMINAL BLOCK 3P | |
Miscelánea | 4 | J4,J5,J11,J12 | TBLOCK-M2 | TERMINAL BLOCK 2P | |
Miscelánea | 1 | J13 | CONN-SIL4 | CONN 4P 2.5MM | |
Miscelánea | 1 | L1 | 100u | INDUCTOR 100UH | |
Miscelánea | 4 | RL1,RL2,RL3,RL4 | 12V | RL12V NORMAL | |
Miscelánea | 1 | X1 | CRYSTAL SMD S | OSCILADOR SMD CERAMIC RESONATORS |
CODIGO

#include <LiquidCrystal_I2C.h> // Debe descargar la Libreria que controla el I2C #include<Wire.h> LiquidCrystal_I2C lcd(0x27, 20, 4); // ENTRADAS DIGITALES EXT 12V const int in2 = 3; const int in3 = 4; const int in4 = 5; const int in5 = 6; const int in6 = 7; // ENTRADAS DIP SWITCH const int in7 = 8; const int in8 = 9; // SALIDAS TRANSISTORES const int OUT1 = 10; const int OUT2 = 11; const int OUT3 = 12; const int OUT4 = 13; // SALIDAS RELAYS const int E_V = 14; const int BOMBA = 15; const int OUT7 = 16; const int OUT8 = 17; int contador = 0; volatile double flujo; int S_F = 0; int P_C = 0; int OK = 0; int OP2 = 0; int OP3 = 0; int RV2 = 0; int LAST_C_P = 0; int filling = 0; int TIME = 3000; boolean TIEMPO = false; byte soles = 0; boolean E0, E1, E2 = false; boolean T01, T12, T20 = false; void setup() { Serial.begin(9600); lcd.init(); lcd.backlight(); lcd.setCursor(1, 0); lcd.print("ELECTROALL."); delay(600); lcd.setCursor(2, 1); lcd.print("ELECTROALL.."); delay(700); lcd.setCursor(3, 2); lcd.print("ELECTROALL..."); delay(800); lcd.setCursor(4, 3); lcd.print("ELECTROALL..."); delay(1000); lcd.clear(); pinMode(in2, INPUT); pinMode(in3, INPUT); pinMode(in4, INPUT); pinMode(in5, INPUT); pinMode(in6, INPUT); pinMode(OUT1, OUTPUT); pinMode(OUT2, OUTPUT); pinMode(OUT3, OUTPUT); pinMode(OUT4, OUTPUT); pinMode(E_V, OUTPUT); pinMode(BOMBA, OUTPUT); pinMode(OUT7, OUTPUT); pinMode(OUT8, OUTPUT); flujo = 0; attachInterrupt(0, pulse, RISING); //DIGITAL Pin 2: Interrupt 0 //attachInterrupt(1, coin, RISING); //DIGITAL Pin 3: Interrupt 1 } void loop() { P_C = digitalRead(in2); OK = digitalRead(in3); OP2 = digitalRead(in4); OP3 = digitalRead(in5); RV2 = digitalRead(in6); if (E0 == true) { if (P_C != LAST_C_P) { if (P_C == LOW) { if (soles < 3) { soles++; lcd.clear(); } } } } LAST_C_P = P_C; //INICIALIZACION*************************** if ((!E1 && !E2) == true) { E0 = true; } //TRANSITION********************************* //from if (E0 == true && (soles == 1 || soles == 2 || soles == 3) && OK == true) { lcd.clear(); T01 = true; T20 = false; } if (E1 == true && (filling == 1 || filling == 2 || filling == 3) ) { lcd.clear(); T12 = true; T01 = false; } if (E2 == true && TIEMPO == true ) { lcd.clear(); T20 = true; T12 = false; } //ETAPA************************************** if (E0 && T01 == true) { E0 = false; E1 = true; } if (E1 && T12 == true) { E1 = false; E2 = true; } if (E2 && T20 == true) { E2 = false; E0 = true; } //ACTUADORES********************************* //Reposo if (E0 == true) { digitalWrite(E_V, LOW); digitalWrite(BOMBA, LOW); flujo = 0; filling = 0; if (soles == 0) { lcd.setCursor(0, 0); lcd.print("BIENVENIDOS A H2O FT"); lcd.setCursor(2, 1); lcd.print("CUANTOS L DESEA?"); lcd.setCursor(0, 3); lcd.print("1L = 1 2L = 2 3L = 3"); } if (soles == 1) { lcd.setCursor(4, 0); lcd.print("TIENE UN SALDO"); lcd.setCursor(2, 1); lcd.print("DE: S/."); lcd.print(soles); lcd.setCursor(3, 3); lcd.print("1 litro de agua"); } if (soles == 2) { lcd.setCursor(4, 0); lcd.print("TIENE UN SALDO"); lcd.setCursor(2, 1); lcd.print("DE: S/."); lcd.print(soles); lcd.setCursor(3, 3); lcd.print("2 litro de agua"); } if (soles == 3) { lcd.setCursor(4, 0); lcd.print("TIENE UN SALDO"); lcd.setCursor(2, 1); lcd.print("DE: S/."); lcd.print(soles); lcd.setCursor(3, 3); lcd.print("3 litro de agua"); } } // LLENANDO AGUA if (E1 == true) { digitalWrite(E_V, HIGH); digitalWrite(BOMBA, HIGH); if (soles == 1) { lcd.setCursor(5, 0); lcd.print("LLENANDO..."); lcd.setCursor(3, 1); lcd.print("1 Litro de agua"); lcd.setCursor(0, 3); lcd.print("PROCESO Ltrs. = "); lcd.print(flujo); if (flujo >= 1.0) { filling = 1; } } if (soles == 2) { lcd.setCursor(5, 0); lcd.print("LLENANDO..."); lcd.setCursor(3, 1); lcd.print("2 Litros de agua"); lcd.setCursor(0, 3); lcd.print("PROCESO Ltrs. = "); lcd.print(flujo); if (flujo >= 2.0) { filling = 2; } } if (soles == 3) { lcd.setCursor(5, 0); lcd.print("LLENANDO..."); lcd.setCursor(3, 1); lcd.print("3 Litros de agua"); lcd.setCursor(0, 3); lcd.print("PROCESO Ltrs. = "); lcd.print(flujo); if (flujo >= 3.0) { filling = 3; } } } //COMPLETADO if (E2 == true) { digitalWrite(E_V, LOW); digitalWrite(BOMBA, LOW); lcd.setCursor(6, 0); lcd.print("COMPLETO!"); lcd.setCursor(1, 1); lcd.print("RETIRE EL PRODUCTO"); lcd.setCursor(1, 3); lcd.print("MUCHAS GRACIAS..."); soles = 0; delay(TIME); TIEMPO = true; } } void pulse() { flujo += 1.0 / 450.0; } /* void coin() { soles++; }*/