////////////////////////////////////////////////////////////////////////////////////
//
// 26/noviembre/15
//
//
// Programa: Sistema de riego automatico
// Version: 1.0
//
// Dispositivo: PIC 18DF4550 Compilador: CCS vs3.249
// Entorno IDE: MPLAB IDE v7.31 Simulador: Proteus 8.1 sp1
//
// Notas: Este programa mide la humedad de la tierra en una maseta y la
// compara con unos parametros prestablecidos en su memoria, si
// es menor a la minima enciende una bomba que suministra agua a
// la tierra de la maseta hasta llegar al maximo prestablecido
// para el mejor desarrollo de la planta.
//
//
//
//////////////////////////////////////////////////////////////////////////////////
#include <18f4550.h> //incluir la libreria del pic 18f4550
#device adc=10 //Configuracion del convertidor a/d de 10 bits
#use delay(clock=4M) //velocidad del reloj interno a 4MHz
#fuses XT,NOWDT //Activacion de fuses
#define D0 enable ///////////////////////////////////////////////////
#define D1 rs //
#define D2 rw // Declararacion de los pines
#define D4 D4 // que se usaran para controlar
#define D5 D5 // la LCD
#define D6 D6 //
#define D7 D7 ///////////////////////////////////////////////////
#include <lcd4202.c> // LLamado a la libreria que controla las funciones del LCD
#include <KBD1.c> // LLamado a la libreria que controla al teclado 4x4
#define in_port pin_A1
#use standard_io(c) // Configurando el puerto C
void main() //
{
int16 q; // variable de 16bits que almacena el valor del ADC del higrometro
float T; // variable de tipo flotante que guarda el valor de una operacion de "q"
int humedad; // variable que guarda el valor de humedad del 0% al 100%
char k; // variable de tipo cadena utilizada para saber que tecla se oprimio en el teclado
int hmin; // Variable de humedad minima
int hmax; // variable de humedad maxima
int val;
val=0;
setup_adc_ports(AN0);//condigura el pin de entrada del ADC en este caso el pin A0
setup_adc(ADC_CLOCK_INTERNAL); //configura el reloj interno del ADC
lcd_init(); //inicializa la LCD
kbd_init(); //inicializa el teclado
port_b_pullups(TRUE);//activa las resistencias internas del puerto b
menu: //etiqueta de nombre menu que servira para regresar con la instruccion goto a este punto
printf(lcd_putc,"\f Tipo de planta:"); //imprime en la LCD la oracion "tipo de planta"
k=0; //valor de k a cero
while(K==0) //bucle que se repite siempre que k sea igual a cero
{
k=kbd_getc(); // k sera igual a la tecla introducida en el teclado
switch (k) // sentencia switch que depende del valor de k
{
case '1': ////////////////////////////////////
hmin=60; //
hmax=80; //
break; //
case '2': // Casos dependiendo de la
hmin=45; // tecla que se introduzca en
hmax=80; // el teclado
break; // Se definen los valores de
case '3': // humedad minima y maxima
hmin=20; //
hmax=30; //
break; ////////////////////////////////////
}
}
principal: //Etiqueta de nombre 'principal'
while(true) //Bucle infinito
{
k=kbd_getc(); //k sera igual al valor tecleado
set_adc_channel(0); //lectura del canal cero
delay_us(20); // retardo
q=read_adc(); //de le asigna el valor a q de lo leido en el canal cero del ADC
q=1023-q; // seinvierte el valor de q
T=(5.0*q)/1024; //Operacion matematica que le asigna el valor a T
humedad=(100*T)/5; //conversion a porcentaje
humedad=1.43*humedad; //correccion del valor de porcentaje de la humedad
delay_us(10);
lcd_gotoxy(1,1); // se posiciona en la linea uno y columna uno de la LCD
printf(lcd_putc, "Humedad = %3d%% ", humedad); // Da salida a la oracion y al valor de la variable humedad en forma de porciento
lcd_gotoxy(1,3); // se posiciona en la linea 1 y columna tres de la LCD
printf(lcd_putc,"H.Min:%2d%%H.Max:%2d%%",hmin,hmax ); // Da salida a la oracion y al valor de las variables de humedad minima y maxima seleccionada en un principio
val= input(pin_A1);
lcd_gotoxy(1,4);
printf(lcd_putc,"tanque %u",val );
k=kbd_getc(); //k sera igual al valor tecleado
if (k=='A'){ //sentecia condicional de comparacion del valor de k
goto menu; //si k es igual a la letra 'A' se posiciona en la etiqueta 'menu'
}
if(humedad <= hmin) ////////////////////////////////////////////
{ // Si el valor de humedad es menor o igual al
if(!input(PIN_A1)){
lcd_gotoxy(1,2); // valor de hmin entonces da salida en la fila tres
printf(lcd_putc,"Rellene tanque ");
output_low(pin_c0);
}
else if (input(PIN_A1)){
lcd_gotoxy(1,2); // valor de hmin entonces da salida en la fila tres
printf(lcd_putc,"bomba on "); // la oracion bomba on, que significa que se prendera la bomba
output_high(pin_c0); // y manda la señal al pinC0 de ponerse en nivel alto
}
} ////////////////////////////////////////////
else if(humedad >= hmax ) //////////////////////////////////////////
{ // Si el valor de humedad es mayor o igual al maximo
lcd_gotoxy(1,2); // entonces se imprimira 'bomba off' en la lcd
printf (lcd_putc,"bomba off "); // y el pinc0 quedara en nivel bajo, por lo que se
output_low(pin_c0); // apagara la bomba
} //////////////////////////////////////////
}
} //fin del programa
Primero verificaria que valores tiene la entrada del PIC, que realmente tenga 5V o 0V y no intermedios.Tengo otro problema, cambie el pin A1 al pin C1, cuando no hay ningun cable en la entrada c1 si me marca el mensaje de rellene su tanque, pero cuando conecto un cable (el cable no esta conectado a nada, solo es el puro cable) se aloca mi sistema, mi relevador se acciona y desacciona cada segundo, cuando desconecto el cable me marca de nuevo rellene el tanque, cuando le conecto directo los 5v me acciona el sistema, no se por que se aloca cuando conecto un cable que no tiene nadamas conectado, solo es el puro cable.
y no hay un retardo antirebote prudencial al leer el pin A1?
yo acostumbro a inicializar todos los puertos empezando en main, así utilice input()
Tengo otro problema, cambie el pin A1 al pin C1, cuando no hay ningun cable en la entrada c1 si me marca el mensaje de rellene su tanque, pero cuando conecto un cable (el cable no esta conectado a nada, solo es el puro cable) se aloca mi sistema, mi relevador se acciona y desacciona cada segundo, cuando desconecto el cable me marca de nuevo rellene el tanque,
Disculpa palitroquez, el retardo antirebote se hace poniendo un delay?
Disculpa, como podria hacerle para polarizar mi pin, ya le puse un delay pero lo unico que hace es que me varia mas lento, no se si pueda hacerlo con programacion o deba de ser poniendo un cable a tierra en la misma linea del pin en la protoboard, igual no se si sea mala idea haber cambiado al pin C1 ya que declare el puerto C como #use standard_io(c)CitarTengo otro problema, cambie el pin A1 al pin C1, cuando no hay ningun cable en la entrada c1 si me marca el mensaje de rellene su tanque, pero cuando conecto un cable (el cable no esta conectado a nada, solo es el puro cable) se aloca mi sistema, mi relevador se acciona y desacciona cada segundo, cuando desconecto el cable me marca de nuevo rellene el tanque,
Como bien te ha dicho killer, no puedes poner un intermedio, debes polarizar el pin.
Al ponerle un "simple cable" le estas poniendo una antena, y estas variando la tensión, lo suficiente como para que cambie de estado lógico 0a1 y viceversa.CitarDisculpa palitroquez, el retardo antirebote se hace poniendo un delay?
Respuesta corta, si, con un delay, respuesta larga, no debes usar delay hazlo con timers y una variable.
Un saludo.
un ejemplo de retardo antirebotes por softwaresCódigo: C
if(!input(PIN_ENTRADA_DIGITAL)){ delay_ms(15); if(!input(PIN_ENTRADA_DIGITAL)){ .... ....
pero tendrás que probarlo (en físico), y dependiendo tendrás que ajustarle el tiempo o la cantidad de validaciones
le agregue una resistencia de 330ohms