Con bastante frecuencia recibimos consultas sobre cómo funciona o cuáles son las partes que conforman un termómetro. Hoy decidimos no solo explicarte cómo funciona uno de estos instrumentos, sino que también te damos todos los datos necesarios para que construyas un termómetro electrónico utilizando lo aprendido en el tutorial sobre programación de microcontroladores.

Termómetros mecánicos y electrónicos

En general, los termómetros empleados con fines domésticos pueden ser de dos tipos: mecánicos o electrónicos. Dentro de la primera categoría se incluyen los denominados termómetros de mercurio, que basan su funcionamiento en la propiedad que tienen los cuerpos de dilatarse a medida que aumenta la temperatura. En el caso de los termómetros de mercurio, se dispone de un pequeño depósito lleno de este metal, que está conectado a un capilar de vidrio transparente sobre el que se encuentra una escala graduada en grados.

Cuando la temperatura es baja, el mercurio ocupa menos espacio que a altas temperaturas. De esta manera, a medida que sube la temperatura, el mercurio se va desplazando por dentro del capilar, ya que no cabe dentro del depósito. La forma de leer estos termómetros consiste en observar la escala y ver hasta qué punto ha subido el metal. Este tipo de termómetro se hizo muy popular debido a su bajo costo y a que funciona perfectamente en el rango de temperaturas en las que vive el hombre.

Pero últimamente han aparecido en el mercado los termómetros electrónicos, cuya lectura es más sencilla, y además, no contienen mercurio, que es un gran contaminante del medio ambiente. Estos termómetros funcionan convirtiendo las variaciones de temperatura en una variación de una tensión o corriente, que luego es evaluada por un microcontrolador y mostrada sobre un display.

Construye tu propio termómetro digital

Partes del Termómetro
Construiremos dos PCB.
Partes del Termómetro
Vista del lado soldaduras.
Partes del Termómetro
Partes del Termómetro

Algunos de los sensores de temperatura más modernos incluso incorporan en su interior un pequeño microprocesador que se encarga de hacer la conversión entre temperatura y un valor digital, que puede enviar por uno de sus pines en forma de una serie de “0”s y “1”s cuando es “interrogado” desde el exterior. Uno de los más económicos y fáciles de conseguir es el DS1820, de Dallas.

Utilizando un pequeño microcontrolador y uno de estos sensores de temperatura resulta muy fácil construir un termómetro digital casero. En este caso, las partes del termómetro serán el sensor de temperatura, el microcontrolador y el display. El esquema electrónico que vemos más abajo muestra la forma en que se deben conectar estos elementos.

Los que han seguido las notas sobre electrónica en NeoTeo no tendrán dificultades en descubrir cómo funciona el circuito, que emplea un registro de desplazamiento de 16 posiciones para el manejo del display. Hemos dividido el circuito impreso en dos partes, una para la electrónica de control y otra para el display propiamente dicho. Ambos PCB pueden verse en las imágenes que acompañan el artículo.

Partes del Termómetro
Este es el circuito eléctrico del termómetro.
Partes del Termómetro
Las dos placas se unen mediante cablecillos.
Partes del Termómetro
PCB 1: Placa del controlador.
Partes del Termómetro
PCB 2: Placa de los displays.
Partes del Termómetro
Partes del Termómetro

Por supuesto, la parte más importante de todo el proyecto es el programa que debemos cargar en el microcontrolador para que sea capaz de mostrar en el display la información deseada. No abundaremos aquí respecto de la forma en que se interroga al sensor y se obtienen datos desde el DS1820, ya que el artículo sería demasiado extenso, pero consultando su hoja de datos podrán sacarse las dudas que tengan sobre su funcionamiento.

El software: código en BASIC

