# Mi solucion al llenado automatico de un tinaco y su cisterna



## judio (Feb 15, 2013)

Primero que nada quiero aclarar que el contenido de mi tema no coincide con temas previos publicados en este foro y no me ayudan a resolver mi caso particular 

Hola, les cuento que estoy haciendo un proyecto de llenado automatico de mi tinaco, esto debido a los problemas que he tenido por ejemplo: dejar abierta la llave que llena un tambo como de 50 litros (que funciona como cisterna) y el agua se esta tire y tire sin que me de cuenta, o que el tinaco este vacio y no me percate de ello me meta a bañar y el agua se me acabe a medio baño, tambien me a pasado que mientras estoy llenando el tinaco no me doy cuenta que no le cabe mas agua y sigo mandandole agua hasta que esta comienza a caer del tinaco me doy cuenta que ya se lleno. 

En fin un sin numero de problemas a los que ya deseo darle una buena solucion y para eso esta mi proyecto.

Este proyecto se llevara acabo con los siguientes componentes (tratare de ser lo mas preciso posile aunque algunos componentes pueden variar debido a que mi proyecto esta en fase de desarrollo):

- 1 PIC16F877A 44-PIN-TQFP este es para montaje superficial (SMD)
- 6 Switch´s para deternimar el nivel del agua en el tinaco y la cisterna (3 en cada contenedor)
- 1 electrovalvula 1/2" Normalmente Cerrada (NC)
- 1 bomba de agua para llenar el tinaco
- 1 PCB de doble cara
- 1 cristal a 4 MHZ (SMD)
- 2 capacitores de 22pf (SMD 0805)
- 2 resistencias de 330R (SMD 0805)
- 1 Frasco de estaño en pasta para soldar los compenentes SMD con facilidad y sin utilizar pasta
- 1 cautin a base de gas butano para soldar los componentes SMD
- 1 frasco con pegamento a base de carbon conductivo para comunicar la cara TOP con la DOWN de la PCB de doble cara
- Brocas para hacer los orificios que van desde 0.2mm a 2mm
- 2 moc3011
- 2 BT137
- 1 7805 para regular el voltage del PIC
- 1 capacitores de 104nf (SMD 0805)


Dejo simulacion hecha en proteus, la cual donde estan los switch´s de 6 pines seran sustituidos por los switchs que mediran el nivel del agua.

Y donde van los led´s que representan la bomba y la electrovalvula seran sustituidos por dos moc3011 y sus respectivos BT137




Sin mas les dejo mi codigo fuente el cual seguro estoy va asufrir aun cambios pero almenos ya cumple algunas condiciones


