13 junho 2016

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.

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:
  • 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 16x2, 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. 

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//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!

11 comentários:

  1. Alguém foi um pouco além para controlar também a humidade?

    ResponderExcluir
  2. Site que venda o valor, das peças barato.

    ResponderExcluir
    Respostas
    1. Boa noite,

      Recomendo a FILIPEFLOP: www.filipeflop.com

      Abraço!

      Excluir
  3. 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.

    ResponderExcluir
  4. boa tarde.
    Consegue passar e linha de codigo para ligar um display 16x2 ao inves desse l2c... obrigado

    ResponderExcluir
  5. Boa tarde!
    Qual programa você utiliza para fazer o desenho do esquema eletronico do projeto?

    ResponderExcluir
  6. Bom dia tbm?Tem como trocar o sensor por um ds18b20?Se sim tem como vc.me dar uma dica?Obrigado...

    ResponderExcluir
    Respostas
    1. 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!

      Excluir