En este tutorial usaremos los sensores de temperatura KY-028 y KY-013; ambos son transductores normalmente llamados termistores, los cuales tienen variación de su resistencia dependiendo de la temperatura.
INTRODUCCIÓN
Comportamiento y características de un termistor
La relación resistencia-temperatura no es directamente lineal, ya que depende del material existe diferencia del comportamiento entre transductores:
Donde:
- RTD: Detector Resistivo de Temperatura
- NTC: Coeficiente de Temperatura Negativo
- PTC: Coeficiente de Temperatura Positivo
Los módulos KY-013 y KY-028 son NTC (Negative Temperature Coefficient), por lo que disminuirá su valor óhmico a medida que aumenta la temperatura, por lo tanto presentarán un coeficiente de temperatura negativo. Pero ¿qué diferencias existen entre estos dos módulos?
Comparación entre KY-013 y KY-028
Los sensores de temperatura KY-028 y KY-013 tienen la misma funcionalidad pero con algunas diferencias. A continuación un resumen de sus características:
Ahora que ya conocemos un poco del comportamiento de los termistores y sus diferencias cabe mencionar que estos sensores no arroja datos directamente en grados Celsius, ambos nos darán lecturas de valores entre 0 y 1023. Para tener los valores de temperatura (°C,°K o °F) se tendrán que usar la ecuación de Steinhart-Hart:
Esta expresión nos ayudara a determinar la relación entre resistencia-temperatura, en donde:
Ahora procederemos a realizar nuestro proyectos con los sensores de temperatura. Para ello necesitaremos:
- Sensores de Temperatura KY-028 y KY-013
- Sensor 3mm Led Bicolor Cátodo Común KY-029
- Tarjeta de Desarrollo Arduino UNO
- Resistencias de 220 ohm
- Cables Dupont
Diagrama de Conexión para KY-028
Realizaremos la siguiente conexión entre el Arduino UNO, el módulo de temperatura KY-013 y para visualizar las variaciones por medio de un LED Bicolor KY-029, como se muestra en la siguiente imagen:
Código en Arduino IDE y KY-013
Para el siguiente programa declararemos los pines para el LED Bicolor KY-029 y variables para realizar los cálculos con la ecuación de Steinhart-Hart. Nótese que antes de realizar dicha operación trabajaremos con la función map, la cual nos ayudará a tener una relación lineal entre los valores de resistencia-temperatura.
La función map nos ayuda a realiza un mapeo entre los valores de entrada y los requeridos, para poder tener una relación directamente proporcional entre temperatura y resistencia del termistor, es decir, si la resistencia aumenta la temperatura también. Esta operación se conforman por 5 elementos, en nuestro caso serán los siguientes valores:
- valor: el número a mapear, es decir, lectura del KY-013
- 0: el límite inferior del valor leído por el sensor, teniendo en cuenta que va de 0 a 1023.
- 270: el límite superior del valor leído por el sensor, este puede variar dependiendo el termistor.
- 0: el límite inferior de temperatura
- 50: el límite superior de temperatura
int ledR = 10; //Led Rojo del KY-029 int ledV = 9; //Led Verde del KY-029 int ky013 = A0; //Valores de entrada analógicos por el termistor int valor; //Variable que guardara los datos de entrada del KY-013 //Variables para realizar la ecuación Steinhart-Hart float R1 = 10000; // Valor de R1 de la PCB 10k float logR2, R2, TK, TC; //Elementos para realizar la ecuación float A = 0.001129148, B= 0.000234125, C = 0.0000000876741; //Valores constantes considerando NTC de 10K y trabajando a una temperatura entre -55°C a +125°C void setup() { Serial.begin(9600); //Inicialización del Puerto Serial pinMode (ledR, OUTPUT) ; //Declaración del Led Rojo del KY-029 pinMode (ledV, OUTPUT) ; //Declaración del Led Verde del KY-029 } void loop() { valor = analogRead(ky013); //Se asigna los valores leídos a la variable valor Serial.print("Valor Analógico:"); //Se imprimirá los valores del sensor Serial.println(valor); // que va de 0-1023, esto para saber que que valores esta teniendo en reposo en termistor valor = map (valor, 0, 270, 0, 50); //para evitar la exponencial, usaremos la función map //en donde 0-270, serán los valores de entrada analógico vs 0-50 el valor de temperatura //Conversión de valores analógicos a grados Celsius R2 = R1 * (1023.0 / (float)valor - 1.0); //Calculo de la resistencia del termistor logR2 = log(R2); //Calculo del logaritmo de la resistencia del termistor TK = (1.0 / (c1 + c2 * logR2 + c3 * logR2 * logR2 * logR2)); // Temperatura en Kelvin TC = TK - 273.15; //Conversión a Temperatura Celsius TC=TC*(-1); Serial.print("Temperatura es:"); Serial.println(TK); //Impresión de temperatura en Celsius delay(500); //Duración del proceso, medio minuto digitalWrite(ledR, LOW); //Antes de cualquier función los LED estarán en nivel BAJO/0 digitalWrite(ledV, LOW); if (T >= 22) { //Si la temperatura es por arriba de 22° digitalWrite(ledR, HIGH); //Se encenderá el LED ROJO del KY-029 } else { //De lo contrario T<22°C digitalWrite(ledV, HIGH); //Se encenderá el LED VERDE del KY-029 } }
Una vez que es obtenido el valor de temperatura, el programa evalúa si es mayor a 22°C , en caso de ser afirmativa esta condición el LED Bicolor prenderá con luz roja y de lo contrario (si se mantiene por debajo de esta temperatura) su luz será verde. Tal como se muestra en el siguiente video:
Diagrama de conexión para KY-028
Ahora probaremos el mismo funcionamiento pero con el KY-028, el cual cuenta con un potenciómetro para ajustar la sensibilidad de nuestro sensor. Solo conectaremos la salida analógica de KY-028 al Arduino, ya que el LED 2 encenderá cuando salida digital(D0) detecte la temperatura configurada por el potenciómetro.
Código en IDE Arduino para Sensor de Temperatura Digital
Nos apoyaremos del código del ejercicio anterior, solo que variaremos algunos datos de la función map; ahora serán lo siguientes valores:
- valor: el número a mapear, es decir, lectura del KY-013
- 0: el límite inferior del valor leído por el sensor, teniendo en cuenta que va de 0 a 1023.
- 650: el límite superior del valor leído por el sensor, este se ajusto por medio del potenciometro para obtener la temperatura de comparación deseada.
- -55: el límite inferior de temperatura, ahora lo modificaremos respecto al datasheet de KY
- 125: el límite superior de temperatura
int ledR = 10; //Led Rojo del KY-029 int ledV = 9; //Led Verde del KY-029 int ky013 = A0; //Valores de entrada analógicos por el termistor int valor; //Variable que guardara los datos de entrada del KY-013 //Variables para realizar la ecuación Steinhart-Hart float R1 = 10000; // Valor de R1 de la PCB 10k float logR2, R2, TK, TC; //Elementos para realizar la ecuación float A = 0.001129148, B= 0.000234125, C = 0.0000000876741; //Valores constantes considerando NTC de 10K y trabajando a una temperatura entre -55°C a +125°C void setup() { Serial.begin(9600); //Inicialización del Puerto Serial pinMode (ledR, OUTPUT) ; //Declaración del Led Rojo del KY-029 pinMode (ledV, OUTPUT) ; //Declaración del Led Verde del KY-029 } void loop() { valor = analogRead(ky013); //Se asigna los valores leídos a la variable valor Serial.print("Valor Analógico:"); //Se imprimirá los valores del sensor Serial.println(valor); // que va de 0-1023, esto para saber que que valores esta teniendo en reposo en termistor valor = map (valor, 0, 650, -55, 125); //para evitar la exponencial, usaremos la función map //en donde 0-650, serán los valores de entrada analógico vs -55-125 el valor de temperatura //Conversión de valores analógicos a grados Celsius R2 = R1 * (1023.0 / (float)valor - 1.0); //Calculo de la resistencia del termistor logR2 = log(R2); //Calculo del logaritmo de la resistencia del termistor TK = (1.0 / (c1 + c2 * logR2 + c3 * logR2 * logR2 * logR2)); // Temperatura en Kelvin TC = TK - 273.15; //Conversión a Temperatura Celsius TC = TC * (-1); Serial.print("Temperatura es:"); Serial.println(TK); //Impresión de temperatura en Celsius delay(500); //Duración del proceso, medio minuto digitalWrite(ledR, LOW); //Antes de cualquier función los LED estarán en nivel BAJO/0 digitalWrite(ledV, LOW); if (T >= 23) { //Si la temperatura es por arriba de 22° digitalWrite(ledR, HIGH); //Se encenderá el LED ROJO del KY-029 } else { //De lo contrario T<22°C digitalWrite(ledV, HIGH); //Se encenderá el LED VERDE del KY-029 } }
Al igual que el código anterior, realizará una comparación de la temperatura para poder cambiar el color del LED Bicolor dependiendo a la condición IF.
Como se pudo observar, la configuración de la sensibilidad al KY nos ayuda a tener una señal en alto en el LED cuando supera el umbral configurado por el potenciómetro.
Si te gustaría mas ejemplos respecto a la medición de temperatura, te recomendamos el tutorial ¿Cómo visualizar los datos del sensor de Humedad y Temperatura KY-015?.
Hola buenas, estoy realizando un trabajo y me gustaría saber como has obtenido los valores de las constante para la ecuación de Steinhart-Hart
Hola Alberto!
Las constantes que se utilizaron en el programa son producto del muestreo de la variación de resistencia y temperatura del termistor. En la bibliografía incluida en el articulo (al final de esta) incluye una hoja de Excel la cual se aproxima a los valores utilizados en el programa.
Saludos