¡Buenas a todos!
En esta entrada os explicaré como funciona y cómo montar un termómetro digital con un PIC. El PIC por si solo no puede detectar cambios de temperatura por lo que obviamente necesitaremos un sensor de temperatura.
¿Qué necesitaré para montarlo?
-
PIC (que tenga modulo A/D y con suficientes patillas para conectar un display LCD)
-
Display LCD
-
LM35 o LM335 (el LM35 y el LM335 son sensores de temperatura, el primero da un voltaje de 10mV/ºC y el segundo da un voltaje de 10mV/K. El LM335 tiene la ventaja sobre el LM35 que se puede ajustar su valor por una patilla en caso de que no este bien regulado)
-Una resistencia de 1KΩ en el caso de que hayas elegido el LM335
Circuito con el sensor LM35:
Imagen 1: Circuito Termómetro digital PIC+ LM35
Con el sensor LM335 sería igual solo que habría que colocar una resistencia de 1KΩ (ojo solo si lo vamos a alimentarlo con 5V, si se alimenta con menos habría que hacer la cuentas), entre la fuente y la patilla +
Circuito con el sensor LM335:
Imagen 2: Circuito Termómetro digital PIC+ LM335
¡Ojo con las patillas! Son diferentes las del LM35 y las del LM335
Vista mirando los sensores con las patillas en perpendicular al plano
Imagen 3: Patillas LM35 y patillas LM335
Nota: Si vuestro sensor tiene otro encapsulado revisad el datasheet. Os he puesto un enlace arriba en los dos nombres
Bueno antes de poneros el código para programarlo, os explicaré como funciona el termómetro para que se entienda mejor el código.
Como dije al principio de esta entrada el sensor de temperatura ya sea el LM35 o el LM335 da un voltaje por una de sus patillas a razón de 10mV/ºC o 10mV/K, la idea es transformar estos voltios a grados Celcius o Kelvin y representarlo por una pantalla, pero ¿cómo?
Lo que haremos será conectar la patilla del sensor que nos da los voltios a una patilla del pic y mediante el módulo A/D (analógico/digital) muestrear y cuantizar la señal analogica que nos va llegando (en este caso una señal electrica), y guardarla en una variable del pic para luego trabajar con ella.
Si utilizamos 10 bits para la conversion A/D, tendremos 1024 "niveles" para usar (2^10). Y si ponemos un limite de una tensión de 5V (esto lo fijaremos en una patilla del pic que tenga la función de Vref, tensión de referencia) , cada nivel será de 0.0048 V (5V/1024 posibles niveles).
Imagen 4: Cuantización de una señal analógica
En el compilador CCS tenemos una función que se llama read_adc() que nos devuelve el nivel de la tensión que hay en ese momento en la patilla que estemos usando como A/D.
Luego una vez que guardemos el valor del nivel (con lectura=read_adc()) podremos calcular la tensión con la siguiente forma:
voltios=5.0*lectura/1024.0;
Una vez calculada cuanta tensión nos da el sensor lo único que tendremos que hacer será pasarla a temperatura multiplicándola por 100.
temperatura=voltios *100;
Hay que tener una cosa en cuenta, si usamos el LM335 aparte de multiplicar los voltios por 100 tendremos que que restarle 273 si queremos que nos de la temperatura en ºC (recordad que el LM335 tiene una razón de 10mV/K)
Y para tener el termómetro continuamente actualizado usaremos un bucle infinito.
Aqui teneís el código para el PIC16F88 con el sensor LM335:
#include <16F88.h>
#device adc=10 //Ponemos que se usen 10 bits para A/D
#use delay(clock=8000000) //Frecuencia de reloj de 8MHz
#include
<lcd.c>
void main()
{
int16 lectura;
float voltios;
float grados;
/************************Configuración
delPIC*****************************/
setup_oscillator(OSC_8MHZ); //Usamos el oscilador interno del PIC a 8MHz
setup_adc_ports(ALL_ANALOG); //Todos los puertos A como analogicos
setup_adc(ADC_CLOCK_INTERNAL); //Reloj interno para laconversion ADC
setup_comparator(NC_NC_NC_NC);
set_tris_a
(0b11111111); //Configuramos todo el puerto A como entrada
/************************************************************************/
lcd_init();
//Inicializamos el display LCD
while(true)
{
set_adc_channel(0); //PIN_A0 como canal analogico
delay_us(20);
lectura=read_adc();
//Leemos el nivel del PIN
voltios=5.0*lectura/1024.0; //
grados=voltios*100-273;
//10mV/1K -273= ºC
printf(lcd_putc,"\f"); //Limpiamos la LCD
delay_ms(1);
printf(lcd_putc,"Temperatura ");
printf(lcd_putc,"\n %01.2f C", grados);
delay_ms(500);
}
}
Para cualquier duda escribir un comentario,
Espero os haya gustado esta entrada.
Un Saludo.