El software que listamos a continuación está lo suficientemente comentado como para que no surjan dudas sobre su funcionamiento. Lo hemos escrito en el BASIC del PIC SIMULATOR IDE, y muestra temperaturas entre 0 y 99 grados centígrados. El sensor de Dallas tiene una precisión mayor, pero no hemos utilizado decimales para que el proyecto sea más sencillo y fácil de comprender.

 '---------------------------------------------------
 Termómetro 00 a 99 grados con 16F627A – v1.01.00
 '----- CONFIGURO PUERTOS-----
 PORTA = 0
 CMCON = 7 'Configuro A como Digital I/O
 TRISA = 0 'todo Salidas
 TRISB = 0 'todo Salidas
 '----- Variables----------------------------
 Dim tempe1 As Byte 'Parte entera de la temperatura a mostrar
 Dim tempe2 As Byte 'Decimales de la temperatura a mostrar
 Dim comando As Byte 'Comando a enviar al DS1820
 Dim tempe As Word 'Temperatura leída (usada en las rutinas del DS1820)
 Dim i As Byte 'Variable auxiliar multipropósito
 Dim col As Byte 'Variable auxiliar multipropósito
 Dim aux As Byte 'Variable auxiliar multipropósito
 Dim aux2 As Byte 'Variable auxiliar multipropósito
 Dim unidad As Byte 'Variable: unidades
 Dim decena As Byte 'Variable: decenas
 '----- Símbolos----------------------------
 Symbol ds1820pin = PORTB.3 'Puerto en que se conecta el DS1820
 Symbol ds1820rw = PORTB.3 '1=Leer DS1820 / 0=Escribir DS1820
 Symbol clock = PORTB.6
 Symbol data = PORTB.7
 '
 '-- CUERPO DEL PROGRAMA----------------------------------------------------------
 '
 loop:
 'Leo la temperatura del sensor ------------------------
 Gosub init1820 'Inicializo el sensor y...
 comando = 0xcc '..Salteo la ROM.
 Gosub write1820

 comando = 0x44 'Comienzo la conversión A/D de la temperatura
 Gosub write1820
 WaitUs 2000 ' Espero a que termine la conversión

 Gosub init1820 'Inicializo el sensor y...
 comando = 0xcc '..Salteo la ROM.
 Gosub write1820
 comando = 0xbe 'Pido que me envíe lo que calculo el sensor...
 Gosub write1820
 WaitMs 750 ' Espero ...
 Gosub read1820 'Me lo devuelve en tempe1 y tempe2

 'tempe1 = 15
 'Calculo el valor de cada digito
 decena = tempe1 / 10
 unidad = tempe1 - decena * 10

 If decena = 0 Then aux = %01101111
 If decena = 1 Then aux = %00101000
 If decena = 2 Then aux = %01011101
 If decena = 3 Then aux = %01111100
 If decena = 4 Then aux = %00111010
 If decena = 5 Then aux = %01110110
 If decena = 6 Then aux = %01110111
 If decena = 7 Then aux = %00101100
 If decena = 8 Then aux = %01111111
 If decena = 9 Then aux = %01111110
 Gosub escribo
 If unidad = 0 Then aux = %01101111
 If unidad = 1 Then aux = %00101000
 If unidad = 2 Then aux = %01011101
 If unidad = 3 Then aux = %01111100
 If unidad = 4 Then aux = %00111010
 If unidad = 5 Then aux = %01110110
 If unidad = 6 Then aux = %01110111
 If unidad = 7 Then aux = %00101100
 If unidad = 8 Then aux = %01111111
 If unidad = 9 Then aux = %01111110
 Gosub escribo
 WaitMs 10000
 Goto loop
 End
 ‘Rutinas --------------------------------
 escribo:
 For col = 1 To 8
 If aux.0 = 0 Then
 data = 0
 WaitUs 2
 clock = 0
 WaitUs 2
 clock = 1
 WaitUs 2
 Else
 data = 1
 WaitUs 2
 clock = 0
 WaitUs 2
 clock = 1
 WaitUs 2
 Endif
 aux = ShiftRight(aux, 1)
 Next col
 Return

 '-------------------------------------------------
 'Inicializa el DS1820
 '-------------------------------------------------
 init1820:
 ds1820rw = 0 ' Pongo el pin como salida
 ds1820pin = 0 'Pongo en cero el pin del DS1820
 WaitUs 500 ' Espero más de 480 us
 ds1820rw = 1 ' Pongo el pin como entrada
 WaitUs 100 ' Espero más de 60 us a que "reaccione"
 WaitUs 500 ' Espero a que finalice de enviarme el estado
 Return

 '-------------------------------------------------
 'Envia comandos al DS1820
 '-------------------------------------------------
 write1820:
 For aux = 1 To 8 'Recorro los 8 bits de "Comando"
 If comando.0 = 0 Then
 Gosub write0
 Else
 Gosub write1
 Endif
 comando = ShiftRight(comando, 1)
 Next aux
 Return

 '-------------------------------------------------
 'Envia un cero al DS1820
 '-------------------------------------------------
 write0:
 ds1820rw = 0 ' Pongo el pin como salida
 ds1820pin = 0
 WaitUs 60 'hay que mantener bajo el pin mas 60 us
 ds1820rw = 1
 Return

 '-------------------------------------------------
 'Envia un uno al DS1820
 '-------------------------------------------------
 write1:
 ds1820rw = 0 ' Pongo el pin como salida
 ds1820pin = 0
 WaitUs 1 'hay que mantener bajo el pin menos de 15 60 us
 ds1820rw = 1
 WaitUs 60 'espero el resto del tiempo...
 Return

 '-------------------------------------------------
 'Lee temperatura del DS1820
 '-------------------------------------------------
 read1820:
 For aux = 1 To 16 ' los 16 bits de temp (word)
 tempe = ShiftRight(tempe, 1)
 Gosub readbit
 Next aux
 'Calculo la temperatura (tempe1) y las decimas (tempe2)
 tempe1 = ShiftRight(tempe.LB, 1)
 tempe1 = 128 - tempe1 - 3

 If tempe.0 = 1 Then
 tempe2 = 0
 Else
 tempe2 = 5
 Endif
 Return

 '-------------------------------------------------
 'Lee un bit del DS1820
 '-------------------------------------------------
 readbit:
 tempe.15 = 1
 ds1820rw = 0 ' Pongo el pin como salida
 ds1820pin = 0
 WaitUs 1
 ds1820rw = 1
 If ds1820pin = 1 Then
 tempe.15 = 0
 Endif
 WaitUs 60
 Return

Antes de compilar el programa debemos asegurarnos de que el microcontrolador seleccionado en el PIC SIMULATOR IDE sea el correcto. El PIC16F628A o PIC16F627A pueden emplearse sin problemas, y seguramente con pequeñas modificaciones en el esquema eléctrico se podría adaptar para emplear microcontroladores diferentes.

Distribución de los componentes

Partes del Termómetro
PCB 1: Distribución de los componentes.
Partes del Termómetro
PCB 2: Distribución de los componentes en el display.
Partes del Termómetro
Modelo terminado, con el DS1820 unido mediante un cable extenso.
Partes del Termómetro
Partes del Termómetro