```
#include <16f877a.h>
#fuses xt,nowdt
#use delay(clock=4000000)

//Declaracion de variables globales
#DEFINE retardo 250    // Retardo de 250ms
 
void main(void)
{
set_tris_a(0b00001110);
set_tris_b(0b11111110);

///////////////////////////////////////////////////////////////////////////////////////////////////
while(true)
   {
///////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////// BLOQUE PARA LLENADO DE CISTERNA Y TINACO////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////


//SI CISTERNA ESTA 3/3 Y TINACO 0/3  (1)(SI CUMPLE)
    if(((input(PIN_A1)==0)&&(input(PIN_A2)==0))&&(input(PIN_A3)==1)&&(input(PIN_E2)==1)&&(input(PIN_E1)==1)&&(input(PIN_E0)==1))
           output_high(pin_b0);                          // ENCIENDE BOMBA PORQE LA CISTERNA ESTA LLENA 3/3 Y EL TINACO VACIO 0/3
           
//SI CISTERNA ESTA 2/3 ALTO Y TINACO 1/3 BAJO (2)(SI CUMPLE)           
else if((((input(PIN_A1)==1)&&(input(PIN_A2)==0))&&(input(PIN_A3)==1))&&(input(PIN_E2)==0)&&(input(PIN_E1)==1)&&(input(PIN_E0)==1))
            output_high(pin_b0);                         // ENCIENDE BOMBA PORQE LA CISTERNA TIENE 2/3 Y EL TINACO ESTA 1/3
            
//SI CISTERNA ESTA 1/3 Y TINACO 2/3 ALTO (3)(SI CUMPLE)
else if((((input(PIN_A1)==1)&&(input(PIN_A2)==1))&&(input(PIN_A3)==1))&&(input(PIN_E2)==0)&&(input(PIN_E1)==0)&&(input(PIN_E0)==1))
            output_high(pin_b0);                         // ENCIENDE BOMBA PORQE LA CISTERNA TIENE 1/3 Y EL TINACO 2/3

//SI CISTERNA ESTA 0/3 Y TINACO 3/3 BAJO (4)(SI CUMPLE)
else if((((input(PIN_A1)==1)&&(input(PIN_A2)==1))&&(input(PIN_A3)==0))&&(input(PIN_E2)==0)&&(input(PIN_E1)==0)&&(input(PIN_E0)==1))
            output_low(pin_b0);                          // APAGA BOMBA PORQUE LA CISTERNA 0/3 Y TINACO 3/3 BAJO
            
            
//SI CISTERNA ESTA 0/3 Y TINACO 3/3 (5)(SI CUMPLE)   
else if((((input(PIN_A1)==1)&&(input(PIN_A2)==1))&&(input(PIN_A3)==0))&&(input(PIN_E2)==0)&&(input(PIN_E1)==0)&&(input(PIN_E0)==0))
            output_low(pin_b0);                          // APAGA BOMBA PORQUE LA CISTERNA LLEGO A 0/3 Y EL TINACO ESTA 3/3
            
//SI CISTERNA ESTA 0/3 Y TINACO 0/3 (6)(SI CUMPLE)
else if((((input(PIN_A1)==1)&&(input(PIN_A2)==1))&&(input(PIN_A3)==0))&&(input(PIN_E2)==1)&&(input(PIN_E1)==1)&&(input(PIN_E0)==1))
            output_low(pin_b0);                          //APAGA BOMBA PORQUE LA CISTERNA LLEGO A 0/3 Y EL TINACO ESTA 0/3
            
//SI CISTERNA ESTA 0/3 Y TINACO 1/3 ALTO (7)(SI CUMPLE)
else if((((input(PIN_A1)==1)&&(input(PIN_A2)==1))&&(input(PIN_A3)==0))&&(input(PIN_E2)==0)&&(input(PIN_E1)==1)&&(input(PIN_E0)==1))
            output_low(pin_b0);                          //APAGA BOMBA PORQUE LA CISTERNA LLEGO A 0/3 Y EL TINACO ESTA 1/3

//SI CISTERNA ESTA 3/3 Y TINACO 3/3 BAJO (9)(SI CUMPLE))
else if((((input(PIN_A1)==0)&&(input(PIN_A2)==0))&&(input(PIN_A3)==1))&&(input(PIN_E2)==0)&&(input(PIN_E1)==0)&&(input(PIN_E0)==1))
            output_high(pin_b0);                          //PRENDE BOMBA PORQUE LA CISTERNA LLEGO A 3/3 Y EL TINACO ESTA 3/3 BAJO

                         //APAGA BOMBA PORQUE LA CISTERNA TIENE 0/3 Y TINACO 3/3 BAJO
//SI CISTERNA ESTA 3/3 Y TINACO 3/3 ALTO (10)(SI CUMPLE)
else if((((input(PIN_A1)==0)&&(input(PIN_A2)==0))&&(input(PIN_A3)==1))&&(input(PIN_E2)==0)&&(input(PIN_E1)==0)&&(input(PIN_E0)==0))
            output_low(pin_b0);                          //APAGA BOMBA PORQUE LA CISTERNA TIENE 3/3 Y TINACO 3/3 ALTO
   }
}
```

