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!