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.

Arduino e DHT11 controle de rele por temperatura

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:

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é.

Arduino e DHT controle de relé por temperatura

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.

Detalhe circuito Oled e DHT11

Para ver o vídeo deste circuito em funcionamento, clique aqui!

5/5 - (3 votos)