Medir la temperatura con el sensor LM35 y Arduino
| Actualizado:
Comentarios: 5
Veremos cómo medir la temperatura con el sensor analógico LM35 y mostrar el valor de la temperatura en el monitor serial de Arduino o en un display de 4 dígitos y 7 segmentos.
El LM35 es uno de los sensores de temperatura más populares, puede medir temperaturas desde los -55 hasta los 150 ºC. El ajuste de salida de voltaje del LM35 es proporcional al de su entrada, por cada grado que aumenta o disminuye, varía 10 mV por grado centrígrado.
Dependiendo del tipo de encapsulado, puede oscilar su escala de temperaturas:
- LM35 / A: -55 ºC a 150 ºC
- LM35C / A: -40 ºC a 11 ºC
- LM35D: 0 a 100 ºC
El LM35 consta de 3 patillas: VCC o pin para su alimentación, con un rango de 4 a 30V; en el centro encontramos la patilla de salida, y la tercera, es la de tierra.
Leer la temperatura de un LM35 es muy sencillo, teniendo en cuenta que su salida de tensión tendrá un valor de 10mV por grado centrígrado, es decir que si el sensor estuviese a la temperatura de un grado, el sensor daría una salida de 10 mV. Por ejemplo:
- A una temperatura de 24 ºC la lectura sería de 240 mV (0.240 V)
- A una temperatura de 16.4 ºC la lectura sería de 164 mV (0.164 V)
Contenido
- 1 ¿Cómo calcular la temperatura a partir de la tensión del sensor LM35?
- 2 Medir la temperatura con el sensor LM35 y mostrar el resultado por el monitor serial.
- 3 Medir la temperatura y hallar la media.
- 4 Medir la temperatura y mostrar el resultado por un display de 4 dígitos.
- 5 Medir la temperatura y mostrar la media en un display de 4 dígitos.
¿Cómo calcular la temperatura a partir de la tensión del sensor LM35?
El sensor conectado a la placa Arduino se alimenta con 5V y la patilla de salida, se conecta a la entrada analógica A0, de esta forma con la función analogRead(A0) podemos leer el valor que guardaremos en una variable llamada sensor que puede tener un valor entre 0 y 1023, que equivale a una tensión entre 0 y 5V.
La fórmula para poder convertir la salida analógica del sensor LM35 a un valor digital sería:
Temperatura = ((sensor x 5000)/1023) / 10
Medir la temperatura con el sensor LM35 y mostrar el resultado por el monitor serial.
Material necesario:
- Placa Arduino o similar.
- Sensor de temperatura LM35.
- Cables.
- Protoboard
Esquema:
La patilla izquierda (VCC) del LM35 la conectamos a 5V de la placa, la patilla derecha a GND y el pin del medio a la entrada analógica A0 de Arduino.
Código:
int sensor; // Para guardar el valor de A0
float temperatura;
void setup(){
Serial.begin(9600);
}
void loop(){
sensor = analogRead(A0);
temperatura = ((sensor * 5000.0) / 1023) / 10;
Serial.print(temperatura, 1); // Con un solo decimal
Serial.println(" C");
delay(1000);
}
Si subimos el programa y comprobamos los resultados por el monitor serial:
Como se puede observar hay una variación de los valores debido a que trabajamos con tensiones muy bajas, la presición no es muy exacta, pero sí podemos mostrar la media de varias lecturas, obteniendo de esta manera una variación menor.
Medir la temperatura y hallar la media.
Trabajaremos con el mismo esquema anterior. La idea es hacer 5 lecturas de la temperatura y mostrar en el monitor serial la media.
Código:
int sensor;
float temperatura;
float suma;
void setup(){
Serial.begin(9600);
}
void loop(){
suma = 0;
for (int i=0; i<5; i++){
sensor = analogRead(A0);
temperatura = ((sensor * 5000.0) / 1023) / 10;
suma = temperatura + suma;
delay(500);
}
Serial.print(suma/5.0, 1);
Serial.println(" C");
}
En el código se añade una nueva variable suma para guardar la suma de las cinco medidas con las que calcular la media.
En la función loop(), tenemos un bucle for para realizar 5 lecturas de la temperatura en intervalos de medio segundo. Calculamos la media e imprimimos el resultado en el monitor serial.
Medir la temperatura y mostrar el resultado por un display de 4 dígitos.
Resulta bastante mas cómodo ver la temperatura reflejada en un display que en el monitor serial. Para conocer el funcionamiento de un display de 4 dígitos recomendamos ver antes el artículo «Funcionamiento del display de 4 dígitos y 7 segmentos con Arduino«.
Material necesario:
- Placa Arduino o compatible.
- Sensor de temperatura LM35.
- Display 4 dígitos (hemos utilizado el 3461AS).
- 4 resistencias.
- Cables.
Esquema:
Código:
Lo primero es incluir la librería SevSeg.h para la utilización del display de 4 dígitos, lo hacemos desde el menú principal del IDE: Programa / incluir librería / Administrar Biblioteca. Podéis verlo en la siguiente imagen:
#include "SevSeg.h"
SevSeg sevseg;
int sensor;
float temperatura;
unsigned long start;
void setup(){
Serial.begin(9600);
byte numDigits = 4;
byte digitPins[] = {10, 11, 12, 13};
byte segmentPins[] = {9, 2, 3, 5, 6, 8, 7, 4};
bool resistorsOnSegments = true;
bool updateWithDelaysIn = true;
byte hardwareConfig = COMMON_CATHODE;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);
}
void loop(){
if (millis() - start > 1000){
sensor = analogRead(A0);
temperatura = ((sensor * 5000.0) / 1023) / 10;
Serial.print(temperatura, 1); // un solo decimal
Serial.println(" C");
sevseg.setNumber(temperatura,1);
start = millis();
}
sevseg.refreshDisplay();
}
Medir la temperatura y mostrar la media en un display de 4 dígitos.
Utilizaremos el mismo esquema que en el apartado anterior.
Código:
#include "SevSeg.h"
SevSeg sevseg;
int sensor;
float temperatura;
unsigned long start;
float suma;
float resultado;
void setup(){
Serial.begin(9600);
byte numDigits = 4;
byte digitPins[] = {10, 11, 12, 13};
byte segmentPins[] = {9, 2, 3, 5, 6, 8, 7, 4};
bool resistorsOnSegments = true;
bool updateWithDelaysIn = true;
byte hardwareConfig = COMMON_CATHODE;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);
}
void loop(){
if (millis() - start > 1000){
suma = 0;
for (int i=0; i<10; i++){
sensor = analogRead(A0);
temperatura = ((sensor * 5000.0) / 1023) / 10;
suma = temperatura + suma;
}
resultado = suma/10.0;
Serial.print(resultado, 1);
Serial.println(" C");
sevseg.setNumber(resultado,1);
start = millis();
}
sevseg.refreshDisplay();
}