.
Sensor de temperatura LM35
Indice
- lm35 y arduino
1. lm35 y arduino

#define ADC_VREF_mV 5000.0 // Voltaje de referencia del ADC en milivoltios (5V)
#define ADC_RESOLUTION 1024.0 // Resolución del ADC (10 bits: 0-1023)
#define PIN_LM35 A0 // Pin analógico donde está conectado el sensor LM35
void setup() {
Serial.begin(9600); // Inicializar la comunicación serial a 9600 baudios
}
void loop() {
// Obtener el valor ADC del sensor de temperatura
int valorADC = analogRead(PIN_LM35);
// Convertir el valor ADC a voltaje en milivoltios
// Fórmula: Voltaje = (ValorADC * Vref) / Resolución
float voltaje_mV = valorADC * (ADC_VREF_mV / ADC_RESOLUTION);
// Convertir el voltaje a temperatura en grados Celsius
// El LM35 produce 10mV por cada grado Celsius (10mV = 1°C)
float tempC = voltaje_mV / 10;
// Convertir de Celsius a Fahrenheit
// Fórmula: °F = (°C × 9/5) + 32
float tempF = tempC * 9 / 5 + 32;
// Mostrar la temperatura en el Monitor Serie:
Serial.print("Temperatura: ");
Serial.print(tempC); // Mostrar temperatura en Celsius
Serial.print("°C");
Serial.print(" ~ "); // Separador entre Celsius y Fahrenheit
Serial.print(tempF); // Mostrar temperatura en Fahrenheit
Serial.println("°F");
delay(1000); // Esperar 1 segundo entre lecturas
}
Explicación del funcionamiento:
Sensor LM35:
- Sensor de temperatura de precisión
- Salida analógica lineal: 10 mV por cada grado Celsius
- Rango: -55°C a +150°C
- No requiere calibración externa
Conversiones realizadas:
| Paso | Operación | Ejemplo |
|---|---|---|
| 1. Lectura ADC | analogRead() devuelve 0-1023 | 205 |
| 2. Voltaje | 205 × (5000/1024) = 1000.98 mV | ~1001 mV |
| 3. Temperatura °C | 1001 / 10 = 100.1°C | 100.1°C |
| 4. Temperatura °F | 100.1 × 9/5 + 32 = 212.2°F | 212.2°F |
Salida en el Monitor Serie:
text
Temperatura: 23.45°C ~ 74.21°F Temperatura: 23.46°C ~ 74.23°F Temperatura: 23.44°C ~ 74.19°F
Esquema de conexión:
text
LM35 (vista frontal - parte plana hacia ti)
┌──────┐
│ │
│ 1 2 3│
└──────┘
Pin 1 (VS) → 5V
Pin 2 (Vout)→ A0 (Arduino)
Pin 3 (GND) → GND
Vista alternativa (con patas hacia abajo):
┌─┐
┌┘ └┐
│ │
└┐ ┌┘
└┬┘
│
┌──┼──┐
│1 2 3│
└──┴──┘
Esquema eléctrico:
5V ──────┐
│
LM35
│
├──────→ A0 (señal de temperatura)
│
GND
Ventajas del LM35 sobre otros sensores:
| Característica | LM35 | DHT11 | DHT22 |
|---|---|---|---|
| Precio | Muy bajo (~$2) | Bajo | Medio |
| Precisión | ±0.5°C | ±2°C | ±0.5°C |
| Salida | Analógica | Digital | Digital |
| Rango | -55 a +150°C | 0 a 50°C | -40 a 80°C |
| Humedad | No mide | Mide | Mide |
| Facilidad | Muy fácil | Fácil | Fácil |
| Respuesta | Rápida | Lenta | Lenta |
Aplicaciones comunes:
- Termómetros digitales
- Control de temperatura en procesos
- Sistemas de climatización
- Monitoreo de motores y equipos
- Proyectos educativos
- Sistemas de alarma por temperatura
- Control de ventiladores
Mejoras posibles:
cpp
#define ADC_VREF_mV 5000.0
#define ADC_RESOLUTION 1024.0
#define PIN_LM35 A0
// Calibración (opcional)
float offsetCalibracion = 0.0; // Ajuste manual si es necesario
// Variables para promedio móvil
const int NUM_LECTURAS = 10;
float lecturas[NUM_LECTURAS];
int indice = 0;
float suma = 0;
void setup() {
Serial.begin(9600);
// Inicializar array de lecturas
for(int i = 0; i < NUM_LECTURAS; i++) {
lecturas[i] = 0;
}
Serial.println("=== TERMÓMETRO LM35 ===");
Serial.println("Esperando estabilización...");
delay(2000);
}
float leerTemperatura() {
int valorADC = analogRead(PIN_LM35);
float voltaje_mV = valorADC * (ADC_VREF_mV / ADC_RESOLUTION);
float tempC = (voltaje_mV / 10) + offsetCalibracion;
return tempC;
}
float promedioMovil(float nuevaLectura) {
suma = suma - lecturas[indice];
lecturas[indice] = nuevaLectura;
suma = suma + nuevaLectura;
indice = (indice + 1) % NUM_LECTURAS;
return suma / NUM_LECTURAS;
}
void loop() {
float tempActual = leerTemperatura();
float tempFiltrada = promedioMovil(tempActual);
float tempF = tempFiltrada * 9 / 5 + 32;
// Mostrar con formato
Serial.print("┌─────────────────────┐\n");
Serial.print("│ 🌡️ ");
Serial.print(tempFiltrada, 1);
Serial.print("°C ");
Serial.print(tempF, 1);
Serial.println("°F │");
// Barra gráfica de temperatura (cada "=" representa 2°C)
Serial.print("│ ");
int barras = constrain(tempFiltrada / 2, 0, 30);
for(int i = 0; i < barras; i++) {
Serial.print("█");
}
Serial.println(" │");
Serial.print("└─────────────────────┘\n");
// Alerta de temperatura extrema
if(tempFiltrada > 35) {
Serial.println("⚠️ ¡ALERTA! Temperatura muy alta ⚠️");
} else if(tempFiltrada < 0) {
Serial.println("⚠️ ¡ALERTA! Temperatura bajo cero ⚠️");
}
delay(1000);
}
Ejemplo de salida mejorada:
text
┌─────────────────────┐ │ 🌡️ 23.5°C 74.3°F │ │ ███████████ │ └─────────────────────┘ ┌─────────────────────┐ │ 🌡️ 38.2°C 100.8°F │ │ ██████████████████ │ └─────────────────────┘ ⚠️ ¡ALERTA! Temperatura muy alta ⚠️
Notas importantes:
Precisión y calibración:
- El LM35 ya viene calibrado de fábrica
- Para máxima precisión, usa la referencia interna de 1.1V del Arduino:cppanalogReference(INTERNAL); // Cambia ADC_VREF_mV a 1100.0
Problemas comunes:
- Autocalentamiento: No tocar el sensor con los dedos por mucho tiempo
- Cables largos: Pueden introducir ruido; usa cable apantallado o condensador de 0.1µF entre Vout y GND
- Lecturas erráticas: Añade un condensador de 10µF entre 5V y GND cerca del sensor
Mejoras para mayor precisión:
cpp
// Usar referencia interna de 1.1V para mejor resolución analogReference(INTERNAL); // En setup() #define ADC_VREF_mV 1100.0 // Cambiar a 1100mV
Comparativa de precios y uso:
| Sensor | Precio aproximado | Uso recomendado |
|---|---|---|
| LM35 | $2-3 | Proyectos simples, educación |
| TMP36 | $2-3 | Alternativa al LM35 |
| DS18B20 | $4-6 | Digital, múltiples sensores |
| DHT11 | $4-6 | Temperatura + Humedad básica |
| DHT22 | $8-12 | Temperatura + Humedad precisa |