Loading...

4/7/2012

Como utilizar un termistor o sensor de temperatura con Arduino: Código para los NTC/PTC

Comprobando el funcionamiento del programa
Una de las aplicaciones más comunes de una placa electrónica Arduino es el control de temperatura mediante un sencillo Termistor (sensor de temperatura), por ejemplo si queremos activar un ventilador cuando la temperatura sube de cierto valor en un ordenador/motor, o activar mediante un relé un motor circulador en una caldera cuando detectemos que la temperatura está subiendo (y por ende el fuego está encendido), como hacíamos en la caldera casera con los termostatos AKO o Keld, sólo que con Arduino no sólo nos permitirá activar algún dispositivo, sino que nos permitirá mucho más juego, pudiendo controlar y manejar otros parámetros de nuestra caldera, como la temperatura de los humos, o del aire inyectado en la cámara de combustión, etc, como ya nos explicó Oscar González en BricoGeek sobre un proyecto de Xoel de Asturias.
Un termistor (thermistor) no es más que una resistencia cuyo valor varía según varía su temperatura (aunque no de forma lineal); los hay de muchos tipos, pero en esta entrada hablaré de uno NTC (Negativo, cuyo valor de resistencia decrece según crece la temperatura), y que miden diferentes rangos de temperatura, de -50 a +99ºC en este caso. Si queremos medir más temperatura, nos haría falta un termopar tipo K o tipo J, pero eso ya lo veremos más adelante. 
Pero para utilizar un termistor cualquiera que podamos conseguir, no basta con medir el valor de su resistencia y aplicar una regla de tres, porque como hemos dicho, no es un valor lineal (sino curvo), siendo mayores las diferencias de resistencia según aumenta la temperatura, de forma hiperbólica.

Para utilizar un termistor, o sabemos sus valores (datasheet), o tenemos que aproximarlos; según la fórmula SteinHart-Hart, tenemos que hallar un valor, llamado β (Beta) (el llamado valor de temperatura característica del material), y utilizarlo junto con su fórmula para obtener los ºC para un valor dado. Aquí está muy bien explicado, y aquí explicada la fórmula SteinHart-Hart.

Aunque parece difícil de entender para los que se les den mal las matemáticas (como a mí), pero no os preocupéis, que al final tenéis un programa que podéis usar y con sólo cambiar los datos del encabezado (valores de dos puntos, de la resistencia a 25ºC de vuestro termistor y del valor real de 5Vcc de vuestro Arduino y poco más) podréis usarlo en vuestro proyecto sin tener que comprender las fórmulas implicadas, pero prefiero entrar en detalle para los que les gusten tanto como a mí "el por qué de las cosas".

Pero, ¿Cómo calculamos el valor β?
Para obtener el valor de β, utilizando la fórmula SteinHart-Hart, hay que dar los valores de resistencia y temperatura en dos puntos diferentes, lo más alejados posible entre uno y otro, para conseguir mayor exactitud. La fórmula nos dice que β es igual a:

Obteniendo los valores de resistencia a 25 y 100ºC (por ejemplo), obtendremos  β   

Podemos utilizar hielo para la temperatura de 0º y agua hirviendo al fuego para la de 100ºC, tomar el valor de la resistencia del termistor en esos dos puntos (esperando unos minutos hasta que el valor de la resistencia sea más o menos estable, será cuando el termistor ha alcanzado la temperatura).
Nota: Ten en cuenta que a mayor altitud, el agua hierve a menor temperatura, pudiendo haber 5 o 10 ºC de diferencia, lo mejor es utilizar a su vez un termómetro calibrado para comparar.
En mi caso quería reutilizar un par de sensores AKO 14901, y obteniendo los valores de resistencia con un tester me ha dado que a 25ºC tenía 10330 ohms aprox. (o lo que es lo mismo, 10K ohmnios):



Utilicé un termómetro ambiente que tenía para acercarme más a lo real (y el mismo error que el mismo, ya que no está calibrado, pero algo es algo).



Y en lo más cercano a 100ºC, a 96ºC aprox. un valor de resistencia de 970 ohms:




