Neste tutorial vamos ver como você pode monitorar a temperatura e umidade de ambientes usando um Sensor de temperatura e umidade DHT11 com Raspberry Pi, utilizando um programa em Python que vai mostrar essas informações na tela em tempo real.
Já mostramos anteriormente a utilização do Sensor DHT11 com Arduino, portanto vamos apenas lembrar as características básicas desse sensor:
- Alimentação: 3 à 5,5 V
- Faixa de leitura – Umidade: 20 à 80%
- Precisão umidade: 5%
- Faixa de leitura – Temperatura: 0 – 50 ºC
- Precisão temperatura: +/- 2 ºC
O sensor envia os dados para o microcontrolador utilizando apenas um pino, os outros dois são Vcc e GND, sendo que o terceiro pino não é utilizado. Confira o datasheet e na imagem abaixo a pinagem do sensor:
Conexão do DHT11 com Raspberry Pi
Vamos enviar os dados do sensor para o Raspberry Pi em intervalos de 5 segundos. Como alimentação, vamos utilizar os 3.3V da placa, e como pino de entrada no Raspberry o pino 22 (GPIO 25).
Não se esqueça que os pinos do Raspberry utilizam nível de tensão de 3.3V, portanto se você for alimentar o DHT11 com uma fonte externa (maior do que 3.3V), por exemplo, é necessário um divisor de tensão para não danificar a GPIO do Raspberry. Utilize um resistor de 4,7 K como pull-up para o pino de dados do sensor.
Biblioteca do sensor de temperatura DHT11
Vamos baixar e instalar a biblioteca da Adafruit para esse sensor de temperatura diretamente no Raspbian. Esta biblioteca serve para o DHT11 e também para o Sensor DHT22, uma versão mais precisa do sensor.
Com o Raspberry conectado à internet, abra o LX Terminal e digite os seguintes comandos:
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
Antes de continuar com a instalação da biblioteca, utilize os comandos abaixo para atualizar o Raspberry:
sudo apt-get update
sudo apt-get install build-essential python-dev
Agora sim, podemos continuar com a instalação da biblioteca:
sudo python setup.py install
Esse processo pode ser um pouco demorado, dependendo da configuração do Raspbian e da sua conexão à internet.
Leitura das informações de temperatura e umidade
Carregue a interface de programação em Python do Raspbian clicando no ícone IDLE, na tela principal. Em seguida, selecione FILE, depois NEW WINDOW. Será aberta uma nova janela, onde você deve digitar ou copiar o programa abaixo:
# Programa : Sensor de temperatura DHT11 com Raspberry Pi # Autor : MakerHero # Carrega as bibliotecas import Adafruit_DHT import RPi.GPIO as GPIO import time # Define o tipo de sensor sensor = Adafruit_DHT.DHT11 #sensor = Adafruit_DHT.DHT22 GPIO.setmode(GPIO.BOARD) # Define a GPIO conectada ao pino de dados do sensor pino_sensor = 25 # Informacoes iniciais print ("*** Lendo os valores de temperatura e umidade"); while(1): # Efetua a leitura do sensor umid, temp = Adafruit_DHT.read_retry(sensor, pino_sensor); # Caso leitura esteja ok, mostra os valores na tela if umid is not None and temp is not None: print ("Temperatura = {0:0.1f} Umidade = {1:0.1f}n").format(temp, umid); print ("Aguarda 5 segundos para efetuar nova leitura...n"); time.sleep(5) else: # Mensagem de erro de comunicacao com o sensor print("Falha ao ler dados do DHT11 !!!")
No início do programa são carregadas as bibliotecas Adafruit_DHT, para leitura do sensor de temperatura, e também as bibliotecas GPIO e timer.
Execute o programa pressionando a tecla F5 e uma nova janela será aberta, apresentando os dados de temperatura e umidade em intervalos de 5 segundos:
Gostou de monitorar a temperatura usando o DHT11 com Raspberry Pi? Deixe seu comentário logo abaixo.
Olá Adilson parabéns pelo artigo. Gostaria de saber uma informação que não achei em lugar algum, qual é o menor intervalo de tempo possível entre leituras analógicas do raspberry. Do arduino sei que é algo em torno de 100us. Obrigado
Olá Tiago,
A informação que encontrei é de 10us. Mas esse valor depende de outras variáveis.
Abraço!
Rosana – Equipe MakerHero
Para quem está com dificuldade no “import ADafrui_DHT” no raspberry pi 4B, sigam os passos abaixo:
sudo apt-get update
sudo apt-get install build-essential python-dev
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install
sudo python3 setup.py install
No final dê um SHUTDOWN no raspberry e ligue de novo (não reinicie).
Sabe Deus porque só funcionou assim, hehehe.,..
Olá …
Estou com problema na utilização dos módulos do adafruit
Fiz a instalação corretamente mas quando vou executar o aplicativo vem a mensagem : “No modulo named Adafruit_dht”
Parece que a solução é utilizar per missão de administrador mas não sei como se faz isso …
Agradeço qualquer ajuda.
Obrigado
Olá, Edmundo!
Refaça os passos, e altere apenas o que está em negrito:
Com o Raspberry conectado à internet, abra o LX Terminal e digite os seguintes comandos:
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
Antes de continuar com a instalação da biblioteca, utilize os comandos abaixo para atualizar o Raspberry:
sudo apt-get update
sudo apt-get install build-essential python-dev
Agora sim, podemos continuar com a instalação da biblioteca:
sudo python3 setup.py install
Isso deve resolver!
Abraços!
Diogo – Equipe MakerHero
Boa noite Diogo. Alterando a linha em negrito fundou (após reiniciar o Raspbian).
Porém na hora de rodar o programa, diz que houve “Falha ao ler dados do DHT11”
Pela sua experiência alguma ideia de onde posso estar errando.
Eu usei um resistor de 10. Podia!?
Rodrigo,
Acho que é um resistor muito baixo para fazer a função de pullup… Isso pode estar impedindo que o sinal seja lido corretamente.
Abraços!
Diogo – Equipe MakerHero
Tive esse erro:
*** Lendo os valores de temperatura e umidade
Traceback (most recent call last):
File “/home/pi/Adafruit_Python_DHT/Sensor.py”, line 23, in
umid, temp = Adafruit_DHT.read_retry(sensor, pino_sensor);
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/common.py”, line 94, in read_retry
humidity, temperature = read(sensor, pin, platform)
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/common.py”, line 80, in read
platform = get_platform()
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/common.py”, line 55, in get_platform
from . import Raspberry_Pi_2
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/Raspberry_Pi_2.py”, line 22, in
from . import Raspberry_Pi_2_Driver as driver
ImportError: cannot import name ‘Raspberry_Pi_2_Driver’
>>>
Olá Milton,
Você seguiu corretamente o procedimento de instalação da biblioteca do sensor DHT11?
Abraço!
Rosana – Equipe MakerHero
Olá, segui o mesmo procedimento e apareceu o mesmo erro pra mim. Alguém já resolveu este assunto? Obrigado!
Olá Fabrício,
Você está com permissão de administrador?
Abraço!
Rosana – Equipe MakerHero
olá,
o raspberry consegue controlar mais de 1 sensor de temperatura?
quero utilizar para controlar 5 sensores de temperatura.
grato
Olá Ilton,
É possível sim monitorar mais de um sensor de temperatura usando o Raspberry.
Boa sorte no projeto!
Abraço!
Rosana – Equipe MakerHero
Boa tarde
Saberia me dizer se tem como utilizar a linguagem C# ao invés de python??
Olá Renato!
Eu sei que é possível com C. Dê uma olhada neste post:
https://www.makerhero.com/blog/linguagem-c-com-raspberry-pi/
Abraços!
André – Equipe MakerHero
Bom dia, estou com uma dúvida na montagem da protoboard, abaixo da instalação do resistor existe uma faixa pintada de vermelho, qual componente coloco?
Olá Rodolfo!
Você deve colocar um jumper ali, para ligar os 5 V no pino 1 do DHT11.
Abraços!
André – Equipe MakerHero
Qual a temperatura mínima recomendada para disparar uma notificação de alerta? Configuramos no Zabbix para disparar uma notificação quando atingir-se uma temperatura de 33º, o que acham?
Olá Cesar!
Para quê você quer mandar esse alerta?
Abraços!
André – Equipe MakerHero
Boa noite,
Esse código funciona para o sensor LM35DZ tenho uma Raspberry Pi 2?
Olá Miola!
Não funciona, pois o LM35 tem a saída analógica.
Abraços!
André – Equipe MakerHero
tem como encaminhar os logs de tempertura e humidade por email?
Olá Edson!
Fizemos um post sobre isso:
https://www.makerhero.com/blog/enviar-email-com-raspberry-pi-em-python/
Abraços!
André – Equipe MakerHero
Eu consigo utilizar este valor em um arquivo HTML ou PHP? Como faço a importação do valor de temperatura?
Olá Crispim!
Você já deu uma olhada nesse post:
https://www.makerhero.com/blog/automacao-residencial-com-raspberry-pi-alarme/
Ele fala como colocar dados da Rasp em uma página na WEB.
Abraços!
André – Equipe MakerHero
Olá! Primeiro parabéns pelo ótimo trabalho. Eu não conhecia o site de vocês e achei muito bom; inclusive o nome!!
Sobre o tópico: eu queria escrever essa informação num arquivo HTML.
# Caso leitura esteja ok, mostra os valores na tela
if umid is not None and temp is not None:
print (“Temperatura = {0:0.1f} Umidade = {1:0.1f} \n”).format(temp, umid);
print (“Aguarda 5 segundos para efetuar nova leitura… \n”);
f = open(“demofile.html”, “w”)
f.write(“Temperatura = {0:0.1f} Umidade = {1:0.1f} \n”)
time.sleep(5)
Sabe porque está dando errado? Não escreve o valor.
Descobri. A solução é setar uma variável e imprimir a variável. Mesmo assim, obrigado!
Olá Crispim!
É bom saber que o nosso trabalho ajuda as pessoas 🙂
Abraços!
André – Equipe MakerHero
EU N SEI OQ TO FAZENDO
Olá Lucas!
Não se desespere cara!
Se está muito complicado esse post, você pode ir pra um um pouco mais básico 😀
Dá uma olhada nesse tutorial: https://www.makerhero.com/blog/guia-primeiros-passos-com-raspberry-pi/
Eu também comecei por ele!
Boa sorte!
Abraços
Existe algum que atinja até 300 graus?
Ola Boa tarde
Estou montando um projeto onde preciso medir a temperatura e umidade de três locais diferentes, pois bem pensei em utilizar o seguinte sensor DHT11. porem tenho uma duvida …
Nesse tipo de aplicação tem algum limitador de distancia ? ou seja posso estar com o sensor a por exemplo 70 metros e o mesmo ligado através de cabo par trançado ?
Segundo o datasheet o máximo recomendado é 20 metros
Olá! Gostaria de saber do porquê usarmos um resistor como pull-up quando o Raspberry Pi já possui resistores de pull-up e pull-down integrados, desde que ativados pelo código (com o argumento pull_up_down=GPIO.PUD_DOWN no GPIO.setup)
Boa tarde, gostaria de umas dicas pra fazer com que o Raspberry dispare um e mail para mim quando o termômetro atingir uma temperatura específica? alguém já fez ou tem alguma ideia de como ser feito?
Olá Leonardo!
Procure no google por “how to send e-mail Raspberry pi Python”, você vai achar bastante coisa.
Segue alguns links que encontrei que podem ajudar:
http://naelshiab.com/tutorial-send-email-python/
https://iotbytes.wordpress.com/programmatically-send-e-mail-from-raspberry-pi-using-python-and-gmail/
https://myhydropi.com/send-email-with-a-raspberry-pi-and-python
Aí você junta os princípios e conceitos em um projeto só.
Abraço!
Prezados,
Acredito que este tutorial esteja desatualizado.A importação da biblioteca adafruit não está ocorrendo no .py. Quando é executado o script é retornado um erro. Como podemos resolver isto?
ERRO
Traceback (most recent call last):
File “/home/pi/Giovane/temperatura1.py”, line 5, in
import Adafruit_DHT
ImportError: No module named ‘Adafruit_DHT’
Instalei conforme o procedimento … não consigo ler o sensor. Estou usando o DHT 22, mas alterei no programa para tal.
O erro parece ter a ver com a biblioteca, mas ela está lá!
Aguardo help!
Giovane,
Sim, o erro ocorre na importação da biblioteca adafruit. Tenho um projeto com o sensor DHT22 também e antes funcionava normalmente, até que atualizei o raspberry. Ainda não encontrei a solução… Caso consiga entro em contato. (Não sou muito de programação, rs).
Eu tava com o mesmo erro. Tentei rodar direto no terminal e funcionou, mudei pra Idle 2 e foi também, só dá esse erro na Idle 3. A questão é a versão do Python, provavelmente na biblioteca do sensor.
Como mandar tudo para o MySql?
Olá, muito obrigado pelas dicas do post.
Eu ainda estou começando a trabalhar com o RPi e tenho uma série de dúvidas.
Primeiramente, eu executei todos os passos desse tutorial e tudo funcionou corretamente. Agora eu gostaria que o RPi rodasse de forma autônoma e além de um display LCD, gostaria de chamar um comando de voz para falar a temperatura e umidade. Eu instalei alguns aplicativos com o apt e sempre rodo eles via LXTerminal para pronunciar algo (ou até mesmo comandos para o leitor de textos Google). Com isso, seria possível implementar no script desse tutorial, uma linha de código para executar um aplicativo externo desses ou então abrir e escrever o comando (para executar os aplicativos) no LXTerminal de forma automática?
Fiz tudo certinho, compila e roda, porém não aparece nenhum valor na tela, não entendo, tem algum jeito diferente de imprimir as variáveis?
Boa tarde, estou tentando fazer uma leitura desse sensor com um raspberry pi3, segui o tutorial completo, porém ele não faz a leitura dos valores, há algum problema desse sensor com o rpi3?
Em Python 3 dá o seguinte erro: ‘Nonetype’ object has no attribute ‘format’
A solução é só alterar o print para:
print (“Temperatura = {0:0.1f} Umidade = {1:0.1f}n”.format(temp, umid));
^
Foi só uma questão de localização dos parêntesis, pois no Python 3 print é uma função.
Obrigado ao autor pelas instruções. Valeu! 🙂
Bom dia,
Estou com dúvidas se posso colocar mais de um sensor destes e como conectar ele na GPIO.
Pensei em monitorar a temperatura do lado de dentro e fora de uma sala.
Obrigado
Bom dia Ricardo,
Não testei com dois sensores, mas tente criar um “sensor2”, por exemplo:
sensor2 = Adafruit_DHT.DHT11
E depois, conectá-lo, por exemplo, na GPIO 23 (pino 16):
pino_sensor2 = 23
O mapeamento da GPIO você encontra neste link: http://www.raspberrypi-spy.co.uk/wp-content/uploads/2012/06/Raspberry-Pi-GPIO-Layout-Model-B-Plus-rotated-2700×900.png
Abraço!
Adilson – Equipe MakerHero
Olá, no caso as temperaturas ali estão e Fahrenheit, certo? (Caso já estiver em Celsius, Ignore abaixo)
Bem, eu gostaria de saber se eu mudasse para Celsius eu precisaria alterar por completo a estrutura “Temperatura = {0:0.1f} Umidade = {1:0.1f}” ou poderia colocar como “Temperatura = {0:0.1c} Umidade = {1:0.1c}n”)” ? E teria como introduzir um teste de controle para caso a temperatura ultrapassar (tantos) ele executar um comando como (Temperatura esta muito alta ou baixa)?
Obrigado a todos que responderem minhas duvidas, Grato.
#SouIniciante.
Para quem teve o erro : Error accessing GPIO. Make sure program is run as root with sudo!
É só salvar o arquivo do Python e executarcom o sudo no Terminal.
Mais ou menos assim : sudo python nome_do_arquivo.py
Boooooaaaa, Afonso.
Valeu
Olá, estou com o seguinte erro.
*** Lendo os valores de temperatura e umidade
Traceback (most recent call last):
File “/home/pi/DHT11Teste.py”, line 21, in
umid, temp = Adafruit_DHT.read_retry(sensor, pino_sensor);
File “build/bdist.linux-armv6l/egg/Adafruit_DHT/common.py”, line 90, in read_retry
humidity, temperature = read(sensor, pin, platform)
File “build/bdist.linux-armv6l/egg/Adafruit_DHT/common.py”, line 77, in read
return platform.read(sensor, pin)
File “build/bdist.linux-armv6l/egg/Adafruit_DHT/Raspberry_Pi.py”, line 34, in read
raise RuntimeError(‘Error accessing GPIO. Make sure program is run as root with sudo!’)
RuntimeError: Error accessing GPIO. Make sure program is run as root with sudo!
>>>
Poderiam me ajudar?
Muito obrigado.
ESTOU COM ESSE MESMO ERRO DO NOSSO AMIGO JOEL, COMO RESOLVO?
*** Lendo os valores de temperatura e umidade
Traceback (most recent call last):
File “sensor.py”, line 23, in
umid, temp = Adafruit_DHT.read_retry(sensor, pino_sensor);
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/common.py”, line 90, in read_retry
humidity, temperature = read(sensor, pin, platform)
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/common.py”, line 76, in read
platform = get_platform()
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/common.py”, line 48, in get_platform
import Raspberry_Pi
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/Raspberry_Pi.py”, line 22, in
import Raspberry_Pi_Driver as driver
ImportError: No module named Raspberry_Pi_Driver
Bom dia, estou com um problema, da um erro no código dizendo que os drives do DHT22 não estão instalados, como eu os instalo?
Para quem estiver com problemas ao carregar a biblioteca utilizando o IDLE, certifique-se de que seu usuário tem permissão de administrador!
Resolvi tks
Não rolou para mim aqui.
Traceback (most recent call last)
file “home/pi/dht22-python…..”, line 6, in
import adafuit_DHT
importerror: no module named ‘adafruit_dht’
ta tudo instalado certinho
ajuda favor
Fiz igual o tutorial, est[a retornando este erro
*** Lendo os valores de temperatura e umidade
Traceback (most recent call last):
File “sensor.py”, line 23, in
umid, temp = Adafruit_DHT.read_retry(sensor, pino_sensor);
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/common.py”, line 90, in read_retry
humidity, temperature = read(sensor, pin, platform)
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/common.py”, line 76, in read
platform = get_platform()
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/common.py”, line 48, in get_platform
import Raspberry_Pi
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/Raspberry_Pi.py”, line 22, in
import Raspberry_Pi_Driver as driver
ImportError: No module named Raspberry_Pi_Driver
Sou novo no Rasp, poderia me ajudar por favor ?
Tenho o mesmo erro aqui….
Olá!
Quando aperto F5 na IDLE aparece esse erro
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/Adafruit_DHT.py”, line 5, in
import Adafruit_DHT
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/Adafruit_DHT.py”, line 10, in
sensor = Adafruit_DHT.DHT11
AttributeError: ‘module’ object has no attribute ‘DHT11’
>>>
Como se eu não tivesse importado a biblioteca, mas importei.
Agradeço
Uso o Censor DHT11 e resistor de 4,7k como instruido acima
Resolvido, depois que importei a biblioteca desliguei o raspberry totalmente e voltei a ligá-lo. Funcionou belezinha
Boa tarde Pablo,
Legal, precisando, estamos à disposição.
Abraço.
Adilson – Equipe MakerHero
no caso senhor(a) utilizo 1 sensor. Queria saber no caso de tiver mais de 1 sensor
Dentro do WHILE tem uma função:
# Efetua a leitura do sensor
umid, temp = Adafruit_DHT.read_retry(sensor, pino_sensor);
basta repetir a função, com novas variáveis e outro valor em “pino_sensor”.