15. SENSOR DE TEMPERATURA TMP36

QUE ES UN SENSOR DE TEMPERATURA
.
Un sensor de temperatura es simplemente un chip que nos devuelve un valor de tensión proporcional a la temperatura a la que está sometido. En esta sesión vamos a utilizar unos modelos comerciales muy extendidos y fáciles de encontrar por muy poco dinero: TMP36 o LM35DZ.
Vamos a ver como los usamos. Lo primero, tenéis que buscar la hoja de especificaciones del fabricante. (Busca TMP36 o  LM35DZ data sheet)Aunque al principio no es fácil acostumbrarse a leer este tipo de documentación (y que encima vienen en inglés), en último término es a donde hay que ir cuando queráis saber exactamente las características de su funcionamiento.
Pero el resumen podría ser  más o menos así:
Img_15_2
·         Mide la temperatura en grados centígrados.
·         Funciona entre -50º C y 125ºC para el TMP36.
·         Funciona entre 0º C y 100ºC para el LM35DZ .
·         No es especialmente preciso, ya que tiene ± 1ºC de incertidumbre, pero normalmente nos sobra para proyectos sencillos y es muy barato.
·         EL encapsulado es similar al de un transistor y también tiene tres patas, así que mucho cuidado con confundirlos. Intentad leer las letras que lleva serigrafiadas (si podéis, porque suelen ser tan pequeñas que a veces no se leen ni con lupa). 
El pin central es el de señal, pero para saber cuál es GND y 5V, el encapsulado tiene una cara plana y otra curva. Poniendo la cara plana mirando hacia vosotros con las patas hacia abajo(de modo que podais leer el  modelo),  el pin de la izquierda es alimentación 5V y naturalmente el otro es GND.

·         SI conectáis la tensión al revés, Tendréis tiempo de reaccionar y cambiarla, pero mucho cuidado porque se calentará más que suficiente para haceros una quemadura dolorosa.
·         Si veis que está caliente no tratéis de sacarlo con los dedos, simplemente desconectad el Arduino y dadle un rato para que se enfríe.
ESQUEMA ELECTRÓNICO DEL CIRCUITO.
Vamos a montar un pequeño circuito que lea la temperatura de un sensor, imprima el valor en la consola y encienda un diodo cuando esta sobrepase un cierto umbral. Aquí tenemos el esquema electrónico:
Sesion_15_esquema
 Y el circuito para protoboard sería muy sencillo también:
TMP36
CALCULANDO LA TEMPERATURA.
.
El fabricante del TMP36 y del LM35DZ nos dice que la salida de tensión será de 10 mV (mili voltios) por cada grado de temperatura y además sabemos que nuestro Arduino mide en las puertas analógicas una máximo de 1.024 para 5V (y 0 para 0V), por tanto, para una lectura dada, el valor en voltios de la medida será:
Img_15_5
Y como cada voltio equivale a 100ºC ( 1V / 10mv = 100), la temperatura en grados Celsius es resultado de multiplicar esto por 100.
Pero para que la cosa no sea tan fácil el fabricante del TMP36 nos dice que el 0V no es 0º sino -50º (y así poder leer valores bajo cero), así que al total hay que restarle 50. En cambio com el LM35DZ empieza en 0º, no hay que restarle nada, es más cómodo de manejar.
Resumiendo. Para calcular la temperatura en ºC a partir de la lectura de Arduino:
Img_15_6
Recordad que el LM35DZ  no empieza en -50º si no en 0º por lo que no es necesario restarle los los 50º de ajuste.  Podéis encontrar cantidad de sensores similares a estos con diferentes rangos de medida, tanto por arriba como por abajo, pero podéis usar este mismo método para calibrar la medida.
Así pues, ya tenemos claro como calcular la temperatura, pero como vemos por ahí que tenemos divisiones, nos conviene utilizar nuestra primera variable de tipo float, o sea que va a tener decimales.

Ya sé que la tendencia natural es usar int para todo, pero normalmente en cuanto haya una división de por medio os conviene usar un float hasta que tengáis muy claro porque usáis otro tipo.