Por lo que si obtenemos β, nos sale (usando google como calculadora):




O sea, en mi caso, ln(970 / 10 330) / ((1 / 370.15) - (1 / 298.15)) = 3 625.81

El cálculo de la constante β lo haremos al principio del programa que pasaremos a Arduino, en base a las constantes T1, R1, T2 y R2 (de los dos puntos que podamos obtener), y así evitamos hacer demasiados cálculos (debemos reservar capacidad de proceso para otros menesteres más importantes).

Para mostrar los valores, he utilizado la pantalla LCD económica y polivalente Nokia 5110 de 84x48 píxels; para aprender a utilizarla y emplear su capacidad lo mejor es que recurráis al tutorial de Jose Manuel.


Basándome en el código de Rafael Torrales, he añadido código para que el programa nos calcule automáticamente los datos necesarios para nuestro termistor, por lo que sólo tenemos que darle los valores de los dos puntos:

Programa universal para termistores NTC/PTC:


/*  ==================================================================


    Sketch universal para el control de termistores.
  
  Autor: David Losada, basado en trabajos de Rafael Torrales y Antonio Moles.
  Version: 0.1
  Fecha: 2 de julio de 2012
  
  Descripcion: termometro con termistor NTC y pantalla LCD grafica Nokia 5110
               de 84x48 pixeles


    ==================================================================   */


#include <Adafruit_GFX.h> //Necesarias para usar la pantalla LCD Nokia
#include <Adafruit_PCD8544.h>


// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 7 - LCD chip select (CS)
// pin 6 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);




//Control temperatura
//Para ahorrar cálculos, lo vamos a calcular antes del programa
const float TPto1 = -6; //Temperatura en ºC punto 1
const float RPto1 = 40000; // Ohms en punto 1
const float TPto2 = 96; // Temp. punto 2
const float RPto2 = 970; // Ohms en punto 2
const float resistor = 10290; //El valor en ohmnios de la resistencia del termistor a 25ºC
const float voltage = 4.83; // El voltaje real en el punto 5Vcc de tu placa Arduino
//Para ahorrar cálculos lo definimos como constante en esta parte del programa
const float K= 273.15; //Para pasar a grados Kelvin
const float e = 2.718281828459045; //Constante matemática 
const float B = log(RPto2/RPto1)/(1/(TPto2+K)-(1/(TPto1+K))); //Valor Beta de tu termistor
const float unodivr = 1/(resistor * pow(e,(-B/298.15))); //Con pow elevamos e al resultado


float T = 0; //Declaramos la variable Temperatura
float tmedia; //Variable para calcular media
int cnt; //temperatura media y contador
int grados, decimas; //Para ponerle coma al resultado (en español)


int sensorPin = A0; // Selecciona la entrada para el termistor
int sensorValue = 0; // Aquí almacenamos el valor del sensor


void setup()   { 
  // Iniciamos comunicacion serie con pantalla
  Serial.begin(9600);
  
  // Iniciamos comunicacion con la pantalla
  display.begin();


  // Establecemos el contraste
  display.setContrast(45);


  // Mostramos la pantalla de inicio durante 2 segundos
  display.display();
  delay(2000);
  // borramos la pantalla
  display.clearDisplay(); 
}




void loop() 
{
  //float B= (RPto2/RPto1);//(1/(TPto2+K)-(1/(TPto1+K)));
// Parte 1:  Leemos el puerto analógico 0 y convertimos el valor en voltios.
   sensorValue = analogRead(sensorPin); //Leemos analógico 0    
   
   tmedia=0; //Inicializamos variable
   // medimos la temperatura 10 veces y la almacenamos en tmedia
    for ( cnt=0; cnt<10; cnt++)
    {
      sensorValue = analogRead(sensorPin);
      tmedia=tmedia+sensorValue;
      delay(25);
    }
    
    // calculamos la media de las medidas
    tmedia=tmedia/cnt; 
    //Convertimos a voltios :)
    float v2 = (voltage*float(tmedia))/1024.0f;    
  
 // Parte 2: Calcular la resistencia con el valor de los voltios mediante la ecuación del divisor de voltaje
  //voltage = 4.83
  //R2 = 10000
  //R1 = Thermistor resistance
  //V2= v2
  //so V2=(R2*V)/(R1+R2)
  //and r1=((r2*v)/v2)-r2 <--final
  
  float r1a = (voltage*float(resistor))/v2;  
  float r1 =r1a - resistor;


  //Parte 3: Calcular la temperatura basandose en la ecuación Steinhart-Hart y la ecuación del valor Beta.
  // T=B/ln(r1/rinfinit)


  float T = B/log(r1*unodivr);
  T=T-273.15; //Convertimos a ºC y ya tenemos la temperatura
    
    // ahora obtenemos la parte entera
    grados=(int)T;
    
    // y las decimas de grado son el resto
    decimas=(T-grados)*10;
    
    // Y por ultimo lo mandamos a la pantalla LCD
    display.setTextSize(1); 
    display.println("Temperatura:");  
    display.print(" ");
    display.setTextSize(2);
    display.print(grados);
    display.print(",");
    display.print(decimas);
    display.print(".C");
    //display.print("       ");
    display.display();
    display.clearDisplay();


}

Agradecería que cualquier sugerencia de mejora en el código la hiciérais en los comentarios; lo comparto también en GoogleDocs para los que quieran corregir algún error y dejar su propia versión.

Hasta aquí la parte teórica, el problema, los cálculos y el código resultante. Ahora comprobemos si funciona con una placa de trabajo donde conectaremos la pantalla y el sensor.

Manos a la obra: Conectándolo todo




Si sois novatos en el mundo Arduino, lo mejor es que leáis, investiguéis, y probéis los ejemplos y tutoriales de su página Arduino.cc y los de Ardumanía.

El Thermistor hay que colocarlo así:

 (Ground) ---- (10k-Resister) -------|------- (Thermistor) ---- (+5v)
                                     |
                                Analog Pin 0


Por un lado a 5V en el Arduino y por el otro conectado a la resistencia del mismo valor que tenga el thermistor a 25ºC (en este caso 10KOhms), y ese punto derivado a la entrada analógica que elijamos (e indiquemos en el programa). El otro lado de la resistencia va a masa (ground; GND en el Arduino).


Como indicaba Jose Manuel en su tutorial, conectamos la pantalla LCD con una resistencia 2K2 ohms (2200 ohms) en SCE (CS) y con cuatro más de 10K ohms en RST, D/C, DN y SCLK:

Arduino mostrando la temperatura ambiente en la pantalla LCD
Esta pantalla es muy versátil, aunque sus librerías ocupan bastante, nos deja espacio de sobra para hacer un programa de control bastante complejo. Detalle del conexionado de los cables:


A la derecha del tablero de conexionado se ve la resistencia de 10 K que he utilizado para el termistor (tenemos que usar una resistencia del mismo valor que el termistor a 25ºC).

Pasamos el programa con el Arduino IDE, y este es el resultado, la temperatura ambiente:


Si lo comparo con el termómetro ambiente anterior con un vaso de agua caliente:



¿Y si queremos utilizar un segundo sensor para comparar y activar un relé o lo que necesitemos? Podríamos, por ejemplo, obtener este resultado conectando un segundo termistor en el A1, y duplicando partes del código, pero eso ya lo veremos en otra entrada:



Estas pruebas y programas son la semilla de una posible caldera de código abierto, donde todos puedan proponer mejoras y versiones de la misma, en la que todo su funcionamiento sea conocido y abierto a todos.  Todo el que quiera proponer ideas y colaborar será bienvenido, a ver si conseguimos obtener un prototipo de caldera segura y popular, que sirva para diferentes combustibles (madera, pellets, etc).
Siempre y cuando no se comercialice, o si se hace, que sea sin ánimo de lucro, todos ganamos.
Como todo el contenido del blog, todo la información que sobre este tema se comparta tendría licencia Creative Commons BY-SA No Comercial.

