Midiendo temperatura y humedad con LM35 y DHT11 (Vídeo)

Cuando trabajamos con Arduino, y en general en el mundo de Internet of Things, resulta muy interesante poder monitorizar en tiempo real la temperatura. Sin embargo, no todos los sensores tienen la misma precisión y deberemos elegir uno u otro en función del uso que le vayamos a dar. Vamos a trabajar con dos sensores muy utilizados en la plataforma Arduino (LM35 y DHT11), compararemos la facilidad de uso y prestaciones de cada uno y la precisión obtenida.

Sensor de temperatura LM35

Una de las primeras cosas al estudiar la viabilidad de un nuevo dispositivo es consultar su datasheet. Es decir, el manual de instrucciones y funcionamiento. Suele ser bastante denso, y muy posiblemente innecesario según lo que vayamos a hacer, pero son la mayor fuente de información sobre un sensor o actuador.

El LM35 tiene un rango de medición que comprende desde -55 ºC hasta 150 ºC. Sin embargo, tiene una precisión garantizada de 0,5 ºC a 25 ºC. Los valores obtenidos de LM35 son lineales y cada grado medido equivale a 10mV. Por tanto, podemos crear una tabla de mediciones partiendo de las siguientes equivalencias:

150 ºC = 1500 mV

-55 ºC = -550 mV

El sensor LM35 consta de una cápsula con tres patillas: una conectada a 5V, otra a un pin analógico y otra a GND. La siguiente imagen muestra su aspecto:

LM35

A continuación presentamos un sketch en el que medimos la temperatura cada segundo:

// Variable que almacenará la temperatura
float temperatura;

void setup () {
  Serial.begin(9600);
}

void loop() {
  // Leemos del pin analógico 0
  temperatura = analogRead(0);
  // Convertimos el valor leído de voltaje a ºC
  temperatura = 5.0*temperatura*100.0/1024.0;
  Serial.print(temperatura);
  Serial.println(" oC");
  delay(1000);
}

La fórmula usada para la conversión de valor de voltaje a grados centígrados consiste en multiplicar el voltaje de entrada (5V) por la temperatura y por 100. Finalmente lo dividimos entre el número de valores analógicos posibles en Arduino.

Sin embargo, realizando pruebas mientras escribo esta entrada obtengo valores de temperatura entre 28 y 29 ºC, cuando el termómetro de mercurio indica que hay entre 26 y 27. Por tanto, podemos ver que hay un desfase en las mediciones respecto a la realidad. Existe dos formas de corregir este problema. La primera, y la más sencilla, es corregir este error a mano, ajustándolo en el programa de Arduino. En mi caso concreto quedaría así:

// Variable que almacenará la temperatura
float temperatura;

void setup () {
  Serial.begin(9600);
}

void loop() {
  // Leemos del pin analógico 0
  temperatura = analogRead(0);
  // Convertimos el valor leído de voltaje a ºC
  temperatura = (5.0*temperatura*100.0)/1024.0;
  temperatura -= 1.5;
  Serial.print(temperatura);
  Serial.println(" oC");
  delay(1000);
}

Esta solución es válida pero muy poco elegante, pues estamos asumiendo que este error va a ser siempre el mismo. Si fuese variable, no podríamos estar ajustándolo manualmente cada cierto tiempo.

Por todo ello, existe una segunda opción: encontrar una expresión de conversión mejor. En la web de Arduino nos ofrecen la siguiente alternativa:

float temperatura;

void setup(){
  // Establecemos el voltaje de entrada a 1,1V
  analogReference(INTERNAL);
  Serial.begin(9600);
}

void loop(){
  int reading = analogRead(0);
  reading = reading / 9.31;
  Serial.print(reading);
  Serial.println(" oC");
  delay(1000);
}

