Monitorando temperatura e umidade com o sensor DHT-11

Neste tutorial vamos ver como usar o módulo DHT-11 para medir a temperatura e umidade relativa do ar de um ambiente.

Materiais necessários

  • Raspberry Pi (usamos o modelo B+)
  • Sensor DHT-11
  • Resistor 4.7K para pull-up (caso você esteja utilizando o sensor diretamente, sem uma placa auxiliar)

Especificações técnicas

  • Modelo: DHT-11
  • Alimentação: 3.0 à 5.0 V
  • Corrente: Máximo de 500 mA, em stand-by ~150 uA
  • Faixa de leitura umidade: 20 ~ 90% UH
  • Faixa de leitura temperatura: 0 ~ 50 ºC
  • Precisão de medição de umidade: +/- 5% UH
  • Precisão de medição de temperatura: +/- 2 ºC
  • Resolução da medida de umidade: 1% UH
  • Resolução da medida de temperatura: 1 ºC

Sobre o módulo

O sensor DHT-11 é um módulo que inclui um sensor de medição de umidade do tipo resistivo, um sensor de temperatura NTC e um microcontrolador de 8 bits, que provê uma saída digital calibrada. Ele vem encapsulado em um formato de 4 pinos, normalmente, e pode ser facilmente conectado.

O módulo que vamos usar é na verdade uma placa PCB, com alguns componente já montados, para facilitar a conexão com o Raspberry Pi.

Processando os dados

Por ter somente um pino de dados, as informações são enviadas num formato especial:

8 bits HR integral + 8 bits HR decimal + 8 bits T integral + 8 bits T decimal + 8 bits CRC

Totalizando um pacote de 40 bits (5 bytes). Os dois primeiro bytes são relativos à leitura da umidade (parte inteira e parte decimal), os bytes 3 e 4 são relativos à leitura da temperatura (parte inteira e parte decimal) e o byte 5 (último, mas não menos importante) é o byte de CRC, para verificar a integridade dos dados. Esse cálculo é bem simples, sendo apenas a soma dos 4 primeiros bytes, analisando apenas os 8 bits menos significativos.

Na primeira parte da comunicação, ocorre uma sincronização entre a MCU e o sensor para que a unidade saiba que deve começar a comunicação. Esse processo demora aproximadamente 19ms.

Durante o envio de dados propriamente dito, cada bit de informação começa com um nível baixo que dura aproximadamente 50 us e termina com um nível alto que varia de acordo com o bit a ser enviado: caso seja “0”, a duração é de 26~28 us:

Caso seja “1”, a duração é de 70 us:

Conectando

  • Conecte o pino de VCC ao pino 3.3 V (pino 1) da Raspberry Pi.
  • Conecte o pino de GND ao pino GND (pino 9) da Raspberry Pi.
  • Conecte o pino de dados ao pino GPIO 7 (pino 11) da Raspberry Pi.

Nota: Caso tenha alguma dúvida com relação aos pinos GPIO, leia esse artigo.

Código

Bem, agora vamos ao código! Como vivemos num mundo bem legal e alguém muito caridoso já fez o trabalho sujo pra gente, não vamos implementar o código de leitura da temperatura e umidade. A biblioteca está neste link e você pode baixar no seu computador.

Para usar, copie o código a seguir e salve em um arquivo qualquer (no nosso caso, salvamos como temp.py).

import RPi.GPIO as GPIO
import dht11
 
# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
 
# read data using pin 11
instance = dht11.DHT11(pin=11)
result = instance.read()
 
if result.is_valid():
    print("Temperatura: %d  C" % result.temperature)
    print("    Umidade: %d %%" % result.humidity)
else:
    print("Erro: %d" % result.error_code)

Rodando o nosso programa com a linha de comando python temp.py, teremos uma saída parecida com essa:

Perceba que a primeira leitura deu falha. Isso ocorre porque estamos usando a Raspberry Pi, que não é um sistema tempo-real e também a linguagem de mais alto nível Python, o que causa mais um atraso na leitura dos pinos do GPIO. Pode-se fazer um controle maior, com retentativas quando acontecer um erro, mas isso deixamos com vocês.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *