TOP

Termómetro digital con PIC

¡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 2Circuito 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.

47 comentarios:

  1. el codigo es para el sensor lm335 o el lm35 ???

  2. Es para el lm335
    Lo unico que cambiaria para el lm35 es que no hay que pasar la temperatura a grados celcius ya que el lm35 esta diseñado para darlo ya en ºC.
    Es decir para el lm35 no hace falta restarle -273 aqui:
    "grados=voltios*100-273; //10mV/1K -273= ºC"

  3. y el pic 16F88 se encuentra en el mercado asi ??, no le falta algún dígito, como por ejemplo, 16F887 ???

  4. Si está el PIC 16F88 sin ningún número más. http://es.rs-online.com/web/p/microcontroladores/6230487/

    No obstante el código es probable que funcione en los PIC16F88X (siendo X un numero) tan solo cambiando a su librería, por ejemplo el PIC16F887 la primera linea del código sería:
    #include <16F887.h>

  5. gracias

  6. y como hago para simularlo en proteus, osea, cual es el codigo para cargarle??porque los archivos que tiene son con terminacion "h" y otro "c"

  7. Compila el código con el CCS Compiler y te crearan varios archivos, entre otros uno ".cof" y otro ".hex", puedes cargarle cualquiera de los dos para simularlo en el proteus.

    Un Saludo!

  8. otra cosa, me tira varios errores al compilar, no tenes el asm del codigo??

  9. o el .hex del codigo ???

  10. Es raro que te de errores al compilar : /
    Te dejo aqui el archivo .hex http://www.mediafire.com/?gdx9wo9qebnuvm9

  11. me bota este error cuando lo pruebo en el proteus
    hd44780 attempted to read after writing a single nibble

  12. Hola marcos laqui
    Si has descargado el código que puse en esta entrada y te compiló bien el CCS podría ser o que no has conectado bien los cables a la LCD en el simulador o que sea problema de la versión que tengas de proteus (ya que he leido gente que con una version de proteus la LCD HD44780 le da problemas)
    Yo tengo la version 7.8
    Saludos

  13. el int 16 que significa en el copiler

  14. Hola Eliseo
    El "int16" es un tipo de dato entero de 16 bits.

  15. Este comentario ha sido eliminado por el autor.
  16. hola a mi me funciono muy bien pero se presenta un pequeño parpadeo en los datos que muestra en la LCD como hago para que esto no ocurra.

  17. Hola victor prueba a subir la frecuencia del reloj si esta usando el interno, si no prueba a poner un cristal de mayor frecuencia.

  18. Disculpa, si quisiera agregar que al llegar a cierta temperatura me arroje una señal, por ejemplo activar un LED o un BUZZER tengo que cambiar algo en ese programa, o sólo agrego el condicional? Planeo hacer esto en un PIC16F887

  19. Sergio, nada más que cuando calcules los grados poner un "if" que compruebe si es mayor igual que la temperatua deseada o menor igual que la temperatura deseada.
    Si quieres hacer mas cosas con el PIC sería conveniente hacer la lectura de los grados mediante interrupciones.
    Saludos

  20. Disculpa, mi LCD es una JHD 162A. ¿Habrá algun problema o si funcionara?

  21. No creo que tengas problema, la lcd que tienes acabo de mirar y tiene el controlador HD44780 que es compatible con la libreria lcd.c de CCS

  22. Hola, muchas gracias, soy estudiante de mecatronica, llevo la materia de sensores, y me ando metiendo en cosas que no deberia por ahora, porque no he llevado la materia de microcontroladores, todo parecia mas sencilloo, usando arduino, pero el profesor queria la simulasion, es aun mas complicado usar el Vbb por cuestiones d elicencia para usar arduino, y finalmente encontre tu pagina espero mi sirva, apenas en esta semana me entero que es un archivo, .bas. .hex. .cof etc etc, algunas instrucciones basicas, lenguajes existen infinidad, y cada persona sabe hacer las cosas de distinta manera, algunos suben codigos en picbasicpro, otros en ensamblador etc etc, y nadie tiene un totorial exacto, finalmente con tu ayuda, y un video de youtube espero sacar el problemon en que me meti

  23. oye me puedes explicar el porque de todas los calculos que hiciste porfavor

  24. que tal con que ide programaste porque yo rogramo con mikrobasic pro y me da error de sintaxis

  25. que tal simule tu codigo el que le enviaste a matias cordoba el 10 de agosto nadamas que solo enciende el display y no aparece nada si enciende el display pero no aparecen nada en el

  26. Buenas Jorge.
    Primero gracias por visitar mi blog.
    El código que puse es para el compilador de CCS por lo que es normal que te de error de sintaxis. No se como va la sintaxis de mikroC por lo que no te puedo ayudar, lo siento.
    Un saludo.

  27. como puedo programar el sensor lm335 con un pic 16f873?

  28. Hola Zara .
    Para el pic 16f873 se puede hacer de la misma manera como lo hice en la entrada de este blog. Eso si cambia la libreria del PIC por el tuyo.
    Saludos

  29. Hola
    porque mi LCD solo marca puros cuadros

  30. este hex lo lee el pickit ?para directo ir y programarlo en el pic ?

  31. Que version de cc compiler utilizas? me marca varios errores en las lineas de LCD

  32. Hola, para esamblar el codigo hace falta usar mplap?

  33. Rikz puede que tu problema sea que no esté encontrando la libreria del LCD. Yo estoy usando el ccs compiler 4.1
    Martín Perez para compilarlo necesitas el ccs compiler. Si solo quieres probarlo solo tienes que grabar el ".hex" en tu pic (si es el 16F88)
    Saludos!

  34. Ya he compilado en ccs compiler y agregado el .hex y el .cof pero no se observa nada en el display solo enciende... gracias

  35. pasa tu correo para contactarte.... gracias por contestar

  36. oye no tendras el codigo para el pic 18f4550

  37. hola gracias por el gran aporte pero me gustaria preguntarte y no se si me puedas apoyar como hago para hacer el mismo circuito con un pic diferente estoy experimentando y ?como lo haria para el pic 16f628a o 12f675 ?gracias

  38. hola gracias por el gran aporte pero me gustaria preguntarte y no se si me puedas apoyar como hago para hacer el mismo circuito con un pic diferente estoy experimentando y ?como lo haria para el pic 16f628a o 12f675 ?gracias

  39. hola que tal buenas tardes como estas?
    hey una pregunta enorme
    no lo tienes con mikroC?

  40. Es muy bueno la verdad, compré uno parecido en una farmacia online y estoy muy contento con la compra, merecen la pena la verdad

  41. Agregué el .HEX que mandaste a proteus y solo me enciende el display, que puede ser el problema? o crees poder ayudarme a hacer un codigo para pic16f84a? te dejo mi correo Hecnaru@gmail.com

  42. HolA paara el pic16f84a podria reemplazar al 16f88 ??? . Gracias

  43. HolA paara el pic16f84a podria reemplazar al 16f88 ??? . Gracias

  44. hay algun cambio para el pic 18F4550??

  45. Buenas noches, funciona sin ocupar el gotoxy?

  46. no me muestra nada en el lcd ademas viendo no se activa la salida que va al pin 14 del lcd el lcd sequeda en blanco

  47. Hola.
    He introducido el codigo que dejaste en el compilador que yo utilizo, que es el MPLAB, también he introducido unas libreriás correspondientes al LCD y al PIC16F88 que he encontrado por internet. Pero me saltan errores. Podrías colgar las librerías que utilizas para ejecutarlo? Muchas gracias.

Publicar un comentario