domingo, 13 de diciembre de 2015

Practicando con el sensor DHT11

Aprovechando que tengo un sensor DHT11 voy a realizar un pequeño montaje en el que voy a medir la temperatura y la humedad con dicho sensor.

Para obtener más información sobre el sensor, consultar la siguiente entrada del blog.

El esquema sería el siguiente:


Untitled Sketch 2_bb.png


Como se puede apreciar, alimentamos el sensor y el pin de datos lo conectamos al pin 5 del módulo NodeMCU.

Para programar el módulo haremos uso de la API dht

El siguiente programa muestra por consola la temperatura y la humedad cada 3 segundos y se basa en el ejemplo de la documentación de la API:

pin = 5
function LeeDatos()
    status,temp,humi,temp_decimial,humi_decimial = dht.read11(pin)
    if( status == dht.OK ) then
           print(
           string.format(
           "DHT Temperature:%d.%03d;Humidity:%d.%03d\r\n",
           math.floor(temp),
           temp_decimial,
           math.floor(humi),
           humi_decimial
           )
       )
    end
end
tmr.alarm(0,3000,1, function() LeeDatos() end)


El resultado en consola es el siguiente:
DHT Temperature:23.000;Humidity:41.000

La instrucción que lee los datos es la siguiente:
status,temp,humi,temp_decimial,humi_decimial = dht.read11(pin)

Luego, se comprueba que el estado del sensor es correcto:
if( status == dht.OK ) then

Para mostrar en consola el resultado:
print(string.format(
"DHT Temperature:%d.%03d;Humidity:%d.%03d\r\n",
math.floor(temp),
temp_decimial,
    math.floor(humi),
      humi_decimial
))

La clave está en string.format que se utiliza para dar formato a cadenas. Se compone de diferentes directivas que indican dónde y cómo debe ser escrito cada argumento. Una directiva se compone del carácter % seguido de una letra que nos indica cómo formatear el argumento:
  • %d o %i: número decimal entero
  • %x: número hexadecimal
  • %o: número octal
  • &f: número en coma flotante
  • %s: string
  • %c: carácter

Por cada directiva hay que indicar un argumento separado por comas.

También podemos indicar el número de caracteres. Por ejemplo:
d = 5; m = 11; y = 1990
print(string.format("%02d/%02d/%04d", d, m, y)) --> 05/11/1990

Finalmente, los caracteres especiales:
  • \r: retorno de carro
  • \n: nueva línea

Nota: math.floor es una librería de Lua que redondea un número.

Más información sobre los string: The String Library

Notas:

Mi módulo DHT11 solo muestra valores de temperatura y humedad enteros por lo que no son necesarias las variables temp_decimial,humi_decimial. Por tanto, el código podría ser:
status,temp,humi = dht.read11(pin)

Podemos mostrar los códigos de error en el caso de que la lectura haya sido incorrecta. Para ello nos valemos del resultado que devuelve la lectura del sensor en su variable status:
if( status == dht.OK ) then
 print("DHT Temperatura: "..temp.."ºC - Humedad: "..humi.." %")
 elseif( status == dht.ERROR_CHECKSUM ) then
 print( "DHT Checksum error." );
 elseif( status == dht.ERROR_TIMEOUT ) then
 print( "DHT Time out." );
 end
end


 
 

 

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.