Y aqui una consulta, como hacer para que mi codigo se vuelva a ejecutar hasta que X condicion se cumpla? Me refiero a que si mi cisterna tiene 1/3 de agua y el tinaco esta vacio 0/3 en mi programa la bomba comienza a enviar agua debido a que la cisterna si tiene agua, pero como hacer para que ignore todas las condiciones que hay en el programa y solo vuelva a enviar nuevamente agua hasta que la cisterna este llena por completo?, y ya que este llena la cisterna comience a enviar agua pero que ahora si tome en cuenta todas mis condiciones que puse en el programa.

Siento que podria ser con una interupcon pero la verdad no se si sea posible hacerlo asi......



Salu2


----------



## judio (Feb 15, 2013)

Buenas noches, con la novedad de que el programa ya me quedo.

A la hora de simularlo funcional tal cual lo imagine.

Por ejemplo: 

Si la cisterna esta llena 3/3 y el tinaco lleno 3/3 la electrovavula permanece cerrada y la bomba apagada.

Si la cisterna esta llena 3/3 y el tinaco 1/3 la electrovalvula se abre para llenar la cisterna y la bomba se prende para enviar agua al tinaco, como mi cisterna (tambo de 50 litros) es de menor capacidad que el tinaco de 1100L esta se va a vaciar mas rapido, pasando por la mitad de su capacidad 2/3 aun con la electrovalvula abierta y la bomba enviando agua al tinaco, llegando a 1/3 en las mismas condiciones electrovalvula abierta llenando la cisterna y la bomba enviando agua al tinaco, hasta llegar a 0/3 de su capacidad en la cisterna la electrovalvula permanece abierta hasta que la cisterna se llena por completo una vez mas a 3/3 y la bomba mientas la cisterna se esta llenando permanece apagada por consiguiente sin enviar agua.


Dejo el codigo fuente, la simulacion de proteus por el momento sigue siendo la misma pero funcional a este caso particular:


