Arduino e DHT11: Controle de relé por temperatura
No post de hoje vamos ver como montar um circuito de acionamento de relé por temperatura utilizando Arduino e DHT11, criando uma interessante opção de controle para o seu projeto de automação residencial, já que essa saída pode ser usada não só para acionar um relé, mas também para mandar um SMS, disparar um alarme ou executar qualquer outra ação que você desejar.
O circuito funciona da seguinte maneira: você ajusta a temperatura de acionamento utilizando 2 botôes, e quando a temperatura ambiente atingir o valor da temperatura máxima ajustada, ele aciona uma porta do Arduino configurada no programa.
Circuito Arduino e DHT11 com relé
Esse circuito utiliza componentes comuns que provavelmente você já tem ou são fáceis de encontrar. Para o circuito deste post vamos utilizar a seguinte lista de material:
- Arduino Uno
- Módulo relé 1 canal
- Display Oled com conexão I2C
- Sensor de temperatura DHT11
- 2 botões tipo push-button
- 2 resistores de 330 ohms
Com alguns ajustes na programação, você pode adaptar o circuito para utilizar por exemplo um LCD 16×2, ou adicionar um led na porta de saída do circuito, se quiser apenas testar o funcionamento.
No circuito abaixo, eu montei uma configuração que aciona um relé, que por sua vez liga uma lâmpada conectada à rede elétrica. A lâmpada está ligada aos conectores C (comum) e NO (Normal Aberto) do relé.
O display Oled funciona com 5V, e se comunica com o Arduino por meio dos pinos A4 (SDA) e A5 (SCL), da interface I2C.
Os dois resistores ligados aos botões tem a função de “pull-down”, e o módulo relé de 1 canal é acionado pelo sinal de 5V do Arduino. Mais detalhes sobre a configuração e uso do sensor de temperatura DHT11 você encontra nesse post.
Programa controle de relé por temperatura
O programa de controle do circuito utiliza as bibliotecas U8Glib (download) para controle do display Oled, e também a biblioteca DHT (download), para utilização com o sensor de temperatura. Essa biblioteca funciona tanto para o DHT11 como para o DHT22.
O programa faz a leitura do sensor de temperatura à cada 2 segundos utilizando a função millis() ao invés da função delay(), assim o programa fica “livre” para verificar se algum botão foi pressionado e ajustar o valor da temperatura máxima, que é mostrada no lado direito da tela.
//Programa: Arduino e DHT11 controle de rele por temperatura //Autor: Arduino e Cia #include "U8glib.h" #include <DHT.h> U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); int posicao = 0; int temp_max = 20; #define pino_aumenta 5 #define pino_diminui 4 #define pino_rele 7 #define pino_DHT A0 #define DHTTYPE DHT11 DHT dht(pino_DHT, DHTTYPE); int temperatura; int aumenta, diminui; unsigned long previousMillis = 0; //Intervalo de medicao temperatura const long interval = 2000; void draw() { //Retangulo temperatura atual u8g.drawRFrame(0, 17, 84, 46, 2); u8g.setFont(u8g_font_fub20); //Atualiza a temperatura no display u8g.setPrintPos(13, 50); u8g.print(temperatura); //Circulo grau u8g.drawCircle(51, 33, 3); u8g.drawStr( 56, 50, "C"); //Box superior amarelo u8g.setFont(u8g_font_8x13B); u8g.drawRBox(0, 0, 127, 16, 2); u8g.setColorIndex(0); u8g.drawStr( 21, 13, "TEMPERATURA"); u8g.setColorIndex(1); //box temperatura maxima u8g.drawRFrame(86, 17, 42, 46, 2); if (temp_max <= temperatura) { //Temperatura maior do que a temp. maxima u8g.drawRBox(86, 17, 42, 22, 2); u8g.setColorIndex(0); u8g.drawStr(96, 33, "MAX"); u8g.setColorIndex(1); //Aciona saida do rele digitalWrite(pino_rele, HIGH); } else { //Temperatura menor do que a temp. maxima u8g.drawRFrame(86, 17, 42, 22, 2); u8g.drawStr(96, 33, "MAX"); //Desliga saida do rele digitalWrite(pino_rele, LOW); } //Atualiza na tela o valor da temp. maxima u8g.setPrintPos(100, 55); u8g.print(temp_max); u8g.drawCircle(120, 47, 2); u8g.setColorIndex(1); } void setup(void) { Serial.begin(9600); pinMode(pino_rele, OUTPUT); pinMode(pino_aumenta, INPUT); pinMode(pino_diminui, INPUT); dht.begin(); } void loop(void) { unsigned long currentMillis = millis(); //Timer para ler o valor da temperatura if (currentMillis - previousMillis >= interval) { temperatura = dht.readTemperature(); previousMillis = currentMillis; } //Testa botao aumenta temperatura aumenta = digitalRead(pino_aumenta); if (aumenta == 1) {temp_max++;} while (digitalRead(pino_aumenta) == 1) {delay(10);} //testa botao diminui temperatura diminui = digitalRead(pino_diminui); if (diminui == 1) {temp_max--;} while (digitalRead(pino_diminui) == 1) {delay(10);} u8g.firstPage(); // Chama a rotina de desenho na tela do { draw(); } while ( u8g.nextPage() ); delay(50); }
Com os botões você aumenta (botão direito) ou diminui (botão esquerdo) o valor da temperatura que vai acionar a saída digital 9. O tempo de atualização da leitura do sensor pode ser alterado na linha 25, lembrando que o valor mínimo recomendado para o DHT11 é de 2 segundos.
Para ver o vídeo deste circuito em funcionamento, clique aqui!
Esse blog é bom demais!
🙂 Valeu. Abraço!
Adilson
Alguém foi um pouco além para controlar também a humidade?
Site que venda o valor, das peças barato.
Boa noite,
Recomendo a FILIPEFLOP: http://www.filipeflop.com
Abraço!
Boa tarde você sabe me dizer colo ligo um (Painel Lcd Impressora 3d Display Controlador Lcd Reprap ) aquele com display e cartão de memoria ligado no ramps 1.4 queria ligar no Arduíno uno direto sendo que já ocupo os pinos 2,3,4,5,6,7 para controle dos eixos é possível de se fazer.
boa tarde.
Consegue passar e linha de codigo para ligar um display 16×2 ao inves desse l2c… obrigado
Boa tarde!
Qual programa você utiliza para fazer o desenho do esquema eletronico do projeto?
Oi Eduardo,
Eu uso o Fritzing.
Abraço!
Bom dia tbm?Tem como trocar o sensor por um ds18b20?Se sim tem como vc.me dar uma dica?Obrigado…
Boa noite,
Tem sim, dê uma olhada nesse post aqui, e veja se você consegue incluir o DS18B20 no projeto do controle de relé por temperatura:
http://www.arduinoecia.com.br/2013/04/sensor-de-temperatura-ds18b20-arduino.html
Abraço!
Posso trocar o sensor de temperatura DHT11 por Sensor de Temperatura DS18B20 tem que mudar algum código?
Boa tarde,
Pode sim, mas vc terá que mudar algumas coisas pq os sensores usam bibliotecas diferentes.
Abraço!
ola pode me passar qual seria esta alteração pois sou iniciante no arduino pode me ajudar obrigado
boa tarde, tem como deixar seu email para falarmos sobre o projeto. OBRIGADO
Boa tarde,
Utilize o formulário de contato no lado direito da página. Conversamos por email.
Abraço!
Vc conseguiu fazer com ds18b20
Olá amigo…gostaria de tirar algumas duvidas…para que eu possa deixar o display da mesma forma que esta na imagem acima, sem a parte que mostra a Temperatura max que seria o set point…eu consigo..? É o seguinte…quero montar o display somente para monitorar a temperatura que quero controlar esta temperatura via android…isso seria facil com esse display..???
Olá amigo…gostaria de tirar algumas duvidas…para que eu possa deixar o display da mesma forma que esta na imagem acima, sem a parte que mostra a Temperatura max que seria o set point…eu consigo..? É o seguinte…quero montar o display somente para monitorar a temperatura que quero controlar esta temperatura via android…isso seria facil com esse display..???
Parabéns… Você teria uma solução parecida porém rodando em um Webserver ?
Amigo saberia me dizer o porque deste erro??
Arduino: 1.6.12 (Windows Server 2012 R2), Placa:"Arduino/Genuino Uno"
C:UsersAdministratorDocumentsArduino_ProjetosDisplay Oled DHT11 com relétesttest.ino:6:29: fatal error: Adafruit_Sensor.h: No such file or directory
compilation terminated.
exit status 1
Erro compilando para a placa Arduino/Genuino Uno
Este relatório teria mais informações com
"Mostrar a saida detalhada durante a compilação"
opção pode ser ativada em "Arquivo -> Preferências"
Só baixar essa biblioteca e adiciona-la ao arduino :
https://github.com/adafruit/Adafruit_Sensor
olá amigo, gostaria de saber como faço para adicionar um Lcd 16 x 2.
Boa tarde,
Ótima sugestão. Vou ver se providencio uma nova versão deste post. 🙂
Abraço!
Adilson
Olá boa noite. Conseguiu incluir o LCD 16X2?
Já há um tutorial utilizando o LCD 16X2?
sabe dizer se tem como utrilizar essa biblioteca mais com o ds3231..
Bom dia,
Para o DS3231, recomendo este post aqui:
http://www.arduinoecia.com.br/2015/12/relogio-arduino-display-128×64-rtc-ds3231.html
Abraço!
Adilson
como faço para funcionar com o LCD 16×2 com IC2
??
Adorei seu Blog, sou especialista em Protocolos e estou desenvolvendo um Mainstream REST para Dispositivos Arduino, caso queira ajudar sua experiencia sera muito bem vinda, totalmente Free, já tenho o pacote de componentes para Delphi e Lazarus e quero fazer isso no Arduino para automação RESIDENCIAL/INDUSTRIAL.
https://sourceforge.net/projects/rest-dataware-componentes/
Meus componentes REST e como o Arduino tem inet e metodos GET e POST
tenho tudo que preciso para brincar a vontade com ele.
Já comprei vários materiais para a empreitada temos um grupo legal de programadores e seria legal contar contigo.
meu skype é : [email protected]
nosso grupo de desenvolvimento no skype é : https://join.skype.com/wabizUTgS0Oh
Boa noite!
Adicionado ao skype. Abraço e obrigado! 🙂
Adilson
Bom dia, tem como substituir o display oled pelo display lcd 16×2 nesse exemplo acima e adicionar um modulo ethernet shield win5100. Pode me ajudar
bom dia amigo. com este projeto consigo fazer com q ele leia temperaturas abaixo de zero? preciso controla temperatura de uma chopeira. sabê me dizer se este projeto resolveria meu problema? dês de já agradeço
Bom dia,
Consegue sim, mas acho que no seu caso um sensor DS18B20 seria mais adequado. Existe inclusive uma versão à prova dágua. Dê uma olhada neste link para mais informações, por favor:
https://www.arduinoecia.com.br/2013/04/sensor-de-temperatura-ds18b20-arduino.html
Abraço!
Adilson
Bom Dia,
Porque razão onde está o valor da Temp Máxima se comporta como um contador, e dificilmente consigo ajustar, o meu interesse era ligar um relé quando a temperatura está abaixo digamos de 15 graus e desligar o rele quando atinja 20 graus, mas que possa ajustar, se me puder responder agradecia imenso
Bom dia! Teria como usar um sensor analógico NTC-3950? Seria possível trabalhar com temperaturas negativas, por exemplo -20ºC, estou tentando um projeto para refrigeração, se puder ajudar desde já agradeço.
Oi Leonardo,
Usando um termistor, né? Sim, é possível. Segundo um datasheet que eu achei ele vai de -40 a +125 graus.
Abraço!
Adilson
ola bom dia tenho uma duvida como faço para acionar um relé a temp chegar a 28 c depois quando a temp chegar a 25 desarma o primeiro relé e aciona um segundo relé?
Olá, esse tutorial foi muito bom, parabéns, mas esta acontecendo do visor que to usando travar, você acha que isso pode ser problema no visor ou algo no programa? O que to usando tem apenas a cor branca.
Oi Bruno!
Estranho. Você já tentou ver se não é algum problema de alimentação insuficiente do Arduino? Se puder, tente usar com uma fonte externa.
Abraço!
Adilson
Boa noite, amigo eu consigo fazer um controlador de temperatura utilizando um temopar? Preciso que chegue a 500 graus.
Bom dia,
Consegue sim. O princípio é o mesmo. 😉
Abraço!
Adilson
Olá, seria possível ligar um huzaah feather – ESP8266 e alterar a temperatura para ligar ou desligar o relê por um programa como Cayenne ou Outro programa, de preferência compatível com IOS
bom dia, e se por um acaso eu for usar o display OLED colorido, tem alguma modificação que eu precise fazer? pois o código não deu certo e apareceu um erro (#include "U8glib.h") e eu pesquisei, mas não achei nenhum jeito de corrigir esse erro, oque eu devo fazer?
Boa noite,
Pelo jeito você está indo no caminho certo. Só falta instalar a biblioteca U8glib. Você pode fazer isso dentro da IDE do Arduino, em Sketch -> Incluir biblioteca -> Gerenciar Bibliotecas e ali dentro procurar por U8Glib.
Abraço!
Adilson
obg por tudo
bom dia, eu queria saber oque eu faço se o display não ligar?
Bom dia,
Depende, o que acontece exatamente?
Abraço!
Adilson
Ola boa noite, estou tendo um problema na hora de carregar o programa para o arduino, aparece um erro dizendo "O sistema não pode encontrar o arquivo especificado" mesmo tendo as bibliotecas instaladas em meu computador oque devo fazer para corrigir este erro?
Oi Gustavo,
Realmente parece ser algum problema com a biblioteca escolhida. Você fez exatamente como está no post?
Abraço!
Adilson
Oi tudo bem? Legal o projeto, obrigado. Você sabe se tem risco de ficar acionado o relé o tempo todo por limiar de temperatura? Como posso diminuir essa sensibilidade? Apenas no intervalo de tempo de leitura da temperatura?
Obrigado!
Oi Rafael!
Você pode modificar o programa para deixar o relé acionado no tempo que você precisar. Outra opção é usar a saída normal fechada (NC) para deixar o relé sempre acionado. Quanto a deixar o mesmo acionado por um longo tempo, não vejo problemas. É feito pra isso. 🙂
Abraço!
Adilson
Boa tarde, essa confugyração serve para ligar um ventilador quando for detectada determinada temperatura ?
Oi Marcos,
Serve sim, você pode simplesmente ligar o relé quando atingir a temperatura desejada.
Abraço!
Adilson
Olá…boa tarde…gostei mto das dicas apresentadas em geral…
gostaria de saber se para esse controle de temperarura ao invés de utilizar o sensor DHT11 eu poderia usar o sensor LM35.
se puder me dar uma dica como posso alterar o programa para esse sensor fico mto garto…
Oi Paulo!
É possível sim. Dê uma olhada nos meus posts sobre LM35, creio que você vai conseguir fazer essa alteração.
Abraço!
Adilson
Many thanks for the excellent project.
Is it possible to share the code for ESP8266.
Thanks in advance.
Hi Dave!
Please check this link: https://www.arduinoecia.com.br/termometro-iot-com-esp8266-dht11-oled/
Best regards!
Adilson
Hallo, wie kann man eine Hysterese einfügen?
Hallo!
Ja, das Hinzufügen von Hysterese kann nützlich sein. Ich werde eine aktuellere Version des Programms überprüfen.
Schöne Grüße!
Adilson
Olá, boa tarde!
Neste projeto como faço para enviar um alarme por SMS quando a temperatura do sensor, por exemplo, chegar a 20ºC?
Obrigado desde já!
Que versão do Fritzing você utiliza?
Oi Luis,
0.9.3
Adilson
Obr
Para colocar esse display vc colocou uma biblioteca no Fritzing, poderia me passar?
Já consegui obr
Para colocar um dht22 no lugar do dht11 precisa mudar o resistor?
Oi Luis,
Recomendo usar um resistor entre 4.7K e 10K como pull up para o DHT22.
Abraço!
Adilson
Então no lugar dos dois de 330 entrariam 2 de até 10 k ?
Oi Luis,
Não, esses são os dos botões. Vc tem que adicionar o resistor de 10K para o DHT22. Coloque o resistor conectando o pino “DATA” no pino “VCC”.
Abraço!
Adilson
Supondo que o relé ative quando bater 25 graus, ele vai desligar quando tiver menos de 25? Ou ele vai continuar ligado?
Bom dia Luis,
Vai desligar.
Adilson
O tempo de atualização da leitura mínimo do dht 11 é de 2 segundos, vc saberia dizer qual o do lm35?
No projeto vc usou o push button momentâneo é esse msm?
Oi Luis,
Exato. Push button momentâneo.
Abraço!
Adilson
Fiz modificações no codigo para colocar um lm35 poderia ver se está correto?
#include “U8glib.h”
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
int posicao = 0;
int temp_max = 20;
#define pino_aumenta 5
#define pino_diminui 4
#define pino_rele 7
#define pino_lm35 A0 //Pino o qual o sensor está conectado
int temperatura;
int aumenta, diminui;
unsigned long previousMillis = 0;
//Intervalo de medicao temperatura
const long interval = 2000;
void draw()
{
//Retangulo temperatura atual
u8g.drawRFrame(0, 17, 84, 46, 2);
u8g.setFont(u8g_font_fub20);
//Atualiza a temperatura no display
u8g.setPrintPos(13, 50);
u8g.print(temperatura);
//Circulo grau
u8g.drawCircle(51, 33, 3);
u8g.drawStr( 56, 50, “C”);
//Box superior amarelo
u8g.setFont(u8g_font_8x13B);
u8g.drawRBox(0, 0, 127, 16, 2);
u8g.setColorIndex(0);
u8g.drawStr( 21, 13, “TEMPERATURA”);
u8g.setColorIndex(1);
//box temperatura maxima
u8g.drawRFrame(86, 17, 42, 46, 2);
if (temp_max = interval)
{
float valor_analog_lm35 = float(analogRead(pin_lm35)); // Obtém o valor analógico que varia de 0 a 1023
float tensao = (valor_analog_lm35 * 5) / 1023; // Vamos converter esse valor para tensão elétrica
float temperatura = tensao / 0.010; // dividimos a tensão por 0.010 que representa os 10 mV
Serial.print(“A temperatura eh “);
Serial.println(temperatura); // Mostra na serial a temperatura do sensor
previousMillis = currentMillis;
}
//Testa botao aumenta temperatura
aumenta = digitalRead(pino_aumenta);
if (aumenta == 1)
{temp_max++;}
while (digitalRead(pino_aumenta) == 1)
{delay(10);}
//testa botao diminui temperatura
diminui = digitalRead(pino_diminui);
if (diminui == 1)
{temp_max–;}
while (digitalRead(pino_diminui) == 1)
{delay(10);}
u8g.firstPage();
// Chama a rotina de desenho na tela
do
{
draw();
}
while ( u8g.nextPage() );
delay(50);
}
Me ajudaria muito pois estou fazendo esse projeto para tcc