Cada vez que tomemos una muestra de nuestra entrada analógica vamos a calcular la temperatura y si sobrepasa el umbral definido, damos orden de activar la alarma, en caso contrario la apagamos.
Como la temperatura es algo que varía lentamente usaremos un delay para que solo nos dé una medida por segundo.
EL PROGRAMA DE CONTROL.

En primer lugar vamos a definir un par de variables:
     int Sensor = 0 ;
     int umbral = 25 ;
Sensor es el pin analógico (A0) al que conectamos el sensor de temperatura y umbral el valor a partir del cual disparamos la alarma de temperatura.

·         El valor de umbral habrá que ajustarlo en función de la temperatura ambiente donde estéis montando el circuito.
·         En principio 25ºC son buenos para que si queréis subir la temperatura, lo podáis hacer simplemente soplando o manteniendo entre los dedos el sensor. Otro sistema de subir la temperatura rápido, es poner el sensor al lado de la salida de refrigeración de un portátil.

Y pasando los cálculos de la página anterior a C++ nos quedaría algo parecido a:
void loop ()
        {
            int lectura = analogRead(Sensor);
            float voltaje = 5.0 /1024 * lectura ; // Atencion aqui
            // Si usais un LM35DZ vuestra formula sera
            //float temp = voltaje * 100 ;
            float temp = voltaje * 100 -50 ;
            Serial.println(temp) ; delay(1000); }
Importante: En la línea donde calculamos el voltaje hemos escrito 5.0 y no 5.  Esto es para evitar que C++ (que es un poco vago) intente hacer una división entre enteros y nos desprecie los decimales.

·         Haced la prueba de escribir en vuestro programa el 5 a secas y veréis que el resultado de temperatura será siempre -50 ¿Porque?
·         Pues sencillamente porque la parte entera de 5/1024 es 0 y punto. Así que por mucho que después multipliquemos por lectura seguirá siendo 0. Y nuestro programa dice que para 0V la temperatura es -50ºC.
·         Hasta que comprendáis como entiende C++ las operaciones andad con piés de plomo y comprobadlas sino queréis sorpresas. Una parte de esta sesión es provocar este tipo de situaciones con las variables float.

Ya solo nos resta comprobar si la temperatura alcanza el umbral y encender el LED o apagarlo. Descargar Prog_15_1
int Sensor = 0 ; // Prog_15_1
     int umbral = 25 ;
    
     void setup()
        {
            Serial.begin(9600);
            pinMode(11,OUTPUT);
        }
     void loop()
       {
            int lectura = analogRead(Sensor);
            float voltaje = 5.0 /1024 * lectura ; // Atencion aqui
            // float temp = voltaje * 100 ; para el LM35DZ 
            float temp = voltaje * 100 -50 ; Serial.println(temp) ;
            if (temp >= umbral)
                digitalWrite(11, HIGH) ;
            else digitalWrite(11,LOW);
                delay(1000); }
Si disponéis de un pequeño ventilador de 5V, de los que suelen tener en las tiendas de informática (o si desmontáis un equipo viejo), sería fácil cambiar el LED por ese ventilador  y orientarlo hacia el sensor.
Fijando un umbral superior y otro inferior podemos escribir un programa que arranque o pare el ventilador cuando la temperatura se sale de los márgenes fijados. Habríais conseguido, de un modo muy sencillo, una regulación de temperatura con un sensor y un ventilador.

CONVIRTIENDO  LA TEMPERATURA A ºF.
.
En Europa estamos bastante acostumbrados a los grados Celsius desde pequeños, pero en América las medidas de temperatura en grados Fahrenheit son habituales. Así que vamos a modificar nuestro programa para que mida en ºF.
La forma de convertir una temperatura medida en Celsius a Fahrenheit es:
Img_15_7
Os propongo que convirtáis el programa anterior para que dé medidas de temperatura en grados Fahrenheit en lugar de Celsius (o mejor aún, que dé ambas en la misma línea).


Comentarios