TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Dante en 05 de Diciembre de 2017, 01:56:59
-
Hola compañeros programadores, en este dia me dispongo a realizar un nuevo proyecto, se que como novato no dispongo de la experiencia, así que les pido su ayuda y experiencia para poder solucionar un problema que tengo con este codigo que estoy realizando, estoy utilizando la plataforma de Pic c, para realizar un sistema invernadero, mi sistema dispone de los siguientes elementos, tres potenciometros, un lm35 y un yl 69(sensor de humedad) además de un sistema de iluminación, controlando la intensidad por medio de un potenciómetro, En este momento estoy utilizando varias entradas del adc, para poder realizar las conversiones de temperatura, y humedad, y aclaro antes de que se comente este detalle, soy demasiado novato y dispongo solo de los conocimientos del manual pic, y videotutoriales de youtube por lo que sé que mi codigo es más que insuficiente, aclarado eso :mrgreen:, con los potenciómetros me gustaría realizar dos parámetros para la temperatura y para el YL 69, este parámetro es un set, este set para el lm35 sería una temperatura introducida por el usuario y dependiendo si esta temperatura es mayor o menor, se activarán unos ventiladores, para que la temperatura disminuya y un foco incandescente para que la temperatura aumente, en el caso del yl si la humedad llega a un rango set, se activa una bomba sumergible.
prácticamente mi problema es al realizar el ciclo de comparación entre el set colocado por el usuario y la temperatura , ya que por la manera en que coloco mi ciclo . y tambien tengo problemas ya que no me quiere leer el último adc que ocupo, que es el de la intensidad luminosa. de la manera mas atenta les agradezco su ayuda y cualquier comentario es bien recibido, gracias y bonito día.
#include <16f877a.h>
#device adc=10
#fuses hs,nowdt
#use delay(clock=20M)
#define lcd_data_port getenv("sfr:portb")
#define lcd_rs_pin pin_b0
#define lcd_rw_pin pin_b1
#define lcd_enable_pin pin_b2
#include <lcd.c>
void main()
{
int16 t1,t3,s1,s3,l1;
float t2,t4,s2,s4,l2;
setup_adc_ports(all_analog);
setup_adc(adc_clock_internal);
lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc, "Valor: Actual / Sets");
while(true)
{
set_adc_channel(0);
delay_us(20);
t1=read_adc();
t2=(5.0*t1)/1024.0;
t2=t2*100;
delay_us(50);
set_adc_channel(1);
delay_us(20);
t3=read_adc();
t4=(5.0*t3)/1024.0;
////// mi problema empieza aquí
if(t4<t2) /// entonces la temperatura disminuye
{
while(t4!=t2)
{
output_high(pin_b7);
delay_ms(3000);
}
}
else //temperratura aumente con el foco
{
while(t4!=t2)
{
output_high(pin_b7);
delay_ms(2000);
}
}
// en esta parte es el problema si la quito ya me imprime los prints, pero no se como colocar la comparacion
lcd_gotoxy(1,2);
printf(lcd_putc,"Temper %.0f C / %.0f C",t2,t4);
delay_us(50);
set_adc_channel(2);
delay_us(20);
s1=read_adc();
s1=1023-s1;
s2=(5.0*s1)/1024.0;
s2=(s2*100)/5;
delay_us(50);
set_adc_channel(3);
delay_us(20);
s3=read_adc();
s4=(5.0*s3)/1024.0;
lcd_gotoxy(21,1);
printf(lcd_putc,"Humedad %.0f %% / %.0f %% ",s2,s4);
delay_us(50);
set_adc_channel(4);
delay_us(20);
l1=read_adc();
l2=(5.0*l1)/1024.0;
lcd_gotoxy(21,2);
printf(lcd_putc,"Luz %.0f %%",l2);
//delay_ms(1500);
}
}
-
Hola Dante, visto asi por encima, veo varios errores.
Primero, asignas el puerto B al LCD, pero tambien lo utilizas para las salidas de bomba y luz, que por cierto el segundo error es que no distingues entre esas dos salidas y las colocas ambas sobre el pin B7. En tercer lugar, la comparacion en el if para activar/desactivar esas salidas la haces a <NO IGUAL> y le pones un delay bastante amplio, por tanto puede ocurrir que durante el delay, el valor haya superado en sentido contrario al esperado y nunca activara/desactivara la bomba o la luz. Creo que la comparacion deberias hacerla con otro criterio, que garantice que no se pase el parametro de los valores esperados e igualmente trata de evitar los delays, sobretodo con valores tan altos. Ten en cuenta que durante el delay el PIC no hace nada, solo esperar.
Saludos.
P.D.: Acabo de darme cuenta tambien, que tal como lo tienes hecho con un solo if + else y una vez corregidas las salidas para distinguir entre bomba y luz, siempre habria una o las dos encendidas. Deberias hacerlo con dos if y la comparacion a <MAYOR QUE> y <MENOR QUE>, dependiendo del dispositivo a activar.
-
:mrgreen: :mrgreen: :mrgreen: o Vaya puse una versión menos reciente de la que tengo, ciertamente es un problema en las salidas del b7, aunque eso ya lo tenia puesto en otro puerto diferente, haré caso a tu recomendación y vere si con eso queda muchas gracias