fbpixel
Etiquetas: , , ,
5
(1)

El sensor DHT11 puede medir la temperatura y la humedad en una habitación. Aquí hay un tutorial sobre cómo recuperar la medición del sensor con una Arduino.

Material

  • Computadora
  • Arduino UNO
  • USB cable
  • sensor DHT11
  • Cables de puente M/M
  • tablero de circuitos

Diagrama de conexión

Código

El programa para leer la medición del sensor DHT11 es bastante complejo y requiere un poco de trabajo. En tal caso, la forma más fácil es usar una biblioteca desarrollada por Arduino u otros usuarios. Esas bibliotecas pueden provenir de muchas fuentes: Arduino, por supuesto, pero también GitHub que es una referencia en el intercambio de códigos. En nuestro caso, copiamos el código de Arduino.

Crear carpeta de biblioteca

Las bibliotecas a menudo están disponibles como archivos ZIP descargables que deben extraerse en la carpeta de la biblioteca IDE (generalmente. \ Documents \ Arduino \ bibliotecas). Para usar el código sin formato copiado de una fuente aleatoria, necesitamos crear manualmente los archivos .h y .cpp, en una carpeta DHT11lib, en la que copiaremos y pegaremos el código del sitio web.

dht11.h

// 
//    FILE: dht11.h
// VERSION: 0.4.1
// PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino
// LICENSE: GPL v3 (https://www.gnu.org/licenses/gpl.html)
//
// DATASHEET: https://www.micro4you.com/files/sensor/DHT11.pdf
//
//     URL: https://playground.arduino.cc/Main/DHT11Lib
//
// HISTORY:
// George Hadjikyriacou - Original version
// see dht.cpp file
// 

#ifndef dht11_h
#define dht11_h

#if defined(ARDUINO) && (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif

#define DHT11LIB_VERSION "0.4.1"

#define DHTLIB_OK        0
#define DHTLIB_ERROR_CHECKSUM -1
#define DHTLIB_ERROR_TIMEOUT  -2

class dht11
{
public:
    int read(int pin);
  int humidity;
  int temperature;
};
#endif
//
// END OF FILE
//

dht11.cpp

//
//    FILE: dht11.cpp
// VERSION: 0.4.1
// PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino
// LICENSE: GPL v3 (https://www.gnu.org/licenses/gpl.html)
//
// DATASHEET: https://www.micro4you.com/files/sensor/DHT11.pdf
//
// HISTORY:
// George Hadjikyriacou - Original version (??)
// Mod by SimKard - Version 0.2 (24/11/2010)
// Mod by Rob Tillaart - Version 0.3 (28/03/2011)
// + added comments
// + removed all non DHT11 specific code
// + added references
// Mod by Rob Tillaart - Version 0.4 (17/03/2012)
// + added 1.0 support
// Mod by Rob Tillaart - Version 0.4.1 (19/05/2012)
// + added error codes
//
#include "dht11.h"
// Return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int dht11::read(int pin)
{
// BUFFER TO RECEIVE
uint8_t bits[5];
uint8_t cnt = 7;
uint8_t idx = 0;
// EMPTY BUFFER
for (int i=0; i< 5; i++) bits[i] = 0;
// REQUEST SAMPLE
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(18);
digitalWrite(pin, HIGH);
delayMicroseconds(40);
pinMode(pin, INPUT);
// ACKNOWLEDGE or TIMEOUT
unsigned int loopCnt = 10000;
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
loopCnt = 10000;
while(digitalRead(pin) == HIGH)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
// READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT
for (int i=0; i<40; i++)
{
loopCnt = 10000;
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
unsigned long t = micros();
loopCnt = 10000;
while(digitalRead(pin) == HIGH)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
if ((micros() - t) > 40) bits[idx] |= (1 << cnt);
if (cnt == 0)   // next byte?
{
cnt = 7;    // restart at MSB
idx++;      // next byte!
}
else cnt--;
}
// WRITE TO RIGHT VARS
// as bits[1] and bits[3] are always zero they are omitted in formulas.
humidity    = bits[0]; 
temperature = bits[2]; 
uint8_t sum = bits[0] + bits[2];  
if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM;
return DHTLIB_OK;
}
//
// END OF FILE
//

Uso de la biblioteca.

Una vez que la biblioteca se creó y se presentó en el IDE, podemos crear el archivo .ino en el que usamos la biblioteca. Adaptamos ligeramente el ejemplo del sitio web para adaptarlo a nuestro caso.

#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 4
void setup()
{
Serial.begin(9600);
Serial.println("DHT11 TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT11LIB_VERSION);
Serial.println();
}
void loop()
{
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
Serial.print("Read sensor: ");
switch (chk)
{
case DHTLIB_OK: 
Serial.println("OK"); 
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 2);
Serial.print("Temperature (°C): ");
Serial.println((float)DHT11.temperature, 2);
Serial.print("Temperature (°F): ");
Serial.println(Fahrenheit(DHT11.temperature), 2);
Serial.print("Temperature (°K): ");
Serial.println(Kelvin(DHT11.temperature), 2);
Serial.print("Dew PointFast (°C): ");
Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity));
break;
case DHTLIB_ERROR_CHECKSUM: 
Serial.println("Checksum error"); 
break;
case DHTLIB_ERROR_TIMEOUT: 
Serial.println("Time out error"); 
break;
default: 
Serial.println("Unknown error"); 
break;
}
delay(2000);
}
//Celsius to Fahrenheit conversion
double Fahrenheit(double celsius)
{
return 1.8 * celsius + 32;
}
//Celsius to Kelvin conversion
double Kelvin(double celsius)
{
return celsius + 273.15;
}
// dewPoint function NOAA
// reference (1) : http://wahiduddin.net/calc/density_algorithms.htm
// reference (2) : http://www.colorado.edu/geography/weather_station/Geog_site/about.htm
double dewPointFast(double celsius, double humidity)
{
double a = 17.271;
double b = 237.7;
double temp = (a * celsius) / (b + celsius) + log(humidity*0.01);
double Td = (b * temp) / (a - temp);
return Td;
}

N.B.: cuando copie el código de un sitio web, compruebe siempre si la versión y el cableado de sus componentes son los mismos para evitar problemas de compatibilidad.

N.B.: existe otra versión de DHT11. Si tiene una de esas otras versiones, consulte la biblioteca DHTLib.

Solicitud

  • Cree una estación meteo con un sensor DHT11 y una pantalla LCD

Sources

Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuarlo!

Promedio de puntuación 5 / 5. Recuento de votos: 1

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Ya que has encontrado útil este contenido...

¡Sígueme en los medios sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?