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.
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.
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 😀