Você está na página 1de 14

# Sensor de temperatura NTC

Bienvenidos a un nuevo tutorial para sacar el mximo partido a vuestro Arduino, seguimos con los
sensores, en este caso exploramos las posibilidades de un sensor de temperatura NTC:
Nivel: Bsico
Coste: <30
Tiempo: 25

Os recomiendo leer previamente los anteriores tutoriales por si tenis dificultades en alguna
parte de este proyecto, o bien, para recordar conceptos de programacin ya mostrados.
Parte 1: Que vamos a hacer?
En este proyecto vamos a aprender a implementar un sensor de temperatura a nuestros proyectos
Arduino, en este proyecto simularemos cinco estados de aviso de exceso de temperatura, sobre los
cuales los cuales podramos conectar cualquier elemento que quisiramos que actuara llegado dicho
nivel, podramos conectar circuitos de ventilacin de manera que si no consiguieran mitigar el
exceso de calor llegara un punto que desconectara el sistema que estemos monitorizando, en
resumen, en cualquier lugar donde un control de exceso de temperatura sea necesario.
Tambin vamos a controlar la temperatura va puerto serie, ya que todava no hemos hablado de
cmo utilizar los LCD en nuestro Arduino, todo llegar.
De nuevo hemos incorporado un pequeo potencimetro que nos permitir establecer una
temperatura, a partir de la cual nos vaya dando los avisos (led) en unos intervalos fijados en nuestro
programa.
He elegido realizar un programa de aviso de exceso de temperatura, pero igualmente se podra
utilizar el NTC para un sistema en que necesitemos controlar que no descienda la temperatura a
partir de un punto crtico.
Veamos un video que muestra el resultado final:

Material necesario para este proyecto:
1 x Arduino Uno
1 x Protoboard
1 x NTC
1 x Potencimetro 10k
5 x Diodos LED
5 x Resistencias 220
1 x Resistencia 1K
1 x Juego de Cables

Parte 2: Diseando el hardware


En este nuevo proyecto Arduino tenemos que conseguir, mediante una NTC (Negative
Temperature Coefficient o Coeficiente de Temperatura Negativo) activar 5 salidas de nuestro
Arduino, una de esas salidas nos mostrar que la temperatura est por debajo del nivel crtico, y a
partir de ese nivel, ir activando una salida tras otra cada dos grados que aumente la temperatura.
Veris en el video que segn va aumentando la temperatura, se van incrementado los LED
encendidos, lo he realizado as por que es ms visual para la comprensin del funcionamiento,
podris ver en la seccin de programacin que es muy sencillo cambiar esto para que solo active un
LED o varios, o lo que necesitis.
Adems vamos a colocar un potencimetro para ajusta la temperatura, a partir de la cual, nos
empezar a lanzar los avisos.
Visto esto, estructuremos el circuito en tres partes:
Entrada de temperatura ambiente.
Entrada de ajuste mnimo de temperatura.
Salidas.

Entrada de temperatura ambiente.
Estamos utilizando una NTC, es decir, una resistencia con coeficiente de temperatura negativo
respecto a la variacin de su resistencia, esto es que a ms temperatura, aumentar la concentracin
de portadores, lo que har que su resistencia sea menor.
La manera de conectar este sensor a nuestro circuito va a ser formando un divisor de tensin con su
salida a una entrada analgica (podis ver en este ejemplo como funciona una entrada analgica), en
el que nuestra NTC ser la resistencia inferior, lo que adems nos proteger de un problema que
tienen estos sensores, cuando la corriente que circula por l es baja, no tenemos ningn problema,
pues la disipacin de calor es casi nula (VxI
2
) pero si la aumentamos, llegamos a un punto en que
esa disipacin afecta a la resistencia del sensor, por lo que deducimos que la respuesta de una NTC
no es lineal sino hiperblica, pero al colocarlo como un divisor de tensin la variacin de tensin
Vout va a ser prcticamente lineal.

En cuanto a la otra resistencia que formar el divisor de tensin, utilizaremos una de 1K, esto es
as para aprovechar el rango de muestreo que nos proporciona Arduino con un consumo de
corriente limitado, veamos rpidamente el motivo.
Si recordamos la ecuacin del divisor de tensin:

Veremos que si la resistencia mxima de nuestra NTC va a ser 10K, y la fija de 1K, tendremos
una variacin de tensin entre 0v y 4,55v. Podis hacer cuentas vosotros mismos con otros valores y
veris que si aumentamos la resistencia, disminuye el rango de Vout, y si la disminuimos,
aumentar los consumos de corriente en exceso.
Entrada de ajuste mnimo de temperatura.
Para tener un mando sobre el que ajustar la temperatura mnima, simplemente colocaremos un
potencimetro dispuesto como divisor de tensin, a una de las entradas analgicas y utilizaremos su
muestreo para mapearlo a nuestro antojo como veremos en la seccin de programacin.
Salidas.
Para las salidas utilizaremos la ya conocida configuracin de LED ms resistencia.
De manera que el esquema elctrico global nos quedara as:

Y las conexiones en nuestra protoboard

Parte 3: Programando
Veamos primero el cdigo al completo:
?
1
2
3
4
5
6
7
8
9
10
11
/*
Tutorial # 0005 Arduino Academy - Sensor NTC

Conectamos una NTC a una entrada
analgica para controlar cinco salidas
en funcin de la temperatrura.

Adems utilizaremos un pontecimetro para
controlar la temperatura a partir de la cual
se activarn las salidas

Este proyecto es de dominio pblico.
*/
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

//Aadimos la librera math.h
#include <math.h>

//Pines para los LED
int pinLed1 = 8;
int pinLed2 = 9;
int pinLed3 = 10;
int pinLed4 = 11;
int pinLed5 = 12;

//Pines para las entradas analgicas
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 Vin = 5.0; // [V] Tensin alimentacin del divisor
float Rfija = 1000; // [ohm] Resistencia fija del divisor
float R25 = 2800; // [ohm] Valor de NTC a 25C
float Beta = 3900.0; // [K] Parmetro Beta de NTC
float T0 = 293.15; // [K] Temperatura de referencia en Kelvin

float Vout = 0.0; // [V] Variable para almacenar Vout
float Rntc = 0.0; // [ohm] Variable para NTC en ohmnios

float TempK = 0.0; // [K] Temperatura salida en Kelvin
float TempC = 0.0; // [C] Temperatura salida en Celsius

void setup() {

//Comenzamos la comunicacin 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()
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
{
//Primero leemos el pootencimetro
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)
{
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);
}
106
107
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
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 pequeo delay para no volver loco al puerto serie
delay(500);
}
Empecemos a sacarle brillo!
La primera lnea que nos resulta desconocida es:
?
1
#include <math.h>
Cuando ponemos #include <librera.h> lo que hacemos es importar las funciones que haya en esa
librera a nuestro programa, en este caso, la librera math.h nos va aadir la posibilidad de realizar
operaciones matemticas algo ms complejas, es como cuando Neo aprenda a hacer cosas en
Matrix en segundos.. (punto friki.. sorry).
En arduino tenemos infinidad de libreras que iremos descubriendo poco a poco, sigamos!
Lo siguiente que nos encontramos es la definicin de los pines de entrada y de salida, ya sabemos
de sobra a que nos referimos si habis 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 analgicas
int analogPin1 = 0;
int analogPin2 = 1;
Pero despus de esto 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 20C, con una escala de 2 la primera alarma ser a
20, la segunda a 22, la tercera a 24, etc
Ahora introduciremos los datos para hacer las ecuaciones que nos permitirn, en base a a la lectura
de nuestra entrada analgica conectada al divisor de tensin, calcular la temperatura.
?
1
2
3
4
5
6
7
8
9
float Vin = 5.0; // [V] Tensin alimentacin del divisor
float Rfija = 1000; // [ohm] Resistencia fija del divisor
float R25 = 2800; // [ohm] Valor de NTC a 25C
float Beta = 3900.0; // [K] Parmetro Beta de NTC
float T0 = 293.15; // [K] Temperatura de referencia en Kelvin

float Vout = 0.0; // [V] Variable para almacenar Vout
float Rntc = 0.0; // [ohm] Variable para NTC en ohmnios

