fbpixel
Etiquetas: , , ,

O sensor DHT11 permite medir a temperatura e a umidade no interior de um cômodo. Veremos aqui como obter as medidas captadas por este sensor usando uma placa Arduino.

Material

  • Computador
  • Arduino UNO
  • cabo USB para conectar o Arduino ao computador
  • Sensor DHT11

Ligação do sensor DHT11

dht11-arduino-schematics_bb Medição de temperatura e umidade com um sensor DHT11

Código

O código para recuperar as informação do sensor é complicado e um pouco trabalhoso. Assim, a opção mais fácil é usar as bibliotecas oferecidas pelo Arduino ou por outros usuários. Estas bibliotecas podem ser obtidas em diferentes sítes, mas especialmente no GitHub, uma referência em plataformas de compartilhamento. No nosso caso, a biblioteca foi obtida no site do Arduino.

Criando a biblioteca

libraries-folder-dht11lib Medição de temperatura e umidade com um sensor DHT11

As bibliotecas estão frequentemente disponíveis para livre download na forma de arquivos ZIP, a serem movidos para a pasta contendo as bibliotecas da IDE do Arduino (normalmente, .\Documents\Arduino\librairies). Para utilizar o código bruto de uma biblioteca encontrada nem um site, precisamos criar dois arquivos .h e .cpp, numa pasta DHT11Lib, e copiar neles os pedaços de código correspondentes.

dht11.h

// 
//    FILE: dht11.h
// VERSION: 0.4.1
// PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino
// LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html)
//
// DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf
//
//     URL: http://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 (http://www.gnu.org/licenses/gpl.html)
//
// DATASHEET: http://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
//

Utilização da biblioteca

Depois, criamos um arquivo .ino para utilizar a biblioteca que acabámos de adicionar à nossa IDE. Modificamos ligeiramente o exemplo proposto no site do Arduino porque a nossa montagem e utilização são um pouco diferentes.

#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;
}

Obs: Ao obter programas na internet, verifique se a sua versão de componente e a sua montagem são idênticas às do exemplo. Isso evita problemas de compatibilidade.

Obs: Existem outras versões do sensor DHT11. Se o seu sensor for de outra versão, verifique a biblioteca DHTLib.

Aplicação

  • Criar uma estação meteorológica com um sensor DHT11 e um visor LCD

Fontes

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie