4 jul 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

28 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. hola david... y si en vez de ocupar la pantalla led deseo ocupar mi pc o laptop? tendria que habar alguna modificacion astral?

    ResponderEliminar
  5. 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
  6. que tal amigo!! oye ¿el termistor ntc que estas ocupando de cuanta resistencia es? Si ocupo uno de 60 K ¿que modificaciones tendria que hacer?

    ResponderEliminar
    Respuestas
    1. Hola! El NTC que he utilizado es de 10 K a 25ºC; sólo tienes que cambiar las siguientes constantes, midiendo su resistencia a diferentes temperaturas indicas estos datos y el programa se encarga de calcular la temperatura en otros rangos:
      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

      Si tienes alguna duda, pregunta. Saludos!

      Eliminar
    2. Ah, y se me olvidaba, también tienes que colocar otra resistencia del mismo valor que tu termistor a la hora de conectarlo en el circuito, como se indica más abajo del programa (si es de 60 K a 25ºC, otra resistencia de 60K en el mismo lado que conectes al punto analógico elegido, en este caso el 0).

      Eliminar
  7. hola!. gracias por la informacion y los referentes.

    podria usar otro valor de resistencia diferente al que corresponde a 25 ~C, si conozco cual es la temperatura en la cual mi termistor tiene esa resistencia? (remplazando los valores correspondientes en el programa, claro)

    que tal si usara uno de los valores con los que hallE beta? me sirve ese T0 y R0?

    muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola, si analizas el programa T y R son las variables de trabajo con las que sacamos los grados y resistencia.
      En cuanto a utilizar una resistencia diferente modificando el programa, aunque ahora no recuerdo muy bien cómo funcionaba, supongo que tendrías que hacer bastantes modificaciones; es más fácil conseguir la resistencia adecuada.
      Por otro lado, ¿seguro que es un sensor NTC/PTC? Me parece una resistencia muy alta...
      Los termistores son fáciles de conseguir, en todo aparato con control de temperatura (p.ej. pack de baterías) suelen traer alguno. Yo por ejemplo he sacado termistores con 5 Kohms a 25ºC. Mira por ejemplo en una batería de portátil estropeada, te trae por lo menos dos o tres. Saludos!

      Eliminar
  8. hola, me gustaría prescindir del display, me explico,
    quiero medir la temperatura de un MOSFET que si llega a los 175cº se rompe, por lo tanto necesito un programa que por ejemplo a los 70Cº me encienda un led azul, a los 120 un led verde, a los 150 uno naranja y a los 160 uno rojo.
    el problema es que veo demasiado complicado el código como para modificarlo..
    si pudieras ayudarme lo agradecería! muchas gracias!

    ResponderEliminar
  9. A ver si te puedo ayudar, Marc. Por un lado creo que tienes el concepto de durabilidad de un Mosfet algo equivocado. Los transistores de potencia, como cualquier semiconductor, a cuanta mayor temperatura trabaje, menor es su durabilidad. Puede que el tuyo reviente a 175ºC, pero te aseguro que a 120 no te va a durar mucho.
    Lo mejor es que uses un sólo led, que se active a partir de 70ºC o lo que indiques tú (sólo tienes que cambiar la cifra en la línea correspondiente), además los termistores no aguantan más de 120ºC aprox.
    Te paso el programa sin pantalla y simplificado:
    -------------------------------
    //Control temperatura (importante que cambies los siguientes valores por los de tu termistor)
    //Valores de los dos puntos del termistor
    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
    int PinLed=10; //Personalizable; Salida digital para el led , yo uso la 10, pon la que quieras
    int sensorPin = A0; // Selecciona la entrada para el termistor

    //(Esto déjalo como está)
    //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; //Para ponerle coma al resultado (en español)

    int sensorValue = 0; // Aquí almacenamos el valor del sensor


    void setup() {


    }


    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 si grados mayor o igual que 70 entonces activamos salida del led (cambia en la línea siguiente el 70 por el valor que quieras)
    if (grados>=70) //cambia este valor por el que quieras que active el led
    {
    digitalWrite(PinLed, HIGH); //se enciende si se cumple
    }
    else
    {
    digitalWrite(PinLed, LOW);
    }

    }
    ---------------------------------------
    Para que te funcione correctamente deberás ponerle los datos de tu termistor en las líneas que se indica.
    Ánimo, que tú puedes! Es cuestión de dedicarle tiempo y leer un buen libro sobre Arduino para principiantes. Saludos!

    ResponderEliminar
  10. Gracias por la guia me sirvio de mucho para crear la mia, si quieres verla es:
    http://elblogdearduino.com/termitores-tipos-y-uso-en-arduino/

    ResponderEliminar
    Respuestas
    1. Gracias por comentarlo, tu entrada es más clara, les vendrá bien a más de uno que se pase por aquí.
      Por otro lado, si te sirvió de mucho, no estaría mal que la pusieras entre tus fuentes, ¿no? Gracias!

      Eliminar
  11. Hola, probé tu código, pero al momento de calentar el termistor, la temperatura baja en vez de subir, que crees que pueda ser?

    ResponderEliminar
    Respuestas
    1. Hola Carlos, supongo que habrás modificado los parámetros de temperaturas y resistencia del principio del programa según tu termistor.
      En ese caso lo único que se me ocurre es que estés usando un termistor positivo en vez de negativo; comprueba que al calentarlo su valor de resistencia decrezca en vez de crecer, se supone que el programa vale para ambos tipos pero lo probé sólo para los negativos; sino funciona me comentas, habría que adaptarlo.

      Eliminar
  12. Alberto, comprobarlo es sencillo; con un tester, mide la resistencia del termistor a temperatura ambiente; luego lo calientas (con la mano vale) y mide de nuevo, y nos indicas. Y pásanos la parte inicial de las variables y lo reviso, y salimos de dudas.

    ResponderEliminar
  13. Hola Alberto, no sé a qué te refieres. El programa lo separa y luego lo pone junto sólo a la hora de mostrarlo en el LCD. En el resto del programa la temperatura, con decimales, la tienes en la variable T, que es un número FLOAT (de coma flotante, pero que sin embargo podría haber sido DOUBLE, que es lo mismo en Arduino).

    ResponderEliminar
  14. Hola.
    Necesito monitorear temperaturas con termistores hasta 220 metros. Qué cable puedo utilizar? Puedo enviar los cables en un ducto que tiene cableado eléctrico de 440vca?

    ResponderEliminar
    Respuestas
    1. Puedes usarlo perfectamente y al ser CA no creo que le afecte demasiado las interferencias. El único problema es la pérdida de señal; cuanto más largo el cable mismo tiene una resistencia que va aumentando según aumentan los metros, pero lo único que tienes que hacer es calibrar el sensor con los 220 metros conectados como se indica (en un par de puntos como 100ºC y 20ºC puede valer) y ya está.

      Eliminar

Puede dejar su comentario, que tratará de ser moderado en los días siguientes. En caso de ser algo importante/urgente, por favor utilicen el formulario de arriba a la derecha para contactar.