Vale, ¿de dónde sacas ese 9,31? Partimos de que en vez de usar 5V en la entrada, usamos 1,1V. Así, dividir 1,1V entre 1024 ofrece un valor de lectura analógica aproximado en cada paso de 0,001074V o bien 1,0742 mV. Como cada grado Celsius equivale a 10mV, 10 / 1,0742 = ~9,31. Así, cada cambio en la entrada con valor 9,31 supondrá un grado más en la escala de temperatura.

Usando esta expresión he conseguido afinar considerablemente la medición, no teniendo que recurrir a ajustes manuales.

Sensor de temperatura y humedad DHT11

El sensor DHT11 consigue medir temperatura y humedad, recibiendo la información únicamente a través del pin digital 2. Es capaz de leer un porcentaje de humedad relativa de entre el 20 y el 90% con un error de ±5%. Además, lee temperaturas entre los 0 y los 50 ºC, con un error de 2ºC. Necesita una alimentación de entre 3,3 y 5,5V de corriente continua para su funcionamiento.

En cuanto a sus conexiones, de izquierda a derecha se conectan el pin digital, 5V y GND. Para establecer la conexión de datos, se adopta un protocolo para comunicar ambos dispositivos. El funcionamiento del protocolo y las especificaciones técnicas del dispositivo están disponibles en su datasheet.

A continuación podemos ver el aspecto del sensor DHT11:

dht11

Para poder programar el sensor DHT11 en Arduino necesitamos una librería que implementa la comunicación con el dispositivo. Esta librería está disponible aquí. Para incorporarla a nuestro IDE de Arduino, descomprimimos el archivo descargado y la carpeta resultante la movemos al directorio libraries, dentro de la carpeta de instalación de Arduino. Abrimos el IDE y en el apartado de Archivo – Ejemplos – DHT11 tendremos el ejemplo de código que mostramos a continuación.

El código siguiente lee la temperatura y humedad ambiente y la muestra en el monitor serie. Esta toma de datos se realizará de forma periódica, con un intervalo de tiempo entre mediciones.

#include "DHT.h"

// Creamos una variable del tipo DHT (definida en la librería que hemos incluído)
DHT dht;

void setup(){
  Serial.begin(9600);
  Serial.println();
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");

  dht.setup(2); // Sensor conectado al pin 2
}

void loop(){
  // Esperamos el tiempo mínimo establecido por el sensor
  delay(dht.getMinimumSamplingPeriod());

  // Obtenemos la humedad y la temperatura (en grados)
  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();

  Serial.print(dht.getStatusString());
  Serial.print("\t");
  Serial.print(humidity);
  Serial.print("\t\t");
  Serial.print(temperature);
  Serial.print("\t\t");
  // Convertimos la temperatura de Celsius a Fahrenheit
  Serial.println(dht.toFahrenheit(temperature));
}
}

En las pruebas realizadas, obtengo casi dos grados centígrados más que el medido con un termómetro de mercurio. Como en el caso de LM35, tendríamos que hacer un ajuste manual de los datos para obtener un resultado lo más preciso posible.

Una opinión en “Midiendo temperatura y humedad con LM35 y DHT11 (Vídeo)

  • 28 febrero, 2019 a las 00:07
    Link permanente

    Hola buenas tardes Sergio,
    Sabes que ando enfrascado con un bendito lm35 y no quiere darme valores reales por ningún motivo, lo tengo programado con el algoritmo tradicional:

    (5.0 * valorLeido * 100.0) / 1024.0

    Y tengo resultados muy errados y fluctuantes entre 28 y 41 grados centigrados, nada estables.
    Probé con la opción que mencionas:

    void loop(){
    int reading = analogRead(0);
    reading = reading / 9.31;
    Serial.print(reading);
    Serial.println(» oC»);
    delay(1000);
    }

    Pero igual no obtengo los valores deseados, es decir no mejoran los resultado, ahora no creo que interfiera un potenciometro que también tengo conectado, aunque por ahí leí que este tipo de sensor, el lm35 es muy sensible al ruido por ser analógico.
    Podre obtener resultados precisos con este tipo de sensor ??, o que me recomiendas ??

    Responder

Deja un comentario