Control de nivel de agua con PIC16F84A

Para poder realizar el control de nivel de agua en un tanque se puede hacer con flip-flops, en este caso ocupé un PIC como para simplificar las cosas y realizarlo más rápido...Está hecho en base al PIC 16F628A que es la sucesión del PIC 16F84A por lo que el programa se puede adaptar fácilmente, ya que sus pines son compatibles entre sí.El funcionamiento se basa en dos niveles, uno alto y otro bajo, colocados en el tanque, recipiente, etc. Al cargarse el agua supera el nivel inferior, y continúa hasta llegar al nivel superior, que es en donde la salida (relé electromagnético) cambia de estado provocando la interrupción de la carga de agua (motor). Entonces ahora se produce la descarga (consumo de agua), bajando el agua ya sin estar en contacto con el nivel superior la salida continúa en corte, hasta que el nivel de agua baje más y deje de estar en contacto con el nivel inferior que es cuando vuelve el ciclo, y se produce la carga.

Los niveles formados por un par de conductores como cobre.

La parte lógica quedaría así:Nivel superior en 1 (contacto con el agua) y nivel inferior en 1 -> Carga de agua interrumpida (tanque lleno).Nivel superior en 0 (no hay contacto con el agua) y nivel inferior en 0 -> Activación del motor (carga de agua).Ahora el tema está cuando los niveles son distintos:Si el nivel inferior está en 0 y pasa a 1 (carga de agua) se debe continuar la carga hasta que el nivel superior también esté en 1.Si el nivel superior está en 1 (tanque lleno) y pasa a 0 el motor debe seguir desactivado hasta que el nivel inferior también pase a 0.En caso de que al activar el circuito se encuentre con niveles distintos (inferior en 1 - superior en 0) por defecto se activa la salida para producir la carga de agua.

Conector 1 y 2 son los del nivel inferior. Conector 3 y 4 del nivel superior.

El programa en pic basic pro:

cmcon = 7
INA VAR portb.2
INB VAR portb.3
estado var byte  
estadob var byte
OUT var portb.4

pro:
    estado = INA + INB
    if INA = 0 and INB = 0 then encender; ambos en nivel bajo ENCIENDE
    if INA = 1 and INB = 0 then tema; ACA ESTA EL TEMA, condicionales para saber por donde viene
    if INA = 1 and INB = 1 then apagar; ambos niveles altos SE APAGA
goto pro

encender:   
    estadob = 00; si ambos sensores estan en 0 quiere decir que no hay agua
    high OUT; por lo tanto se enciende la salida
    pause 500       
goto pro

tema:
    if estadob = 11 then
        low out; si los sensores estaban en 1 y el de arriba pasa a 0 la salida
               ; sigue en nivel bajo (el tanque continua en descarga)
    elseif estadob = 00 then
        high out; si los sensores estaban en 0 y el de abajo pasa a 1 la salida
                ; sigue en nivel alto (el tanque se sigue cargando)       
    else
        high out; en caso de que un sensor este en 1 y el otro en 0 por defecto
                ; la salida pasa a 1 (se carga el tanque hasta el 11)  
    endif
    pause 500 
goto pro

apagar: 
    estadob = 11; si ambos sensores estan en 1 quiere decir que el tanque esta lleno
    low out; por lo tanto se apaga la salida
    pause 500
goto pro

end

Descargar programa hecho en PIC Basic PRO: control nivel de agua.pbp

Diseño del pcb con PCB Wizard: pistas del control de nivel de agua diseñado en PCB Wizard.

Diseño en Proteus (ISIS): control de nivel de agua simulado en ISIS.

Programa compilado para el PIC 16F628A: control nivel de agua.hex

Para la simulación en ISIS agregar el programa compilado al PIC 16F628A haciendo doble clic en el PIC y en "program file" elegir el programa compilado (.hex) previamente descargado a tu computadora.Ahora sólo queda quemarlo y probar 😀