float TempK = 0.0; // [K] Temperatura salida en Kelvin
10
11
float TempC = 0.0; // [C] Temperatura salida en Celsius
Veris que a la hora de definir el tipo de cada variable, tenemos algo nuevo, la variable de
tipo float, esta variable es para los nmeros en coma flotante (nmero decimal), estas
variables tienen un valor mximo 3.4028235E+38, y como mnimo -3.4028235E+38. Ocupan
4bytes (32bits) con una resolucin mucho mayor que los enteros, lo que nos permitir hacer
clculos bastante precisos, debemos tener en cuenta no olvidarnos de poner la coma en los nmeros
que utilicemos en la operacin como vemos en las lneas de cdigo, de manera que evitemos errores
de interpretacin en nuestro programa.
En cuanto a los parmetros necesitaremos conocer 2 datos de nuestra NTC que vendrn dispuestos
en el datasheet, una resistencia 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 ms abajo explicaremos en detalle todo esto.
Un vez finalizada la declaracin de variables globales, nos toca configurar el setup, de nuevo
tenemos una lnea nueva!
?
1
Serial.begin(9600);
Esta instruccin nos inicializa la comunicacin puerto serie desde Arduino al PC a una velocidad de
9600 baudios (bits por segundo), 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 siempre, declaramos que pines van a ser entradas y cuales van a ser salidas.
?
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 comenzamos con el bucle, en primer lugar leemos la seal de nuestro potencimetro 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 analgico 2 y lo almacenamos en tempMin:
?
1 tempMin = analogRead(analogPin2);
A continuacin tenemos una nueva instruccin:
?
1
tempMin = map (tempMin, 0, 1023, -100, 800);
La funcin map tiene esta estructura:
map(valor, fromLow, fromHigh, toLow, toHigh)
Es decir, como si le dijramos: Transfrmame tempMin, que puede ir de 0 a 1023 en valores
escalonados y proporcionados desde -100 has 800.
Con esto adaptamos la lectura del potencimetro 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 precisin de 0.1.
A continuacin lo que hacemos es mandar por el puerto serie el dato prefijado para tener una
referencia visual del mismo.
?
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 instrucciones nuevas:
?
1
2
Serial.println(); //Imprime y salta a Lnea Nueva
Serial.print(); //Imprime en la misma lnea
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 tambin
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 lneas de separacin entre la variable que lanzo,
para que se lean mejor los datos va serie.
Y ahora llega lo ms complicado del programa, el clculo de temperatura a partir de la medida
analgica.
Para realizar esto debemos conocer algo de teora.
Teniendo en cuenta que el fabricante nos da el valor resistivo para una temperatura en concreto (en
nuestro caso 2800 para 25) y la Beta (Temperatura caracterstica del material entre 2000K y
4000K) podemos utilizar la ecuacin que relaciona la resistencia de la NTC y la temperatura para
calcular esta ltima, primero veamos la ecuacin:

Siendo:
Rt = Resistencia a temperatura T en grados Kelvin (k = C + 273,15)
R
o
= Resistencia de referencia a una temperatura T
o
en Kelvin.
B = Valor Beta de nuestra NTC.
T
o
= Temperatura de referencia en Kelvin.
T = Temperatura a medir.

Con esta ecuacin podremos saber cual ser la resistencia mxima que nos va a dar nuestra NTC al
calcular su curva caracterstica, en nuestro caso, 10K lo que nos sirve para disear el divisor de
tensin.

Observamos que, si calculamos Rt, tendremos todos los datos para hallar la temperatura en un valor
de resistencia determinado despejando T, veamos la ecuacin despejada que utilizaremos en nuestro
programa:

Bien, ya tenemos la ecuacin para hallar la temperatura, pero nos faltara saber cual es la resistencia
de la NTC, para esto primero calcularemos cual es la tensin de entrada de nuestra entrada
analgica, es decir, la Vout de nuestro divisor de tensin:

Con esto hallamos cuanto vale cada bit de la conversin analgico-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 analgica, con lo que tenemos la tensin que le est llegando a la entrada analgica.
Una vez tenemos esto, si recordamos la frmula del divisor de tensin:

Vemos que tenemos todos los datos a excepcin 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 analgica, de manera que nos quedar de la siguiente manera al plasmarlo 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 hacemos es enviarlo como antes he explicado por el puerto serie:
?
1
Serial.println();
Serial.print("LA TEMPERATURA DE LA NTC ES DE ");
2
3
4
5
Serial.print(TempC);
Serial.println(" GRADOS CELSIUS");
Serial.println();
Para mostrar las salidas podis ver que el cdigo es muy similar al del proyecto del diodo LED, si
necesitis 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!!

Você também pode gostar