Sensor de temperatura LM35

Indice

  1. 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:

PasoOperaciónEjemplo
1. Lectura ADCanalogRead() devuelve 0-1023205
2. Voltaje205 × (5000/1024) = 1000.98 mV~1001 mV
3. Temperatura °C1001 / 10 = 100.1°C100.1°C
4. Temperatura °F100.1 × 9/5 + 32 = 212.2°F212.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ísticaLM35DHT11DHT22
PrecioMuy bajo (~$2)BajoMedio
Precisión±0.5°C±2°C±0.5°C
SalidaAnalógicaDigitalDigital
Rango-55 a +150°C0 a 50°C-40 a 80°C
HumedadNo mideMideMide
FacilidadMuy fácilFácilFácil
RespuestaRápidaLentaLenta

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:

SensorPrecio aproximadoUso recomendado
LM35$2-3Proyectos simples, educación
TMP36$2-3Alternativa al LM35
DS18B20$4-6Digital, múltiples sensores
DHT11$4-6Temperatura + Humedad básica
DHT22$8-12Temperatura + Humedad precisa