Buscar en este blog

lunes, 11 de julio de 2011

Sensor temperatura ambiente con LM335

Este circuito lo realicé para poder medir la temperatura ambiente.
Circuito para medir temperatura ambiente mediante sensor LM335 + microcontrolador PIC12F675

Como sensor de temperatura utilizo un sensor analógico LM335. El valor que entrega el sensor es convertido a digital mediante el conversor de un microcontrolador PIC 12F675 y luego, este mismo microcontrolador, envía el resultado de la conversión a la PC mediante el puerto serie y utilizando el protocolo RS232.
Diagrama de bloques del sistema
A su vez en la PC se ejecuta un programa escrito en Python que se encarga de solicitar los datos al PIC y mostrarlos en pantalla. Para utilizar el archivo Python deben tener instalado Python y PySerial.

Circuito

El diagrama del circuito utilizado es el siguiente (también lo encuentran en los archivos adjuntos al final de este post):

Esquema del circuito

La alimentación del circuito es provista por el pin 4 (DTR) del puerto serie de la PC y luego este voltaje es regulado por el integrado LP2950 de salida nominal de 3.3 V.

Funcionamiento

Inicialmente el PIC se encuentra en modo SLEEP (durmiendo). Un programa escrito en Python se ejecuta en la PC. Este, cuando desea obtener una lectura de la temperatura, modifica el estado del pin 7 (RTS) del puerto serie de la PC.

Ante esto el PIC sale del modo SLEEP, polariza al sensor, realiza una conversión A/D del valor de voltaje entregado por el sensor LM335 y envía el resultado hacia la PC mediante el pin 2 (RX) del puerto serie de la misma. Luego vuelve a modo SLEEP.

El valor enviado por el PIC a la PC son dos bytes que juntos forman un valor decimal que está entre 0 y 1023, correspondiente al resultado de la conversión A/D. Aquí 0 equivale a un valor de 0V leídos en el sensor y 1023 a haber leído un valor de VCC Volts en el sensor.

Luego el programa escrito en Python se encarga de convertir el valor pasado por el PIC al valor correspondiente de temperatura y mostrarlo en pantalla.

El programa escrito en Python, ejecutado en este caso desde Windows XP, realizando varias lecturas de temperatura

Sensor

El sensor LM335 tiene 3 pines de los cuales sólo utilizo 2. A su vez, el restante que no utilizo (ADJ), lo corté (y limé al raz) porque el dejarlo "al aire" introducía ruido en la lectura de la temperatura y fue la solución que encontré.
Sensor LM335 con su pin ADJ cortado para eliminar ruido
El sensor fue colocado luego en la garita meteorológica explicada en este post.

Algunas consideraciones

VCC

En el archivo Python hay una constante denominada "Vref" cuyo valor debe ser el voltaje VCC con el que alimenten al PIC en su circuito. No es el valor teórico de VCC sino que tienen que medirlo con un tester en el circuito montado.

Este valor es el que toma como referencia el PIC para realizar la conversión A/D del valor leído desde el sensor LM335. Por lo tanto, el valor de VCC en el circuito debe ser estable (fijo) o de lo contrario las lecturas van a tener errores. Una variación de por ejemplo 100mV equivale a un error de 10 grados Celcius en la lectura.

En mi caso utilizo un regulador de voltaje LP2950 que mantiene VCC=3.27V. Se podría utilizar algún otro regulador más conocido como un 7805 o un LM317 siempre que se aseguren que los voltajes que estos entreguen se mantengan estables.

Resistencia R4 y corriente de polarización

La resistencia R4 de 330 Ohm que está en serie con el sensor LM335 se utiliza para polarizar el sensor.
Polarización del sensor LM335 mediante una resistencia en serie con este
Según la hoja de datos del sensor, este funciona correctamente para corrientes de polarización comprendidas entre aproximadamente 500uA y 5mA. La fórmula para esta corriente es: I = (VCC - VLM335) / R4 donde VLM335 = 2.73V @ 0 Celcius y varía 10mV/Celcius. Si T es la temperatura en Celcius, esto se puede escribir como:
  • I = ( VCC - ( 2.73 + 0.01*T ) ) / R4
Es decir que en el circuito propuesto, diseñado para trabajar entre -10C y +40C, las máximas y mínimas corrientes serán:
  • I @ 40 Celcius = ( 3.27 - ( 2.73 + (40*0.01) ) ) / 330 = 424uA
  • I @ -10 Celcius = ( 3.27 - ( 2.73 + (-10*0.01) ) ) / 330 = 1.93mA
En caso de utilizar VCC distinto a los 3.27V que utlizo en el circuito, deben modificar el valor de la resistencia R4 para que en las temperaturas extremas, la corriente por el sensor se mantenga dentro de los límites.

Quizá lo ideal sería polarizar el sensor con una fuente de corriente constante y no con una resistencia.

Interfaz PIC-PC

En el circuito no utilizo un integrado MAX232 para nivelar los voltajes del puerto serie con el VCC del circuito; sino que utilizo unos transistores en configuración emisor común. He probado el circuito en dos tres computadoras (todas de escritorio) tanto con Windows como con GNU/Linux y no he tenido problemas.

Protección?

El componente D3 del circuito no es necesario y puede no colocarse. El mismo es un "diodo avalancha" que supuestamente cortocircuita sus extremos cuando se presenta un voltaje superior a 120V. Realmente no se si es de utilidad pero lo coloqué como una posible protección ante un pico de voltaje que provenga desde el sensor que se encuentra ubicado en el exterior.

Distancia del sensor al circuito

El sensor está colocado a unos 15-20 metros de distancia del circuito en un ambiente con bastante ruido eléctrico y por ahora la lectura se ha podido realizar bien.

Windows - GNU/Linux

El código Python para comunicarse con el circuito lo he utilizado tanto en Windows XP como en Debian GNU/Linux.

Al final del post adjunto dos archivos con código Python; uno para GNU/Linux y otro para Windows. La única diferencia entre uno y otro es la línea donde define la dirección del puerto serie ya que esta no es la misma para GNU/Linux y Windows.

Código Python realizando lecturas desde Debian GNU/Linux

A su vez, las direcciones utilizadas ('/dev/ttyS0' y 'COM1') en el código son las más usuales pero podrían ser otras en su computadora. Por ejemplo, bajo Windows, su puerto serie podría estar en COM3 en lugar de COM1.

Finalmente agregar que en Windows XP utilizo la versión 2.7.1 de Python y la 2.5 de PySerial y en Debian GNU/Linux utilizo Python 2.6.6 y PySerial 2.3-1. Este último aparece en los repositorios de Debian (Squeeze) como un paquete de nombre "python-serial".

Archivos del circuito

Por un lado están:
Este último es el que hay que cargar al PIC. En el archivo assembler pueden encontrar una explicación de lo que hace el PIC.

Para armar el circuito o modificarlo les pueden ser útiles los archivos de proyecto en Kicad entre los cuales pueden encontrar un archivo postscript (.ps) con el PCB exportado (trazado) y listo para armar el circuito impreso.

Finalmente está el archivo con el código Python que se ejecuta en la PC. Como indicaba más arriba hay un código para Windows XP y otro para GNU/Linux que solamente se diferencian en una línea.

En los archivos pueden encontrar algún comentario más sobre el proyecto.

Álbum en Flickr

En este link pueden encontrar más fotos del proyecto.

2 comentarios:

  1. y tu conclusion es ????

    ResponderEliminar
  2. Bien charly, si funca te mando 10 pesos por correo argentino

    Fdo.

    El Forro

    ResponderEliminar