segunda-feira, 28 de julho de 2014

Juntando tudo - projeto de acionamento automático de ar condicionado

Olá pessoal,

Hoje vamos ver a integração de todos os componentes que já vimos para implementar o projeto de acionamento automático de ar condicionado. É importante frisar que foram adicionados componentes ao projeto que não foram pensados anteriormente e que vão acrescentar mais algumas funcionalidades. No projeto original estavam previstos os componentes conforme relatei em post anterior: Projeto 1 - Acionamento de ar condicionado via infravermelho. Adicionei mais dois componentes: o Tiny RTC DS1307 e o alto-falante.

Esquema de ligação:



O esquema de ligação acima não aparece os pinos de ligação de cada componente mas segui o mesmo padrão que coloquei nos posts sobre cada um dos componentes. É só seguir as ligações de cada componente apresentado.

O sketch:

Segue abaixo sketch com comentários:


#include<dht11.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <IRremote.h>
#include <SPI.h>
#include <Ethernet.h>
#include <String.h>
#include "RTClib.h"

// Objeto irsend para emissor infrared 
IRsend irsend;

// Objeto rtc (relogio de tempo real)
RTC_DS1307 rtc;

//codigo rawcode capturado do ar condiconado via IRRecvDump
unsigned int rawCode[92] = {8950,4300,650,500,700,450,650,1600,650,500,600,1650,700,450,650,500,650,500,650,450,600,1700,600,550,550,550,600,1700,600,500,600,550,600,550,600,550,600,500,700,450,600,550,600,550,600,500,600,550,600,550,600,550,550,550,600,550,600,550,600,550,550,550,600,550,600,550,600,500,600,550,650,500,600,550,600,500,600,550,600,550,600,550,550,1700,600,550,600,550,550,1700,700};

float sinVal;
int toneVal;

// Objeto LCD com 2 linhas e 16 caracteres por linha
LiquidCrystal_I2C lcd(0x20,16,2);  

//objeto sensor para DHT11 (sensor de temperatura)
dht11 sensor;

void setup() {
    Serial.begin(9600);  // Inicia conexao serial para monitoramento
    lcd.begin(16,2);          // inicializa o lcd 
    lcd.backlight();
    pinMode(8,OUTPUT);  //pino 8 para saida do alto falante
    #ifdef AVR
        Wire.begin();
    #else
        Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
    #endif
  
    rtc.begin();  //inicia o objeto rtc

    //Verifica se o RTC esta funcionando
    if (! rtc.isrunning()) {
       Serial.println("RTC is NOT running!");
       // Ajusta o rtc para a data e hora em que o sketch foi compilado
    }

}

void loop() {
    DateTime now = rtc.now(); // carrega a data e hora do RTC
    
    Serial.print("Lendo sensor: ");
    int chk = sensor.read(2);  //le a temperatura
    //Verifica o status do DHT11
    switch(chk) {
        case DHTLIB_OK:
            Serial.println("OK");
            break;
        case DHTLIB_ERROR_CHECKSUM:
            Serial.println("Erro no checksum");
            break;
        case DHTLIB_ERROR_TIMEOUT:
            Serial.println("Tempo esgotado");
            break;
        default:
            Serial.println("Erro desconhecido");
    }
    // Monitora a umidade e temperatura para a conexao serial
    Serial.print("Umidade (%): ");
    Serial.println(sensor.humidity);
    Serial.print("Temperatura (graus Celsius): ");
    Serial.println(sensor.temperature);
    
    // Carrega os valores de temperatura e umidade do sensor nas variaveis correspondentes
    int menorValorTemp = sensor.temperature;  
    int valorUmidade = sensor.humidity;  
    
    //Se a temperatura for maior que 26 graus Celsius
    if (menorValorTemp > 21) {
      
          // Exibe o valor da temperatura lida pelo sensor
          lcd.clear();  //limpa o display do LCD.     
          lcd.print("Temp: ");  //imprime a string no display do LCD.                 
          lcd.print(menorValorTemp); // imprime a temperatura no LCD
          lcd.write(B11011111); //Simbolo de graus celsius
          lcd.print("C");
          lcd.setCursor(0,1);  //posiciona o cursor na coluna 0 linha 1 do LCD.
          lcd.print("TEMP. ALTA!"); //Imprime a string no display do LCD.
         
          //Envia sinal sonoro para o pino 8 - alto falante
          for (int x=0; x<180; x++) {
            // converte graus para radianos e depois obtem o valor do seno
            sinVal = (sin(x*(3.1416/180)));
            toneVal = 2000+(int(sinVal*1000));
            tone(8, toneVal);
            delay(2);
          }
         
         // Aciona o ar condicionado novamente 
         irsend.sendRaw(rawCode,92,38);  // envia o codigo IR para ligar o AC     
         //Aguarda 5 minutos para enviar novamente o codigo IR caso a temperatura nao baixe
         delay(60000);          
    }
    else
    { 
          // Temperatura normal  
          lcd.clear();  //limpa o display do LCD.     
          lcd.print("Temp: ");  //imprime a string no display do LCD.                 
          lcd.print(menorValorTemp); // Imprime o valor da temperatura
          lcd.write(B11011111); //Simbolo de graus celsius
          lcd.print("C");
          //Exibindo valor da leitura da umidade no display LCD.
          lcd.setCursor(0,1);  //posiciona o cursor na coluna 0 linha 1 do LCD.
          lcd.print("Umidade: ");  //imprime a string no display do LCD.       
          lcd.print(valorUmidade); // Imprime o valor da umidade
          lcd.print("%");
          delay(5000);
          
          //Exibe a data e hora no LCD
          lcd.clear();
          lcd.print("DATA: ");
          lcd.print(now.day(), DEC);
          lcd.print('/');
          lcd.print(now.month(), DEC);
          lcd.print('/');
          lcd.print(now.year(), DEC);
          lcd.setCursor(0,1);
          lcd.print("HORA: ");
          lcd.print(now.hour(), DEC);
          lcd.print(':');
          lcd.print(now.minute(), DEC);
          lcd.print(':');
          lcd.print(now.second(), DEC);
          delay(2000);
          noTone(8);
    
    }
  
  delay(2000);
}



Acabei incluindo o RTC por conta de poder registrar data e hora dos acionamentos em um cartão SD ou qualquer coisa parecida. O alto-falante será para emitir alerta sonoro caso a temperatura aumente. Bom pessoal, esta é a primeira versão do projeto. Funcionou muito bem porém os componentes estão não estão acomodados apropriadamente e precisamos pensar em colocá-los em um painel ou caixa. Vamos ver isso no próximo post.

Até mais!





2 comentários: