Arduino: Medida de la temperatura a través de una NTC


En muchas aplicaciónes de electrónica nos es necesario monitonizar la temperatura tanto del ambiente, como del propio dispositivo (por fines de seguridad). Hay diferentes métodos o sistemas de medida disponibles, como termopares o infrarojos, todos ellos basados en que una variación de una magnitud física en el sensor, provoca una variación de una magnitud eléctrica.

Primeros pasos

En el caso que nos ocupa, usaremos como sensor de temperatura un termistor (en ingles) con pendiente negativa, conocido comunmente como NTC. Esta resistencia varía su valor dependiendo de la temperatura a la que se encuentra. Se tratará pues de buscar una relación entre la resistencia actual de la NTC y la temperatura del medio que la rodea.

Curva caracteristica NTC

Curva caracteristica NTC

En caso de disponer de los datos del fabricante, nos será muy sencilla la transformación del valor medido a una temperatura, pero explicaremos aquí los pasos a seguir para obtener los datos necesarios de una forma experimental y sencilla, válida para la mayoria de los casos, sin conocer los parámetros de la NTC.

Para ello necesitaremos los valores de resistencia de la NTC para dos temperaturas. Una opción sería obtener el valor de la resistencia y anotar el valor de le temperatura entregada por otro termómetro de referencia, pero partiendo de que nosotros queremos construir nuestro propio termómetro, es de suponer que no tenemos uno disponible  :). Por lo tanto necesitaremos dos temperaturas conocidas y de facil reproducción para anotar el valor de la NTC.

Recordando la química del primer año de carrera y la parte de “Estados de la materia”, echamos mano de los experimentos para obtener 0ºC y 100ºC como referencia. ¿Cómo? pues en dos sencillos pasos y sabiendo que cuando una substancia está cambiando de estado, no se produce variación de la temperatura, sino que la energía aportada (o extraida) del sistema, se utiliza tan sólo para cambiar de estado y no para incrementar (o decrementar) su temperatura.

Obtención de temperaturas de referencia

Para 0ºC, tomaremos un recipiente mediado de agua, al que añadiremos hielo, hasta tener una mezcla de líquido con hielo flotando más o menos del 50%. Esperaremos un poco, para que la temperatura se estabilize.

Para los 100ºC, calentaremos el agua del recipiente, hasta que rompa a hervir, en ese momento en el que el vapor de agua y las burbujillas empiezan a aparecer, tendremos exactamente 100ºC.

Una vez obtenidas estas temperaturas, para cada una de ellas, introduciremos la NTC hasta poner la mayor parte de su superficie en contacto con el agua, pero cuidado con pasarse, no vaya ser que tengamos una lectura falsa, por meter también los cables dentro del agua. Es recomendable intentar realizar la medida en el centro del recipiente, no cerca de los bordes, para evitar el la variación de temperatura causada por los bordes del recipiente sobre el agua. Esperaremos un tiempo, alrededor de un par de minutos en cada caso para obtener un valor estable de la resistencia.

Diagrama de conexión

Una vez tengamos estos valores, ya podemos comenzar con el montaje de los elementos sobre la breadboard. La conexión es muy sencilla y en menos de un minuto estará lista. Colocaremos la NTC formando parte de un divisor de tensión, para que a partir del valor leido, podamos calcular la resistencia.

Esquema de conexiones

Esquema de conexiones

La construcción fisica es muy simple también

Esquematico del montaje

Esquema del montaje

Conceptos teóricos

Ahora lo único que nos falta es un poco de teoría para obtener el valor de la temperatura. Atendiendo a las ecuaciones que describen el comportamiento de las NTC

Ecuación de las NTC

Ecuación de las NTC

Parametro B

Parametro B

y con la ecuación que describe un divisor de tensión

Salida de un divisor de tensión

Salida de un divisor de tensión

Podemos obtener el valor de la temperatura, mediante la ecuación de Steinhart-Hart

Ecuación de la temperatura

Ecuación de la temperatura

Parámetro Rinf

Parámetro Rinf

Código Arduino

Por último, y no por ello menos importante, nos faltaría por desarrollar un pequeño programa para nuestro Arduino para implementar todas estas ecuaciones.

Este programa en una primera instancia, calculará los coeficientes necesarios para los valores que hayamos incluido en la cabecera, como las temperaturas y resistencias medidas para la calibración así como el valor de la resistencia auxiliar utilizada en el divisor de tensión entre otros.

La salida sera el valor de la temperatura en grados centígrados o celsius [ºC] y en grados Kelvin [K] a través del puerto serie.

#include <stdio.h>
#include <math.h>

int analogPin=0;   // Which pin will be the input of the Voltage-Divider

float Vin=5.0;     // [V]        Supply voltage in the Voltage-Divider
float Raux=10000;  // [ohm]      Secondary resistor in the Voltage-Divider
float R0=10000;    // [ohm]      NTC nominal value at 25ºC
float T0=293.15;   // [K] (25ºC)

float Vout=0.0;    // [V]        Voltage given by the Voltage-Divider
float Rout=0.0;    // [ohm]      Current NTC resistance

float T1=273;      // [K]        Temperature at first testing point
float T2=373;      // [K]        Temperature at second testing point
float RT1=19750;   // [ohms]     Resistance at 273K (0ºC)
float RT2=2150;    // [ohms]     Resistance at 373K (100ºC)

float beta=0.0;    // [K]        Beta parameter
float Rinf=0.0;    // [ohm]      Rinf parameter
float TempK=0.0;   // [K]        Temperature output in Kelvin
float TempC=0.0;   // [ºC]       Temperature output in Celsius

void setup() {
  //Serial port configuration
  Serial.begin(9600);

  //Input pin configuration
  pinMode(analogPin, INPUT);

  //Global parameters calculation
  beta=(log(RT1/RT2))/((1/T1)-(1/T2));
  Rinf=R0*exp(-beta/T0);
}

void loop()
{

  //Current NTC resistance value calculation (through Vout)
  Vout=Vin*((float)(analogRead(analogPin))/1024.0);
  Rout=(Raux*Vout/(Vin-Vout));

  //Temperature calculation
  TempK=(beta/log(Rout/Rinf));
  TempC=TempK-273.15;

  //Data population
  Serial.print(TempC);
  Serial.print(" ºC (");
  Serial.print(TempK);
  Serial.println(" K)");

  delay(1000);
}

Espero que esta pequeña entrada le haya servido a más de uno para algún proyecto o iniciativa. Cualquier cosa erronea o que veais que se puede mejorar, no dudeis en dejar un comentario.

Saludos!

Steinhart–Hart equation

About these ads