03/10/12
Tutor ia l Ar duino # 0005 - Sens or de temper a tur a NTC
INICIO
ARDUINO »
W ASPMOTE
3D PRINTERS
HW & ANDROID
Tutorial Arduino Arduino # 0005 – Sensor de temperatura temperatura NTC
NOTICIAS
9
YOUTUBE
ABOUT
62 Subscribers
ALARMA TEMP TEMPERATURA ERATURA,, Arduino , ECUACION NTC, NTC , NTC NTC,, PT C by Pablo Murillo
04 dic 2011
1,129 Followers
1,318 Fans
Buscas algo..???
# Sensor de temperatura NTC Bienvenidos a un nuevo tutorial para sacar el máximo partido a vuestro Arduino, seguimos con los sens ores, en este caso exploramos exploramos las posibilidades de un sensor de temperatura NTC: Nivel: Básico Coste: <30€ Tiempo: 25′
Suscríbete a Arduteka!! Os recomiendo leer previamente los anteriores tutoriales por si tenéis dificultades en alguna parte de este proyecto, o bien, bien, para r ecordar conceptos de programación ya mostrados.
Parte 1: ¿Que vamos a hacer? hacer? En este proyecto proyecto vamos vamos a aprender a im plementar un sensor de temperatura a nuestros proyectos proyectos Arduino, en este proyecto simularemos cinco estados de aviso de exceso de temperatura, sobre los cuales los cuales podríamos conectar cualquier elemento que quisiéramos que actuara llegado dicho nivel, podríamos conectar circuitos de ventilación de manera que si no consiguieran mitigar el exceso de calor llegara un punto que desconectara el sistema que estemos m onitoriz onitorizando, ando, en resumen, en cualquier lugar donde un control de exceso exceso de temperatura sea necesario.
Introduce aquí tu e-mail y recibe Introduce recibe al instante todas las nov novedades edades de Arduteka!! Arduteka!! Únete a otros 166 suscriptores Correo Corre o elect rónico
Suscribir Susc ribir a hora!!
Recientes También vamos a controlar la temperatura vía puerto serie, ya que todavía no hemos hablado de cómo utilizarr los LCD en nuestro Arduino, todo utiliza todo llegará.
www.arduteka.com/2011/12/tutorial-arduino-0005-sensor-de-temperatura-ntc/
Popul ar ares
Com en entari os os
Comparativa - Pulsadores para proyectos
1/11
03/10/12
Tutorial Arduino # 0005 - Sensor de temperatura NTC
www.arduteka.com/2011/12/tutorial-arduino-0005-sensor-de-temperatura-ntc/
2/11
03/10/12
Tutorial Arduino # 0005 - Sensor de temperatura NTC
La manera de conectar este sensor a nues tro circuito va a s er formando un divisor de tensión con su sali da a una entrada analógica (podéis ver en este ejemplo como funciona una entrada analógica ), en el que nuestra NTC será la resistencia inferior, lo que además nos protegerá de un problema que tienen estos sensores, cuando la corriente que circula por él es baja, no tenemos ningún problema, pues la disipación de calor es casi nula (VxI2) pero si la aum entamos, llegamos a un punto en que esa dis ipación afecta a la resistencia del sensor, por lo que deducimos que la respuesta de una NTC no es lineal sino hiperbólica, pero al colocarlo como un divisor de tensión la variación de tensión Vout va a s er prácticamente lineal.
En cuanto a la otra resis tencia que formará el divisor de tensión, utilizaremos una de 1KΩ, esto es así para aprovechar el rango de muestreo que nos proporciona Arduino con un consumo de corriente limitado, veamos rápidamente el m otivo. Si recordamos la ecuación del divisor de tensión:
Veremos que si la resistencia máxima de nuestra NTC va a ser 10KΩ, y la fija de 1KΩ, tendremos una variación de tensión entre 0v y 4,55v. Podéis hacer cuentas vosotros mis mos con otros valores y veréis que si aumentamos la resistencia, dism inuye el rango de Vout, y si la disminuim os, aumentará los consumos de corriente en exceso. Entrada de ajuste mínimo de temperatura.
Para tener un mando sobre el que ajustar la temperatura mínima, simplemente colocaremos un potenciómetro dispuesto como divisor de tensión, a una de las entradas analógicas y utilizaremos su mues treo para mapearlo a nuestro antojo como veremos en l a sección de programación. Salidas.
Para las s alidas utilizaremos la ya conocida configuración de LED más resistencia. De manera que el es quema eléctrico global nos quedaría así:
www.arduteka.com/2011/12/tutorial-arduino-0005-sensor-de-temperatura-ntc/
3/11
03/10/12
Tutorial Arduino # 0005 - Sensor de temperatura NTC
Y las conexiones en nues tra protoboard…
Parte 3: Programando… Veamos primero el código al com pleto: 1 2 3 4 5 6 7 8 9 10
/* Tutorial # 0005 Arduino Academy - Sensor NTC
?
Conectamos una NTC a una entrada analógica para controlar cinco salidas en función de la temperatrura. Además utilizaremos un ponteciómetro para controlar la temperatura a partir de la cual se activarán las salidas
www.arduteka.com/2011/12/tutorial-arduino-0005-sensor-de-temperatura-ntc/
4/11
03/10/12
Tutorial Arduino # 0005 - Sensor de temperatura NTC 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
Este proyecto es de dominio público. */ //Añadimos la librería math.h #include //Pines para los LED int pinLed1 = 8; int pinLed2 = 9; int pinLed3 = 10; int pinLed4 = 11; int pinLed5 = 12; //Pines para las entradas analógicas int analogPin1 = 0; int analogPin2 = 1; //Escala de Avisos int escala = 2; //Variable para la temperatura de disparo double tempMin = 0.0 ; //Datos para las ecuaciones float float float float float
Vin = 5.0 ; Rfija = 1000; R25 = 2800; Beta = 3900.0; T0 = 293.15;
// // // // //
[V] [ohm] [ohm] [K] [K]
Tensión alimentación del divisor Resistencia fija del divisor Valor de NTC a 25ºC Parámetro Beta de NTC Temperatura de referencia en Kelvin
float Vout = 0.0 ; float Rntc = 0.0 ;
// [V] // [ohm]
Variable para almacenar Vout Variable para NTC en ohmnios
float TempK = 0.0; float TempC = 0.0;
// [K] // [ºC]
Temperatura salida en Kelvin Temperatura salida en Celsius
void setup() { //Comenzamos la comunicación puerto serie Serial.begin(9600); //Declaramos pines de salida pinMode(pinLed1, OUTPUT); pinMode(pinLed2, OUTPUT); pinMode(pinLed3, OUTPUT); pinMode(pinLed4, OUTPUT); pinMode(pinLed5, OUTPUT); //Y los pines de entrada pinMode(analogPin1, INPUT); pinMode(analogPin2, INPUT); } void loop() { //Primero leemos el pootenciómetro tempMin = analogRead(analogPin2); //Lo mapeamos a valores de -100 a 800 tempMin = map (tempMin, 0, 1023, -100, 800); //Y lo dividimos entre 10 para darle un decimal tempMin = tempMin/10; //Y lanzamos el ajuste establecido via serie Serial.println("-----------------------------------------------"); Serial.println(); Serial.print("AJUSTE DE TEMPERATURA MINIMA A "); Serial.print(tempMin); Serial.println(" GRADOS CELSIUS"); Serial.println(); Serial.println("-----------------------------------------------"); //Y ahora calculamos la Temperatura //Primero la Vout del divisor Vout=(Vin/1024)*(analogRead(analogPin1)) ; //Ahora la resistencia de la NTC Rntc=(Vout*Rfija)/(Vin-Vout); //Y por último la temperatura en Kelvin TempK = Beta/(log(Rntc/R25)+(Beta/T0)); //Y ahora la pasamos a celsius TempC = TempK-273.15; //Y lo mostramos por puerto serie Serial.println(); Serial.print("LA TEMPERATURA DE LA NTC ES DE "); Serial.print(TempC); Serial.println(" GRADOS CELSIUS"); Serial.println(); //Ahora las comparaciones para las salidas if (TempC < tempMin)
www.arduteka.com/2011/12/tutorial-arduino-0005-sensor-de-temperatura-ntc/
5/11
03/10/12
Tutorial Arduino # 0005 - Sensor de temperatura NTC 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
{ digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, LOW ); digitalWrite(pinLed3, LOW ); digitalWrite(pinLed4, LOW ); digitalWrite(pinLed5, LOW ); } else if (((TempC <= (tempMin + escala)) & (TempC > tempMin))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, LOW ); digitalWrite(pinLed4, LOW ); digitalWrite(pinLed5, LOW ); } else if (((TempC<=(tempMin+(escala*2)))&(TempC>tempMin+escala))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, LOW ); digitalWrite(pinLed5, LOW ); } else if ((TempC<=(tempMin+(escala*3)))&(TempC>tempMin+(escala*2))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, HIGH); digitalWrite(pinLed5, LOW ); } else if (TempC > (tempMin + (escala*4))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, HIGH); digitalWrite(pinLed5, HIGH); } //Un pequeño delay para no volver loco al puerto serie delay(500); }
Empecemos a sacarle brillo! La primera línea que nos resulta desconocida es: 1
# include
?
Cuando ponemos #include lo que hacemos es importar las funciones que haya en esa librería a nuestro programa, en este caso, la librería math.h nos va añadir la posibilidad de realizar operaciones matemáticas algo más complejas, es como cuando Neo aprendía a hacer cosas en Matrix en segundos.. (punto friki.. sorry). En arduino tenemos infinidad de librerías que iremos descubriendo poco a poco, sigamos! Lo siguiente que nos encontramos es la definición de los pines de entrada y de salida, ya sabemos de sobra a que nos referimos si habéis seguido los anteriores tutoriales. 1 2 3 4 5 6 7 8 9 10
//Pines para los LED int pinLed1 = 8; int pinLed2 = 9; int pinLed3 = 10; int pinLed4 = 11; int pinLed5 = 12;
?
//Pines para las entradas analógicas int analogPin1 = 0; int analogPin2 = 1;
Pero después de es to declaramos la variable “escala” como entero: 1
int
escala = 2;
?
Esta variable la utilizaremos para establecer el intervalo que queremos que haya entre alarmas , es decir, si yo pongo una temperatura de disparo de 20ºC, con una escala de 2 la primera alarma será a 20º, la segunda a 22º, la tercera a 24º, etc… Ahora introdu cirem os los datos para hacer l as ecuaciones que nos perm itirán, en ba se a a la lectura d e nuestra entrada analógica conectada al divisor de tensi ón, calcular la temperatura. 1 2 3 4 5
float float float float float
Vin = 5.0 ; Rfija = 1000; R25 = 2800; Beta = 3900.0; T0 = 293.15;
// // // // //
[V] [ohm] [ohm] [K] [K]
Tensión alimentación del divisor Resistencia fija del divisor Valor de NTC a 25ºC Parámetro Beta de NTC Temperatura de referencia en Kelvin
www.arduteka.com/2011/12/tutorial-arduino-0005-sensor-de-temperatura-ntc/
?
6/11
03/10/12
Tutorial Arduino # 0005 - Sensor de temperatura NTC 6 7 8 9 10 11
float Vout = 0.0 ; float Rntc = 0.0 ;
// [V] // [ohm]
Variable para almacenar Vout Variable para NTC en ohmnios
float TempK = 0.0 ; float TempC = 0.0 ;
// [K] // [ºC]
Temperatura salida en Kelvin Temperatura salida en Celsius
Veréis que a la hora de definir el tipo de cada variable, tenemos algo nuevo, la variable de tipo “float” , esta variable es para los números en coma flotante (número decimal), estas variables tienen un valor máximo 3.4028235E+38, y como mínimo -3.4028235E+38. Ocupan 4bytes (32bits) con una resolución mucho mayor que los enteros, lo que nos permitirá hacer cálculos bastante precisos, debem os tener en cuenta no olvidarnos de poner la com a en los núm eros que utilicemos en la operación como vemos en las líneas de código, de manera que evitemos errores de interpretación en nuestro programa. En cuanto a los parámetros necesitaremos conocer 2 datos de nuestra NTC que vendrán dispues tos en el datasheet, una resis tencia de referencia a una temperatura determinada, en nuestro caso 2800Ω a 25º y la Beta de nuestra NTC en Kelvin, para nosotros 3950 K. Un poco más abajo explicaremos en detalle todo esto. Un vez finalizada la declaración de variables globales, nos toca “configurar” el setup, de nuevo tenemos una línea nueva! 1
Serial.begin(9600);
?
Esta instrucción nos inicializa la comunicación puerto serie desde Arduino al PC a una velocidad de 9600 baudios (bits por s egundo), con esto, cualquier cosa que enviemos lo podremos visualizar en el monitor de puerto serie de nuestro software de Arduino o cualquier otro.
Luego, como siem pre, declaramos que pines van a ser entradas y cuales van a ser s alidas. 1 2 3 4 5 6 7 8 9 10
//Declaramos pines de salida pinMode(pinLed1, OUTPUT); pinMode(pinLed2, OUTPUT); pinMode(pinLed3, OUTPUT); pinMode(pinLed4, OUTPUT); pinMode(pinLed5, OUTPUT);
?
//Y los pines de entrada pinMode(analogPin1, INPUT); pinMode(analogPin2, INPUT);
Ahora come nzamos con el bucle, en prim er lugar leem os la seña l de nues tro potencióm etro para establecer una temperatura de referencia sobre la que comparar la temperatura de la NTC y disparar los avisos. Primero leemos el valor del pin analógico 2 y lo almacenam os en tempMin: 1
tempMin = analogRead(analogPin2);
?
A continuación tenemos una nueva instrucción:
1
tempMin = map (tempMin, 0, 1023, - 100, 800);
?
La función map tiene esta estructura:
map(valor, fromLow, fromHigh, toLow, toHigh)
Es decir, como si le dijéramos: Transfórmame “tempMin”, que puede ir de 0 a 1023 en valores escalonados y proporcionados desde -100 has 800.
Con esto adaptamos la lectura del potenciómetro a un rango de -100 a 800, esto lo hemos hecho así para que al dividir entre 10 el valor:
tempMin = tempMin/10; Nos devuelva una temperatura de referencia entre -10.0º y +80.0º, con esto podremos ajustar la temperatura de disparo con una precisi ón de 0.1º. A continuaci ón lo que hace mos es m andar por el pu erto serie e l dato prefijad o para tener una referenci a visual del mism o.
www.arduteka.com/2011/12/tutorial-arduino-0005-sensor-de-temperatura-ntc/
7/11
03/10/12
Tutorial Arduino # 0005 - Sensor de temperatura NTC 1 2 3 4 5 6 7
Serial.println("-----------------------------------------------"); Serial.println(); Serial.print("AJUSTE DE TEMPERATURA MINIMA A "); Serial.print(tempMin); Serial.println(" GRADOS CELSIUS"); Serial.println(); Serial.println("-----------------------------------------------");
?
Vemos dos ins trucciones nuevas: 1 2
Serial.println(); //Imprime y salta a Línea Nueva Serial.print(); //Imprime en la misma línea
?
Esto nos enviará por puerto serie cualquier cosa que incluyamos dentro de ( ), si es una variable, con poner el nombre de la variable es suficiente, como se puede ver con tempMin, pero también podemos mandar cualquier texto que queramos, siempre que lo incluyamos entre comillas, como se puede ver, yo lo único que he hecho es crear unas líneas de separación entre la variable que lanzo, para que se lean mejor los datos vía serie. Y ahora llega lo m ás compli cado del programa, el cálculo de temperatura a partir de la medida analógica. Para realizar esto debemos conocer algo de teoría. Teniendo en cuenta que el fabricante nos da el valor resis tivo para una temperatura en concreto (en nues tro caso 2800Ω para 25º) y la Beta (Temperatura característica del material entre 2000K y 4000K) podemos utilizar la ecuación que relaciona la resistencia de la NTC y la temperatura para calcular esta última, primero veamos la ecuación:
Siendo: Rt = Resis tencia a temperatura T en grados Kelvin (k = ºC + 273,15) Ro = Resis tencia de referencia a una temperatura To en Kelvin. B = Valor Beta de nuestra NTC. To = Temperatura de referencia en Kelvin. T = Temperatura a medir.
Con esta ecuación podremos saber cual será la resistencia máxima que nos va a dar nuestra NTC al calcular su curva característica, en nuestro caso, 10KΩ lo que nos s irve para diseñar el divisor de tensión.
Observamos que, si calculamos Rt, tendremos todos los datos para hallar la temperatura en un valor de resistencia determinado despejando T, veamos la ecuación despejada que utilizaremos en nuestro programa:
www.arduteka.com/2011/12/tutorial-arduino-0005-sensor-de-temperatura-ntc/
8/11
03/10/12
Tutorial Arduino # 0005 - Sensor de temperatura NTC
Bien, ya tenemos la ecuación para hallar la temperatura, pero nos faltaría s aber cual es la resistencia de la NTC, para esto primero calcularemos cual es la tensión de entrada de nuestra entrada analógica, es decir, la Vout de nuestro divisor de tens ión:
Con esto hallamos cuanto vale cada bit de la conversión analógico-digital (recordemos que nuestro conversor divide los 5 voltios entre 1024 cachitos) y lo multiplicamos por la cantidad de bit que nos lee la entrada analógica, con lo que tenemos la tensión que le es tá llegando a la entrada analógica. Una vez tenemos es to, si recordamos la fórmula del divisor de tensión:
Vemos que tenemos todos los datos a excepción de Rinferior, que es justo la resistencia de la NTC que necesitamos para calcular la temperatura, por lo que despejando nos queda:
Con esto ya tenemos todos los datos para calcular nuestra temperatura a partir de las lecturas de la entrada analógica, de manera que nos quedará de la siguiente manera al pl asm arlo en nuestro programa. 1 2 3 4 5 6 7 8 9 10 11
//Primero la Vout del divisor Vout=(Vin/1024)*(analogRead(analogPin1));
?
//Ahora la resistencia de la NTC Rntc=(Vout*Rfija)/(Vin-Vout); //Y por último la temperatura en Kelvin TempK = Beta/(log(Rntc/R25)+(Beta/T0)); //Ahora la pasamos a celsius TempC = TempK-273.15;
Ahora lo único que hacem os es enviarlo com o antes he explicado p or el puerto se rie: 1 2 3 4 5
Serial.println(); Serial.print("LA TEMPERATURA DE LA NTC ES DE "); Serial.print(TempC); Serial.println(" GRADOS CELSIUS"); Serial.println();
?
Para mostrar las salidas podéis ver que el código es muy similar al del proyecto del diodo LED, si necesitáis que lo explique no tengo inconveniente, pero no quiero repetir demasiadas cosas en los post, creo que se entienden muy bien las comparaciones. El delay que hemos puesto al final es para que los mande la temperatura cada medio segundo por el puerto serie. Y esto es todo!! Como veis vamos aumentando el nivel progresivamente, espero que no sean demasiado bruscos los cambios, si es así decírmelo!! Hasta pronto!!
Sobre el autor...
Comparte en tu red social! www.arduteka.com/2011/12/tutorial-arduino-0005-sensor-de-temperatura-ntc/
9/11
03/10/12
Tutorial Arduino # 0005 - Sensor de temperatura NTC
9 Comments
Jorge
5 diciembre, 2011 at 14:15
Responder
Excelente tutorial, he aprendido un huevo.
fuseprods
6 diciembre, 2011 at 13:02
Responder
Excelente tutorial, lástima que justo ayer me compré tres sensores LM35 para empezar a cacharrear con temperaturas... xD Pingback: Componentes – Sensor de temperatura NTC | ARDUINO ACADEMY
Alejandro 30 enero, 2012
at 22:30
Responder
Perdona, pero, en el código usas log, ¿no debería ser ln (neperiano) o algo as í?
Arduino Academy 30 enero, 2012
at 23:58
Responder
Hola! No, la si ntaxis l og(valor) ya hace referencia al logaritmo neperiano, si quisieras trabajar en otra base, sería log10(valor) para base 10 por ejemplo. Te dejo aquí algo de referencia, es algo lios o.. XD Un saludo!! double cos (double __x) // devuelve el coseno de x en radianes double fabs (double __x) // valor absoluto de un número en coma flotante double fmod (double __x, double __y) // modulo en coma flotante double modf (double __value, double *__iptr) //calcula el valor del argumento double sin (double __x) // devuelve el seno de x en radianes double sqrt (double __x) // devuelve la raíz cuadrada de x en radianes double tan (double __x) // devuelve la tangente de x en radianes double exp (double __x) // devuelve el valor exponencial de x double atan (double __x) // arco tangente de x double atan2 (double __y, // arco tangente de y/x double log (double __x) // logaritmo neperiano de x double log10 (double __x) // logaritmo en base 10 de x double pow (double __x, double __y) // x elevado a y double square (double __x) // cuadrado de x
David
6 marzo, 2012 at 17:14
Responder
Hola,¿podríais adaptar el programa para un sens or de magnetism o?(Es con un cable de cobre.La página donde lo encontré es:http://www.aaronalai.com/emf-detector
Arduino Academy
6 marzo, 2012 at 22:55
Responder
Pásate por el foro y expón allí tus dudas, seguro que te ayudan!! http://www.arduinoacademy.com/foro
Marius
17 marzo, 2012 at 17:01
Responder
Hola! La temperatura de referencia (T0) tiene que ser 298.15 (25 grados Celsius ). Lo que hay ahora serian 20 grados. Gracias por el tutorial! Muy bueno! Ahora intento usar el código para leer una temperatura. Hasta pronto! Pingback: Componentes - Sens or de temperatura NTC
www.arduteka.com/2011/12/tutorial-arduino-0005-sensor-de-temperatura-ntc/
10/11
03/10/12
Tutorial Arduino # 0005 - Sensor de temperatura NTC
Deja un comentario Añade tu comentario aquí...
Flickr Arduteka
Sitios de interés
Facebook Arduteka!
Arduino.cc
Arduteka en Facebook Me gusta
Clone Wars
A 1,318 personas les gusta Arduteka .
Cooking Hacks Libelium Pierre-o
Jordi
A lex
C arlitos
A aron
Ingeniero
Jav i
Rodolfo
A lbert
Eguzki
Rafa
Ricardo
Keto
C hao
A lejandro
Gabriel Josu
Made by Frutos Radikal Desig Plug-in social de Facebook
Copyright © 2012 Arduteka - Todos los derechos r eser vados - Acceso
www.arduteka.com/2011/12/tutorial-arduino-0005-sensor-de-temperatura-ntc/
11/11