Referencias:
http://www.ardumania.es/lcd-grafico-de-84x48/
http://www.ardumania.es/termometro-con-lcd-grafico-y-lm35d/
Tutorial de Rafael Torrales en su blog; utilizando un termistor en Arduino, 1ª Parte
Tutorial de Rafael Torrales, 2º parte
Calculadoras para obtener valores beta, alfa, etc en un termistor
http://www.daycounter.com/Calculators/Steinhart-Hart-Thermistor-Calculator.phtml
http://arduino.cc/playground/ComponentLib/Thermistor2
http://srbuenaf.webs.ull.es/tecnologia/uno.pdf

Enlaces relacionados:
Circuito de control de termopar tipo K y otros; MAX6675
Control de temperatura de horno con arduino y el Max6675
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1246091012
ttp://arduino.cc/playground/ComponentLib/Thermistor
http://disipio.wordpress.com/2009/07/17/temperature-measurement-using-arduino-and-a-thermistor/
http://www.hacktronics.com/Tutorials/arduino-thermistor-tutorial.html
http://www.cantherm.com/products/thermistors/choosing_ntc.html

Para aprender a utilizar un motor DC, relé, servos, etc con Arduino
Proyectos con Arduino
Trucar servo

Tiendas Arduino y de componentes españolas:
Ardutienda
Electan
Bricogeek