```
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///                                                                                             ///
///   PROGRAMA PARA AUTOMATIZAR EL LLENADO DE UN TINACO APARTIR DE UNA CISTERNA                 ///
///                                                                                             ///
///                                                                                             ///
///                                                                                             ///
///                                                                                             ///
/// Autor: Martinez Aguirre Angel Jesus   (JUDIO)                                               ///
/// Version: 1.0                                                                                ///
///                                                                                             ///
///                                                                                             ///
///                                                                                             ///
///                                                                                             ///
///                                                                                             ///
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////


#include <16f877a.h>
#fuses xt,nowdt
#use delay(clock=4000000)

//Declaracion de variables globales
#DEFINE retardo 250    // Retardo de 250ms
 
void main(void)
{
set_tris_a(0b00001110);
set_tris_b(0b11111110);

///////////////////////////////////////////////////////////////////////////////////////////////////
while(true)
   {
///////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////// BLOQUE PARA LLENADO DE CISTERNA Y TINACO////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////


//SI CISTERNA ESTA 3/3 Y TINACO 0/3  (1)(SI CUMPLE)
    if(((input(PIN_A1)==0)&&(input(PIN_A2)==0))&&(input(PIN_A3)==1)&&(input(PIN_E2)==1)&&(input(PIN_E1)==1)&&(input(PIN_E0)==1))
           {
           output_high(pin_b0);                          // ENCIENDE BOMBA PORQE LA CISTERNA ESTA LLENA 3/3 Y EL TINACO VACIO 0/3
           output_high(pin_b1);                          // ABRE LA ELECTROVALVULA PORQUE CISTERNA TIENE 3/3 Y EL TINACO VACIO 0/3
           }
//SI CISTERNA ESTA 2/3 ALTO Y TINACO 1/3 BAJO (2)(SI CUMPLE)           
else if((((input(PIN_A1)==1)&&(input(PIN_A2)==0))&&(input(PIN_A3)==1))&&(input(PIN_E2)==0)&&(input(PIN_E1)==1)&&(input(PIN_E0)==1))
           {
         //output_low(pin_b0);                         // APAGA BOMBA PORQE LA CISTERNA TIENE 2/3 Y EL TINACO ESTA 1/3
           output_high(pin_b1);                         // ABRE LA ELECTROVALVULA PORQUE CISTERNA TIENE 2/3 Y EL TINACO 1/3
           } 
//SI CISTERNA ESTA 1/3 Y TINACO 2/3 ALTO (3)(SI CUMPLE)
//else if((((input(PIN_A1)==1)&&(input(PIN_A2)==1))&&(input(PIN_A3)==1))&&(input(PIN_E2)==0)&&(input(PIN_E1)==0)&&(input(PIN_E0)==1))
//           {
//           output_high(pin_b0);                         // ENCIENDE BOMBA PORQE LA CISTERNA TIENE 1/3 Y EL TINACO 2/3
//           output_high(pin_b1);                         // ABRE LA ELECTROVALVULA PORQUE CISTERNA TIENE 1/3
//           }
//SI CISTERNA ESTA 0/3 Y TINACO 3/3 BAJO (4)(SI CUMPLE)
else if((((input(PIN_A1)==1)&&(input(PIN_A2)==1))&&(input(PIN_A3)==0))&&(input(PIN_E2)==0)&&(input(PIN_E1)==0)&&(input(PIN_E0)==1))
           {
           output_low(pin_b0);                          // APAGA BOMBA PORQUE LA CISTERNA 0/3 Y TINACO 3/3 BAJO
           output_high(pin_b1);                         // ABRE LA ELECTROVALVULA PORQUE CISTERNA TIENE 0/3
           } 
            
//SI CISTERNA ESTA 0/3 Y TINACO 3/3 (5)(SI CUMPLE)   
else if((((input(PIN_A1)==1)&&(input(PIN_A2)==1))&&(input(PIN_A3)==0))&&(input(PIN_E2)==0)&&(input(PIN_E1)==0)&&(input(PIN_E0)==0))
           { 
           output_low(pin_b0);                          // APAGA BOMBA PORQUE LA CISTERNA LLEGO A 0/3 Y EL TINACO ESTA 3/3
           output_high(pin_b1);                         // ABRE LA ELECTROVALVULA PORQUE CISTERNA TIENE 0/3
           } 
//SI CISTERNA ESTA 0/3 Y TINACO 0/3 (6)(SI CUMPLE)
else if((((input(PIN_A1)==1)&&(input(PIN_A2)==1))&&(input(PIN_A3)==0))&&(input(PIN_E2)==1)&&(input(PIN_E1)==1)&&(input(PIN_E0)==1))
           {
           output_low(pin_b0);                          // APAGA BOMBA PORQUE LA CISTERNA LLEGO A 0/3 Y EL TINACO ESTA 0/3
           output_high(pin_b1);                         // ABRE LA ELECTROVALVULA PORQUE CISTERNA TIENE 0/3
           } 
//SI CISTERNA ESTA 0/3 Y TINACO 1/3 ALTO (7)(SI CUMPLE)
else if((((input(PIN_A1)==1)&&(input(PIN_A2)==1))&&(input(PIN_A3)==0))&&(input(PIN_E2)==0)&&(input(PIN_E1)==1)&&(input(PIN_E0)==1))
           { 
           output_low(pin_b0);                          // APAGA BOMBA PORQUE LA CISTERNA LLEGO A 0/3 Y EL TINACO ESTA 1/3
           output_high(pin_b1);                         // ABRE LA ELECTROVALVULA PORQUE CISTERNA TIENE 0/3
           }
//SI CISTERNA ESTA 3/3 Y TINACO 3/3 BAJO (9)(SI CUMPLE))
else if((((input(PIN_A1)==0)&&(input(PIN_A2)==0))&&(input(PIN_A3)==1))&&(input(PIN_E2)==0)&&(input(PIN_E1)==0)&&(input(PIN_E0)==1))
           {
           output_high(pin_b0);                         // PRENDE BOMBA PORQUE LA CISTERNA LLEGO A 3/3 Y EL TINACO ESTA 3/3 BAJO
           output_high(pin_b1);                          // ABRE LA ELECTROVALVULA PORQUE CISTERNA TIENE 3/3 Y TINACO 3/3 BAJO
           }
//SI CISTERNA ESTA 3/3 Y TINACO 3/3 ALTO (10)(SI CUMPLE)
else if((((input(PIN_A1)==0)&&(input(PIN_A2)==0))&&(input(PIN_A3)==1))&&(input(PIN_E2)==0)&&(input(PIN_E1)==0)&&(input(PIN_E0)==0))
           {
           output_low(pin_b0);                          // APAGA BOMBA PORQUE LA CISTERNA TIENE 3/3 Y TINACO 3/3 ALTO
           output_low(pin_b1);                          // CIERRA LA ELECTROVALVULA PORQUE CISTERNA TIENE 3/3
           }

//SI CISTERNA ESTA 3/3 Y TINACO 1/3 ALTO (12)(SI CUMPLE)
else if((((input(PIN_A1)==0)&&(input(PIN_A2)==0))&&(input(PIN_A3)==1))&&(input(PIN_E2)==0)&&(input(PIN_E1)==1)&&(input(PIN_E0)==1))
           {
           output_high(pin_b0);                          // PRENDE BOMBA PORQUE LA CISTERNA TIENE 3/3 Y TINACO 1/3 ALTO
           output_high(pin_b1);                          // ABRE LA ELECTROVALVULA PORQUE CISTERNA TIENE 1/3 Y TINACO 1/3 ALTO
           }
   }
}
```


