Para quiénes necesiten mantener la temperatura dentro un rango determinado, este post es el indicado. Por medio de un DS18B20 de Dallas (Maxim) podemos medir temperaturas desde -55 ºC a 100ºC con una resolución seleccionable de 9 a 12 bits. En este ejemplo se muestra la temperatura actual en un display inteligente de LCD donde la idea es fijar la temperatura en 27ºC con una ventana de histéresis térmica de 1ºC usando un 16F628A
El protocolo de comunicación entre el PIC y el DS18B20 se hace solamente utilizando un terminal del mismo, se llama 1-Wire interface y hay muchísimos dispositivos que lo utilizan, por lo que el código servirá para cualquiera de ellos.
Como se ve en la imagen de arriba, el DS18B20 viene en un encapsulado TO-92 y es muy sencillo de colocar en el elemento al cual queremos medirle la temperatura. En el circuito se puede ver que no puse ningún dispositivo calefactor, sino un led que enciende emulando que hay un circuito entregando calor en ese momento.
La ventana de histéresis térmica es de 1ºC, con lo cual mientras la temperatura medida esté dentro delñ rango [26..28]ºC el led estará apagado. Al momento de sobrepasar la temperatura de los 28ºC se activará una alarma (y quién desee puede agregar acá un circuito enfriador). Si la temperatura está por debajo de los 26ºC se activará el circuito calefactor hasta que llegue a la temperatura deseada.
Si bien este tipo de control es ON-OFF, dado la propia inercia térmica de la mayoría de los fluidos y elementos que se deben controlar la temperatura, podemos estar seguros que siempre estará en el entorno previsto.
En el código siguiente se puede ver que los valores máximos y mínimos de temperatura están en variables, por lo que es muy sencillo agregar unos pulsadores en los terminales libres para modificarlos mientras se está ejecutando el sistema. También recomiendo guardar estos valores en la EEPROM para evitar tener que hacer el set-point cada vez que se alimente el circuito.
void alarma();
void main(){
float temperatura;
float minimo;
float maximo;
lcd_init();
minimo=26;
maximo=28;
while (1){
temperatura = ds1820_read();
lcd_gotoxy(1,1);
printf(lcd_putc,"TEMP: %3.1f ", temperatura);
lcd_putc(223);
lcd_putc("C ");
lcd_gotoxy(1,2);
if (temperatura<=minimo){
printf(lcd_putc,"Frio! Calentando");
output_high(PIN_A1);}
if (temperatura>=maximo){
printf(lcd_putc,"Caliente! ");
output_low(PIN_A1);
alarma();}
if ((temperaturaminimo)){
printf(lcd_putc,"Temperatura OK ");
output_low(PIN_A1);}}
}
void alarma(){
output_high(PIN_B3);
delay_ms(100);
output_low(PIN_B3);
delay_ms(100);}
Las librerías usadas fueron las utilizadas acá y la propia del LCD que trae el CCS.
Simulacion en Proteus
En el video se puede apreciar los tres estados posibles del display el sonido de alarma cuando sube la temperatura. En el momento de grabar el video la simulación se hace bastante lenta (si, ya sé que tengo que cambiar la PC) es por eso que parece que la alarma suena un poco descoordinada.

oye compa estoy tratando de hacer este proyecto pa la escu
pero necesito conectar mas ds18b20 tal vez unos 15, sabes como lo puedo hacer???
saludos
esta muy interesante
Comentario por favian — 29 octubre 2009 @ 21:57 |
lo intente, pero la temperatura siempre me marca 0 grados, alguna idea?
Comentario por Izquierdo — 29 noviembre 2009 @ 17:42 |
La primera pregunta es: ¡te devuelve los 9 bytes y el CRC marca bueno?
Atte.
Franklin
Comentario por Franklin — 19 diciembre 2009 @ 22:11 |
Hola amigo.
tengo el problema que nunca me marca más de 50°C a pesar que le pongo un cautín al lado, y por el lado bajo nunca me marca menos de 20°C con hielo!!
El CRC está bueno, qué será??
…Quién podrá ayudarme?
Atte
Franklin
Comentario por Franklin — 19 diciembre 2009 @ 22:10 |
O ye ya se que es mucho pedir pero no tendras el codigo de el pic ya que yo desconosco
sobre la programacion de estos bueno boy empesando es solo como pasatiempo
estoy tratando de realisar una incubadora para huevos de gallina
y tu programa tiene loq ue yo ocupo
ueno muchas racias
Comentario por joel — 5 mayo 2010 @ 17:25 |
Que parte del encapsulado TO-92 es la que mide la temperatura????
Y por cierto estoy tratando de conectar 300 sensores de estos (ds18b20) si funciona les aviso
Comentario por Phoebby — 12 mayo 2010 @ 15:43 |
hola estoy probando un DS18B20 y en el proteus solo me sale en la LCD -0,5 ºC y ya no se que hacer. me podria ayudar alguien. los codigos son los mismo que nos dejan en esta web.
muchas gracias
Comentario por pcexpos — 27 septiembre 2010 @ 6:49 |
Hola mira sabes que estoy tratando de guardar los datos que tira el ds18b20 en una eeprom externa, tu sabes como lo puedo hacer??, ya he probado tantos codigos y no logro obtener nada y es lo unico que me falta para terminar mi proyecto de titulacion.
De antemano gracias.
Comentario por clau — 6 octubre 2010 @ 18:33 |