14 comentarios:

  1. Hola David. Llevou más de un año siguiendo tu blog, ya que soy un fan también del "Hazlo tú mismo" y buscando soluciones de calefacción para un futuro di, por suerte, con tu página.
    El caso es que el futuro ha llegado ya, por suerte conseguí una parcelita en la sierra de Córdoba, y me es indispensable ahorrar lo máximo en invierno para la calefacción y ACS.
    Tenemos una chimenea abierta, y en un mes como mucho quiero cerrarla con una puerta e instalar un serpentín-paila, que he visto en una tienda, con muy buena pinta, en acero.
    El objetivo es calentar las habitaciones con radiadores y el ACS, y me gustaría que me orientaras un poco bastante :).
    ¿Lo puedo hacer por convección o es indispensable la bomba?
    ¿Dónde puedo comprar la bomba, termostatos, vaso de expansión, etc?
    ¿Vaso abierto o cerrado?
    Muchas gracias por publicar contenidos tan interesantes y por contestar de antemano.
    Si quieres podemos estar en contacto por email, y cuando tenga todo instalado estás invitado a verlo, aparte que te enviaré las fotos para que las publiques.
    Bueno, gracias de nuevo, que me enrollo :).
    Saludos desde el Sur.

    ResponderEliminar
    Respuestas
    1. Hola, te contesto brevemente. La bomba es indispensable (hay formas de hacer que no lo sea pero tendrías que meter todo el depósito en el fuego, lo que no es viable).
      Los elementos los puedes comprar en la tienda de fontanería más cercana; pide precios y no te fíes de las cosas baratas de marcas desconocidas; no suelen dar muy buen resultado (duran menos).
      Puedes hacerlo con vaso abierto, pero entonces necesites una bomba que pueda trabajar sin presión (la que uso en mis tutos no es de esas). La ventaja es que no necesitas controlar la presión, y que los excesos salen directamente por el vaso abierto, pero ningún profesional lo instala así porque el agua se ensucia, se evapora (teniendo que rellenar constantemente por lo que se aporta cal al sistema constantemente)... prefiero circuito cerrado.
      Mi email lo tienes arriba a la derecha si tienes alguna cosa, me encantará ver tus progresos, y publicarlos llegado el caso.

      Por otro lado, el serpentín hazlo lo más gordo posible, y si es posible que los troncos estén también encima, funcionará muy bien. Si pones serpentín no es necesario que tengas las puertas cerradas mientras funciona, pero esto depende de la capacidad de la chimenea; lo ideal es que la combustión sea lenta y sin humos aportando todo el oxígeno que el fuego necesite y que en el hogar se mantenga una alta temperatura en la combustión para que sea lo más perfecta posible (y menos humos).

      Eliminar
  2. Gracias por contestar, David. En breve me pondré a ello, aunque estoy viendo que la dificultad tanto del serpentín del hogar como del acumulador, me supera...
    Lo más seguro que compre algo fabricado ya.
    Bueno, ya te iré contando. :)
    Gracias de nuevo!

    ResponderEliminar
    Respuestas
    1. Hola, mi nombre es Leonardo, profesionalmente me dedico al tema de la calefacción y en tiempos, he montado bastantes sistema de chimenea para agua caliente y calefacción, lo que nosotros montábamos creo recordar de la marca "Marsol", eran una chimenas prefabricadas en acero , con opción para recuperador de calor de humos, y por SEGURIDAD siempre lo montábamos con vaso de expansión abierto, y con bomba de circulación (una Roca pc 1025, o una Wilo 25/40 para una instalación de 8 o 10 radiadores te servira sin problemas), el circulador se controlaba con un termostato conectado de manera que hasta la chimenea no alcanza una temperatura determinada a elegir por el usuario(40 o 50 grados), el circulador no se ponía en marcha, ademas contaba con un conmutador la seleccionar la puesta en marcha del circuldor automaticamente con el termostato o manual.

      Eliminar
    2. Los mas importante la SEGURIDAD, la razón, por la que montábamos, la chimenea con vaso de expansión ABIERTO, es la siguiente, si tiene la chimenea encendida, cargada de leña, y se va la electricidad, el circulador, se para, pero el fuego no, la chimenea continuara calentado el agua que se encuentra en su interior hasta llegar a 100 º y empezara a hervir, el vapor hará subir la presión, y si la instalación no tiene un medio por el cual aliviar la presión, la chimenea se convierte literalmente en una BOMBA..
      El vaso de expansión abierto es el sistema mas fiable, para evitar esta situación.
      Saludos Leo...

      Eliminar
  3. Hola David. Soy nuevo en esto de la Electronica y me preguntaba porque necesariamente debe ir conectado al termistor un valor de resistencia igual al que tiene el termistor en 25°C.

    ResponderEliminar
    Respuestas
    1. Es para conseguir un multiplicador de voltage; para sacar los valores correctos de resistencia, ya que las diferencias son muy pequeñas. Lo tienes en el esquema.

      Eliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  5. hola david... y si en vez de ocupar la pantalla led deseo ocupar mi pc o laptop? tendria que habar alguna modificacion astral?

    ResponderEliminar
  6. Hi saludos, una pregunta que tipo de arduino es el que se esta ocupando, o puedo utilzar algun otro?

    ResponderEliminar
    Respuestas
    1. Hi Dark_knight; the motherboard is an Arduino Leonardo, but you can use whatever you want.

      Eliminar
    2. Una pregunta mas...? como seria, si quiero que desde cierta medición, del sensor activara y encendiera una elctrovalvula...

      Ejemplo cuando llegue a X temperatura, se cierre la electrovalvula, y despues que regrese a cierta temperatura vuelva a abrir la electrovalcula..

      Seria otro sensor, o se puede jalar desde el primer sensor...

      Un saludo

      Eliminar
    3. Es relatívamente sencillo; tienes que comprar un relé y conectarlo a una salida digital donde lo controlas.
      Sólo faltaría añadir el código para que cuando llegue a la temperatura que indiques la salida conectada al relé se active, y se desactive cuando vuelva. Aquí tienes 4 relay económicos por 5€: http://dx.com/p/4-ch-12v-power-relay-module-red-blue-173827

      Eliminar
    4. Que sea necesario otro sensor sólo depende de lo que quieras hacer, pero normalmente no es necesario (por ejemplo para activar una bomba de circulación de agua le indicas que se active por ejemplo cuando suba de 60ºC y se desactive cuando baje de 40ºC, pero con un temporizador para que no esté activándose y desactivándose muchas veces seguidas).

      Eliminar

Puede dejar su comentario. Los comentarios descalificativos o sin relación ninguna con el tema tratado serán eliminados sin previo aviso. Antes de plantear una duda, asegúrate de que la respuesta no está en otra entrada del tema visitando la etiqueta que hay al final del artículo para verlos todos; muchas veces lo que planteas puede haber sido corregido o comentado en otra entrada posterior.