Compilado con CCS C 4.068 y simulado con ISIS Proteus 7.7 SP2


- Ya solo me falta declarar alguna condicion al programa para que el dia que de la tuberia no salga agua cierre la electrovalvula despues de cierto tiempo.

- Agregar led´s para que me indiquen el nivel de agua de la cisterna y del tinaco: LLENO, MEDIO, VACIO.

- Tal vez meta un LCD 16x2 para que indique de forma textual los niveles y estados.

- Tal vez meta una bocina que alerte cuando alguien prenda el boiler y esten vacias tanto cisterna como tinaco, para asi evitar quedarse a medias en el baño............ 

- La PCB  la diseñare con EAGLE, pronto la subire y mostrare el proyecto terminado a mas tardar el dia 22-FEBRERO-2013



Tambien adjunto imagenes de los estados posible/condiciones de funcionamiento tanto de la cisterna como del tinaco, de estas imagenes saque el codigo fuente y el numero encerrado entre () en los comentarios del codigo fuente al inicio de cada else if corresponde a el mismo numero de cada imagen por ejemplo el //SI CISTERNA ESTA 3/3 Y TINACO 3/3 ALTO (10)(SI CUMPLE) y la imagen que tenga el numero 10 son iguales y es para ayudar a comprobar su funcionamiento en proteus.




salu2


----------



## Gudino Roberto duberlin (Feb 18, 2013)

Amigo, por cuestiones de seguridad, no estaria de mas, que añadas un disyuntor diferencial, si tu sistema esta desprovisto de el.


----------



## judio (Feb 18, 2013)

yoeninstein dijo:
			
		

> que bien por ti voy a seguir al pendiente aber como te queda tu diceño te comento que padecemos de los mismo con el tinaco aunque no tengo sisterna enfin felicidades



Gracias, hoy publico ya todo el proyecto almenos en proteus y el diseño en eagle. Tambien ya funcionando en la protoboard.

 Y alrato que me lleguen los componentes ya pondre manos a la obra en el diseño final.

salu2 



Gudino Roberto duberlin dijo:


> Amigo, por cuestiones de seguridad, no estaria de mas, que añadas un disyuntor diferencial, si tu sistema esta desprovisto de el.



Hola gracias por el consejo, te cuento que ya me informe un poco sobre tu recomendacion y sigo sin enterder muy bien. Solo es para evitar recibir una descarga en caso de que no aisle bien el circuito? o que no tenga tierra?

salu2


----------



## analogico (Feb 18, 2013)

falta un diagrama del tinaco las valvulas y  las cañerias

