1 mayo, 2013

Obtener la temperatura con Arduino y un termistor

En este proyecto vamos ha ver como podemos obtener la temperatura mediante la utilización de un termistor. Lo primero, que es un termistor, esta es una simple resistencia que varia según la temperatura que tenga, con el valor devuelto por la resistencia y una pequeña formula podemos calcular que temperatura hace.

Esquema del circuito:

El esquema de este circuito es muy sencillo, esta basado en un simple divisor de tensión, en este caso quedaría de la siguiente manera.

[singlepic id=3 w=320 h=240 float=center]

Este esquema es el utilizado en la mayoría de sensores, simplemente cambiando el termistor, por un lcr, por ejemplo, tendríamos un sensor para detectar la luminosidad.

En mi caso el termistor no es de 10 k, como se muestra en el esquema, sino que es de 100k (NJ28 NTC Thermistor,2.8mm,100K,1%), esto no varia mucho lo fundamental del sistema, ya que en el código para el arduino , le diremos tanto el valor de resistencia del termistor, como el valor de la resistencia secundaria.

Esquema de la conexión en al arduino:

[singlepic id=10 w=320 h=240 float=center]

Para calcular la temperatura necesitamos saber el valor beta de nuestro termistor, normalmente, este valor lo suele facilitar el fabricante de la resistencia, pero si el fabricante no nos lo da o no sabemos el fabricante, lo podremos calcular sabiendo la temperatura a la que esta el termistor, apuntamos el valor de resistencia ha esa temperatura y la temperatura en grados Kelvin, después elevamos la temperatura y volvemos a puntar la resistencia y la temperatura. Cuanto mas diferencia de temperatura mas fiable sera el calculo.

Por ejemplo, ponemos el termistor sobre un hielo, con otro termómetro miramos la temperatura, por ejemplo T1 = 3º + 273,15 y resistencia R1 = 34500 Ohm. Luego lo metemos el agua caliente y hacemos la misma comprobación T2 = 80º + 273,15 y R2 = 134 Ohm. Con esos datos aplicamos la siguiente formula:

beta=(log(RT2/RT1))/((1/T2)-(1/T1))

Quedando de la siguiente manera:

beta = (log(143 / 345000)) / ((1/353,15)-(1 / 276,15))

beta = 4283,9970482988 = 4284

Código para el Arduino.

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

int analogPin=0;     // Pin donde esta conectado el divisor de tension en el Arduino

float Vin=5.0;       // [V]       Voltage de entrada en el divisor de tension
float Raux=10000;    // [ohm]     Valor de la resistencia secundaria del divisor de tension
float R0=100000;     // [ohm]     Valor de resistencia nominal del termistor (NTC) a 25ºC
float T0=298.15;     // [K] (25ºC)

float Vout=0.0;      // [V]        Voltage given by the Voltage-Divider
float Rout=0.0;      // [ohm]      Resistencia actual del Termistor (NTC)

// Valores para calcular el valor Beta, si no lo sabemos
// float T1=273;     // [K]        Temperatura del 1º punto del test (en grados Kelvin)
// float T2=373;     // [K]        Temperatura del 2º punto del test (en grados Kelvin)
// float RT1=19750;  // [ohms]     Resistencia a 273K grados Kelvin (0ºC)
// float RT2=2150;   // [ohms]     Resistencia a 373K grados Kelvin (100ºC)

float beta=0.0;      // [K]        Parametro Beta
float Rinf=0.0;      // [ohm]      Parametros Rinf
float TempK=0.0;     // [K]        Temperatura de salida en grados Kelvin
float TempC=0.0;     // [ºC]       Temperatura de salida en grados Celsius

int iCont;            // Contador de ciclos, par el calculo de la temperatura media
float cTemp1;         // Variable temporal para acumular las temperaturas leidas 

void setup() {
  // Configuramos el puerto Serie
  Serial.begin(9600);

  // Configuramos el pin del Arduino en entrada
  pinMode(analogPin, INPUT);

  // Parametros generales para el calculo
  // Formula para calcular el valor beta si no disponemos de el
  // beta=(log(RT1/RT2))/((1/T1)-(1/T2));
  // Valor beta, los fabricantes suelen disponer ya de este valor, 
  // mirar en la tabla de carateristicas del termistor
  beta = 4380;
  Rinf=R0*exp(-beta/T0);
}

void loop()
{
  cTemp1=0;  
  for (iCont = 1; iCont <= 500; iCont ++)
  {
    // Cálculo del valor de la resistencia termistor (NTC) actual (a través de Vout)
    Vout=Vin*((float)(analogRead(analogPin))/1024.0); 
    Rout=(Raux*Vout/(Vin-Vout));

    // Calculo de la temperatura en grados Kelvin
    TempK=(beta/log(Rout/Rinf));
    // Calculo de la temperatura en grados Celsius
    TempC=TempK-273.15; 
    // Almacenamos la temperatura (grados Celsuis) actual para despues obtener la media
    cTemp1 = cTemp1 + TempC; 
    // Hacemos una pausa de 10 milisegundos    
    delay(10);
  }

  // Calculamos la temperatura media
  TempC = cTemp1/iCont;

  // Mostramos la temperatura media en grados Celsius
  Serial.println(TempC);

  // Hacemos una pausda de 1 seg.
  delay(1000);
}

Y con esto ya tendríamos un termómetro digital con nuestro Arduino.