bclose

Sensor de temperatura TMP36

Arduino y los Sensores de temperatura

Objetivos

.

    • Calcular la temperatura con un tipo float.
    • Construir una alarma de temperatura.
    • Convertir la temperatura de Celsius a Fahrenheit.

 

Material requerido.

 

  Tienda España Tienda Mexico
Kit Arduino Uno  Kit inicio UNO Kit inicio UNO
Kit Arduino MEGA Kit Inicio Mega Kit Inicio Mega

 

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í:

    • 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 uno 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_6Recordad 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.

  

Contenido solo disponible para suscriptores. ¡Accede al contenido!

    

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).

 

Resumen de la sesión

En este curso arduino hemos aprendido lo siguiente:

 

 
  • Hemos visto lo que son y cómo funciona un sensor de temperatura básico como el TMP35. Hay muchos por ahí, pero suelen ser parecidos a este.
  • Hemos aprovechado para meter el tipo float y ver como forzar las operaciones con ellos y lo que es más importante prevenir posibles malas pasadas con ellos.
  • Hemos desarrollado un circuito de medida de temperatura con alarma.

 

 

 

 

 

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login

(56) Comments

  • Avatar for Charly
    • Alvaro

    Hola! Quería saber si hay algún tutorial (porque no lo encuentro),y de haberlo cúal es, que explique cómo puedo guardar los datos del sensor de temperatura en un dispositivo de almacenamiento(o en el arduino mismo) para luego, desde el ordenador mirar dichos datos, ya que mi idea no es conectar el arduino al PC seguido sino a una fuente de alimentación y emplear el PC solo para ver los resultados que ha leído el sensor.
    Muchas gracias.

  • Avatar for Charly
    • Admin

    Hola Jesus,

    Podria ser porque el consumo combinado de ambos hace que la alimentacion fluctue y baje de los 5V lo que afecta a la precision de la medida

    Asegurate de usar una fuente de alimentacion externa de la menos 1 Amperio y nos dices

  • Avatar for Charly

    Buenas tardes y lo primero agradecer vuestro esfuerzo, mi duda es la siguiente: he creado un programa en el que un ventilador arranca pasando de 25º y para bajando de 22º, hasta aqui todo correcto, pero en cuanto arranca el ventilador las temperaturas oscilan y deja de medir correctamente, no entiendo el porque, desconecto el ventilador del transistor y monto un led y mide bien.

  • Avatar for Charly
    • Lovado

    mi circuito me va perfectamente gracias, un saludo

  • Avatar for Charly
    • Admin

    Normalmente es algun problema de conexion o bien de programacion. Revisa un poco el programa o muestranoslo aqui para echarle una ojeada ¿Vale?

  • Avatar for Charly
    • Ivan

    Hola Julio, pues si te da 0 siempre cuando lees la entrada analógica «en crudo» o hay algún error en la conexión o tu sensor no funciona correctamente. Un saludo.

  • Avatar for Charly
    • Julio

    Hola,

    Mi sensor me da valores negativos. Me explico, he hecho las conexiones y probado varios códigos y cuando hago analogRead(A0) el valor retornado es cero (0)….

    ¿alguna sugerencia?

  • Avatar for Charly
    • Admin

    Hola ROberto,

    Me suena raro porque el circuito del led y del sensor estan separados y la unica manera que uno influya en el otro es algun tipo de conexion electrica o un problema e tu arduino¿Puedes probar con orto arduino a ver?

  • Avatar for Charly

    Hola,
    Antes de nada, felicitaros por estos tutoriales, que me están siendo realmente útiles.
    Tengo montado el circuito que indicáis en el ejemplo con un sensor LM35 y su correspondiente squetch. Lo que sucede es que cuando el sensor supera la tempera tura umbral y el pin de control del led se pone en HIGH, los valores de tensión del LED se me disparan, pasando de 25º a 35-40, he comprobado el mismo circuito, desconectando el cable que alimenta el led y en este caso la medida de temperatura es correcta. Alguien sabe porqué puede pasar esto?
    Gracias.

  • Avatar for Charly
    • Admin

    Hola Axel, Serial.Begin(9600) indica que vamos a usar el puerto comm y le pedimos que se ponga en 9600 de velocidad para que podamos poner de acuerdo el otro extremos de la comunicacion

    Es una velocidad bastante baja y s epuede subir con seguridad, pero por alguna razon historica muchos ejemplos la ponen de salida

  • Avatar for Charly
    • Axel

    amigo porque donde dice Serial.begin es de 9600?
    si alguien mas sabe favor de decirme

  • Avatar for Charly
    • Ivan

    hola Juan Carlos, el programa está bien seguro, así que el problema tiene que estar en el montaje. Comprueba bien las conexiones a ver si se soluciona. Un saludo.

  • Avatar for Charly
    • Juan Carlos

    Ya estaaa!
    Era el cable de la entrada analogica…..
    Despues de haber cambiado de entrada varias veces decidi cambiar el cable, et voilá!!
    He comprobado el cable y era el p… cable el que estaba mal 🙁

  • Avatar for Charly
    • Juan Carlos

    Hola:
    Hasta ahora he conseguido montar todos los circuitos y que funcionen correctamente, pero con este me estoy volviendo loco.
    Creo que lo tengo bien montado (tampoco es muy complicado), por lo que supongo que el problema lo tendre en el codigo, pero tampoco lo tengo muy claro ya que los valores que me devuelve por pantalla oscilan entre 130 y 180 sin tocar el sensor y eso es lo que me trae de cabeza.
    El codigo que estoy utilizando es el siguiente:

    int control = 11;
    int sensor = 5;
    void setup() {
    Serial.begin(9600);
    pinMode(control, OUTPUT);

    }

    void loop() {
    int lectura = analogRead(sensor);
    float temp = 5.0 / 1024 * lectura *100;
    Serial.println(temp);
    if (temp > 25)
    digitalWrite(control, HIGH);
    else
    digitalWrite(control, LOW);
    delay(1000);
    }

    Allguna idea de que es lo que hago mal?
    Muchas gracias. Un saludo

  • Avatar for Charly
    • Admin

    Hola Macarena, Yo he enchufado este sensor al eves varias veces y hasta la fecha no se ha quemado ninguno, pero no puedo decir lo mismo de mis dedos

  • Avatar for Charly
    • Macarena

    Hola tengo una consulta

    tu escribiste esto al comienzo de la lección:
    «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.»

    El sensor sigue bueno o cuando se sobrecalienta se quema derechamente»???

    Gracias por las explicaciones

  • Avatar for Charly
    • Jesús Sánchez

    Hola Joan.

    Podrías añadir otro LM35DZ y un DHT11 (o DHT22), o incluso un DS18B20, y que te muestre la temperatura de todos ellos. Así descartas que esté estropeado.
    Ya otra opción es medir en un momento dado la temperatura con un termómetro externo.

    Saludos.

  • Avatar for Charly
    • Admin

    No podras nunca estar seguro al 100% de eso Joan, Sera tu olfato el que te dicte si el sistema se comporta razonablemnete o por el contrario no te lo crees

    Para asegurate de que un programa funciona correctamente junto con el hardware, necesitas diseñar algunas pruebas cuyo resultado conozcas de forma cierta y comprobar que tu sistema responde a ello correctamente

  • Avatar for Charly
    • Joan Llorente

    Hola.
    Tenía un problema:
    ¿Como puedo saber si es que se enciende porquefunciona bien el circuito y la programación, es decir, que hay suficiente temperatura; o bien que o bien el programa, el sensor o el circuito están mal y se enciende por error?

  • Avatar for Charly
    • CGAK

    Hola como vas,
    Acabo de iniciar a trabajar con Arduino y mi experiencia es poca pero tengo un proyecto que desarrollar
    en mi caso estoy usando el sensor encapsulado de temperatura DS18B12 usando:
    #include //Se importan las librerías
    #include

    #define Pin 4 //Se declara el pin donde se conectará la DATA

    OneWire ourWire(Pin); //Se establece el pin declarado como bus para la comunicación OneWire
    DallasTemperature sensors(&ourWire); //Se instancia la librería DallasTemperature

    void setup() {
    delay(1000);
    Serial.begin(9600);
    sensors.begin(); //Se inician los sensores
    }

    void loop() {
    sensors.requestTemperatures(); //Prepara el sensor para la lectura

    Serial.print(sensors.getTempCByIndex(0)); //Se lee e imprime la temperatura en grados Celsius
    Serial.println(«Grados Centigrados»);

    delay(1000); //Se provoca un lapso de 1 segundo antes de la próxima lectura

    }

    Ahora quiero tomar el dato que me registra el sensor y hacer una alarma que me indique por SMS MODULO GSM si la temperatura esta por fuera de mi rango 10 -18 °C

    Quizas alguien podría ayudarme un poco, dándome alguna introducción.
    Gracias

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login