por que la parte practica no se entiende


----------



## lucegiar2005 (Feb 18, 2013)

Buenos dias. Leyendo el post me surge la pregunta de si no está sobredimencionado el material y con ello el costo del proyecto. Dicho esto porque con un 16F628a y menos se puede concretar. Un 16f877a es enorme para este proyecto y se desperdicia mucho chip. No deseo molestar, sino hacer ver que los compomentes se deben estudiar acorde a necesidades. Un abrazo a todos


----------



## Gudino Roberto duberlin (Feb 18, 2013)

Amigo judio, el disyuntor diferencial, es muy importante sobre todo, en condiciones como la que utilizas. Pues te proteje ante descargas electricas, y NO la tomes como una opcion, sino como una obligacion.
Tampoco es por una cuestion de tierra, mas alla que deben hacerse las conexiones correspondientes de la misma.


----------



## judio (Feb 18, 2013)

analogico dijo:


> falta un diagrama del tinaco las valvulas y  las cañerias
> 
> por que la parte practica no se entiende



Hola analogico, pronto subire un video donde muestre el funcionamiento de todo almenos en la protoboard.

Tal vez alrato suba el video y ya mañana o pasado presente todo terminado  





lucegiar2005 dijo:


> Buenos dias. Leyendo el post me surge la pregunta de si no está sobredimencionado el material y con ello el costo del proyecto. Dicho esto porque con un 16F628a y menos se puede concretar. Un 16f877a es enorme para este proyecto y se desperdicia mucho chip. No deseo molestar, sino hacer ver que los compomentes se deben estudiar acorde a necesidades. Un abrazo a todos



Buenos dias lucegiar2005, sinceramente hasta ahorita se ocupa un 5% de la memoria de programa ahi tienes razon pareciera estar en un pic muy grande. Utilizar el pic16f877a se debe a que es un pic con el cual ya cuento en su version 40-PDIP y por futuras actualizaciones a mi proyecto el pic16f877a es el ideal para mi.

Pero igual si alguien en un futuro ve mi proyecto y le gusta creo yo (la verdad no tengo mucha experiencia) que seria muy facil cambiar de microprocesador a sus necesidades.

Salu2 y nada es molestia todo es bien recibido..... 





Gudino Roberto duberlin dijo:


> Amigo judio, el disyuntor diferencial, es muy importante sobre todo, en condiciones como la que utilizas. Pues te proteje ante descargas electricas, y NO la tomes como una opcion, sino como una obligacion.
> Tampoco es por una cuestion de tierra, mas alla que deben hacerse las conexiones correspondientes de la misma.



Buenas noches Gudino Roberto espero estes bien, necesito me explique mas por favor.

Si lo instalo seria  por donde esta el medidor no?, asi como en esta foto http://html.rincondelvago.com/000267796.png a lado de los fusibles termicos? 

o solo seria para mi circuito?


salu2


----------



## capitanp (Feb 19, 2013)

Tanto micro para algo tan facil....


----------



## aguevara (Feb 19, 2013)

Estimado Judio bien por tu proyecto y bueno solo tu sabes como seran las futuras ampliaciones del mismo, y si te es conveniente pues cambias el micro por uno mas adoc, pero eso tu lo determinas por lo pronto felicidades se ve ok.
Una pregunta donde conseguiste el estaño en pasta y el pegamento a base de carbon conductivo en mexico, he buscado aqui en monterrey y no lo encuentro, o sera que no he buscado correctamente ?


----------



## Gudino Roberto duberlin (Feb 19, 2013)

Amigo, bueno la instalacion del disyuntor diferencial, queda a criterio, puedes conectarlo en la entrada principal de alimentacion al hogar, o bien puedes utilizarlo solo para el proposito que tienes.
En ciertos casos, cuando se instalan para cubrir una instalacion electrica completa, resulta tedioso buscar la fuga, cuando el mismo se activa. En cambio, cuando se conecta en forma sectorizada, obviamente la falla sera mas facil hallarla. Exitos.-


----------

