Gracias en verdad me fue de mucha ayuda, ahora tengo otro problema, necesito que se active la misma alarma para un nivel inferior que en este caso sería de -1°C , igualmente pasado después de un tiempo, ya tengo una idea de como hacerle, lo que no sé es como sería para que me de temperaturas negativas el adc, ya sé que la configuración del lm35 lleva dos diodos para que me de un nivel negativo pero no sé como hacerle con eso, esa línea negativa del lm35 va a otro canal del adc?, y como lo pongo en el código?, o simplemente pongo el rango de -°1<temp<8 y ya ? o que onda?
Saludos, bueno, primero que nada hay que ver que onda con varios puntos importantes cuando trabajamos con el ADC, primero, veo que hiciste una conversion del ADC a 100, osea que cuando lees 255 corresponde el 100, eso esta bien pero en este caso talvez no, yo lo recomendaria de esta forma:
El sensor lm35 te da 10mV por grado, asi que podemos ajustar el voltaje de referencia alto (del PIC) a 2.56V, asi la resolucion del ADC sera de
2.56V/256=10mV por bit
Si te fijas de esta forma la resolucion del ADC es la misma que la del sensor, asi la lectura es directa, si la lectura del ADC da 25 entonces son 25° sin mas problema.
Para mover el voltaje de referencia hay que indicarlo con la funcion setup_adc_ports(modo); el modo lo puedes checar en el archivo de cabecera .h buscas las constantes que acepta esta funcion, quedaria algo asi:
setup_adc_ports(AN0_AN1_AN2_AN4_VSS_VREF);
Vref es la pata A3 y ahi colocamos un pot que ajuste el voltaje a 2.56V
Luego, para medir temperaturas negativas con el LM35 como dices, hay que leer ambas salidas la que dice + y la que dice -, por ninguna sale voltaje negativo sino que la diferencia entre estas es la temperatura, por ejemplo si el sensor saca por la salida "positiva" 0.02V y por la salida "negativa" 0.52V la diferencia es de -0.50 osea -50°.
saludos
pd talvez al rato suba algun codigo de ejemplo
Bueno, este es el codigo de las dos incubadoras, le quite lo que sobraba y lo deje un poco mas ordenado, enciende la alarma cuando esta fuera del rango (-1° a 8°) y nuevamente solo con uno de los sensores, espero te sirva de ejemplo:
Código:
#include <18F452.h> //Libreria del pic a usar aqui se pondra el pic que se usara de aqui que dependera la configuracion de los puertos y de los bytes
#fuses HS,NOWDT,NOPROTECT,NOLVP //tipo de cristal externo high speed, perro guardian off, sin proteccion etc..
#use delay(clock=20000000)
#include <flex_lcd.c>
double SEN,SEN2;
int16 segundos=0;
#define alarma PIN_B0
//Canales analogicos donde se conectan los sensores
#define sensor1_pos 0 //pin A0
#define sensor1_neg 1 //pin A1
#define sensor2_pos 2 //pin A2
#define sensor2_neg 4 //pin A5
void leer_sen1(void){
set_adc_channel(sensor1_pos); //selecciona el terminal positivo
delay_us(10); //del sensor 1
SEN=read_adc(); //y lo lee y guarda en SEN
set_adc_channel(sensor1_neg); //selecciona terminal negativo
delay_us(10); //
SEN=SEN-(read_adc()); //lo lee y lo resta de la lectura
//del terminal positivo
}
void leer_sen2(void){ //lo mesmo pero con el sensor2...
set_adc_channel(sensor2_pos);
delay_us(10);
SEN2=read_adc();
set_adc_channel(sensor2_neg);
delay_us(10);
SEN2=SEN2-(read_adc());
}
void main()
{
lcd_init();
setup_adc_ports(AN0_AN1_AN2_AN4_VSS_VREF);
setup_adc(ADC_CLOCK_DIV_64);
lcd_gotoxy(2,1);
printf(lcd_putc,"REFRI1:");
lcd_gotoxy(2,2);
printf(lcd_putc,"REFRI2:");
while(true)
{
leer_sen1(); // toma la lectura del sensor1 ya sea positiva o negativa
lcd_gotoxy(9,1); // Y LO MUESTRA EN EL LCD
printf(lcd_putc," %2.1fC",SEN);
leer_sen2(); //toma la lectura del sensor2 ya sea positiva o negativa
lcd_gotoxy(9,2); // Y LO MUESTRA EN LCD
printf(lcd_putc," %2.1fC",SEN2);
if( (SEN>8) | (SEN<-1) ){ // si SEN supera 8 grados o baja de -1 entonces
segundos++; // se incrementa el contador de segundos y
if(segundos==5){ // se pregunta si ha llegado a X segundos (en este caso 5 para no esperarme tanto, en tu caso seria 900)
output_high(alarma); // si segundos ha llegado a 5 encender alarma
}
}
else{
segundos=0; // resetea la cuenta de segundos
output_low(alarma); // y apaga la alarma si es que ya hubiera sido activada
}
delay_ms(1000); // simple retardo de 1 segundo sin usar timer ni interrupciones
} //cierra loop infinito
} //cierra main
este es de ejemplo y funciona, seguramente se puede hacer mejor.
Saludos
De una vez dejo la imagen en proteus de como conectar los lm35 y todo, haber si a alguien mas le puede servir:
saludos