0

Como fazer uma Casa Inteligente com Arduino – SmartHome (Parte 9/9)

Projeto Final

/********Declaração de todas as librarias********/
  #include <Wire.h>
  #include <LiquidCrystal_I2C.h>
  #include <dht.h>
/*********Definição dos pinos dos componentes**********/

//sensor de gás
  #define MQ_analog A2
  #define MQ_dig 7

// enderço/protocolo do RTC
  #define DS1307_ADDRESS 0x68

//DHT-11 (sensor de humidade e temperatura)
  #define dht_dpin A1 //Pino DATA do Sensor ligado na porta Analogica A1

//LDR
  int ldr_Pin = A0; //LDR no pino analógico 0
  int ldr_Valor = 0; //Valor lido do LDR
  int leitura = 0;
  int value = 0;

//LEDS
  int led_1 = 3; //Led no pino 2
  int led_2 =5;  //Led no pino 5
  int led_3 = 6; //Led no pino 6
  int led_red = 9;
  int led_green = 10;
  int led_blue = 11;
  
  //Buzzer
  int buzzer = 8;
  
/*******Declaração das variáveis e constantes*******/
  int valor_analog;
  int valor_dig;
  const int chipSelect = 4;
  int a = 0;
  
/*******Inicialização de todos os sensores******/
//LCD
  LiquidCrystal_I2C lcd(0x3f,2,1,0,4,5,6,7,3, POSITIVE);
  
  byte zero = 0x00;

//DHT-11 (sensor de humidade e temperatura)
  dht DHT; 
  
//função millis
long previousMillis = 0;        // Variável de controlo do tempo
long serialinterval= 2000;    // Tempo em ms do intervalo a ser executado

  
 void setup() 
 {  
   Wire.begin();;
   Serial.begin(9600);
   lcd.begin(16, 2); // Define o LCD com 16 colunas e 2 linhas
 
  // A linha abaixo pode ser comentada/retirada depois de defenir a data e hora
  SelecionaDataeHora();

   pinMode(MQ_dig, INPUT);
   pinMode(led_1,OUTPUT); 
   pinMode(led_2,OUTPUT); 
   pinMode(led_3,OUTPUT); 
   pinMode(led_red,OUTPUT);
   pinMode(led_green,OUTPUT);
   pinMode(led_blue,OUTPUT);
   pinMode(buzzer,OUTPUT);
   
   digitalWrite(buzzer, LOW);
   digitalWrite(led_red, HIGH);
   digitalWrite(led_green, HIGH);
   digitalWrite(led_blue, HIGH);
}

  void loop ()
  {
    bluetooth ();
    
    sensorGAS();
   
    rtc();
    
  
    ldr();  
   
   
    dHt();
    
    lcd.setCursor(0,1);
       lcd.print("Hum:");
       lcd.print(DHT.humidity);
       lcd.print("%");
       lcd.print(" Temp:");
       lcd.print(DHT.temperature);
       delay(1000); 
   }


  void SelecionaDataeHora()   //Define a data e a hora do DS1307 
{
  byte segundos = 00; //Valores de 0 a 59
  byte minutos = 00; //Valores de 0 a 59
  byte horas = 15; //Valores de 0 a 23
  byte diadasemana = 5; //Valores de 0 a 6 ( 0=Domingo, 1 = Segunda, etc.) 
  byte diadomes = 15; //Valores de 1 a 31
  byte mes = 11; //Valores de 1 a 12
  byte ano = 18; //Valores de 0 a 99
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados

  /*As linhas abaixo escrevem no CI os valores de 
  data e hora que foram colocados nas variaveis acima*/
  Wire.write(ConverteParaBCD(segundos));
  Wire.write(ConverteParaBCD(minutos));
  Wire.write(ConverteParaBCD(horas));
  Wire.write(ConverteParaBCD(diadasemana));
  Wire.write(ConverteParaBCD(diadomes));
  Wire.write(ConverteParaBCD(mes));
  Wire.write(ConverteParaBCD(ano));
  Wire.write(zero);
  Wire.endTransmission(); 
}

byte ConverteParaBCD(byte val)
{ 
  //Converte o número de decimal para BCD
  return ( (val/10*16) + (val%10) );
}

byte ConverteparaDecimal(byte val)  
{ 
  //Converte de BCD para decimal
  return ( (val/16*10) + (val%16) );
} 

  
void sensorGAS ()
{ 
     boolean valor_dig = digitalRead(MQ_dig);
     
      if(valor_dig == 0)
      {
       Serial.println("GAS DETECTADO !!!");
        }
       else
       {
        Serial.print("GAS NÃO DETECTADO !!!");
        Serial.println();
       }
        
      valor_analog = analogRead(MQ_analog);
      
      if(valor_analog>=250 & valor_analog<=499)
      {
        digitalWrite(buzzer,HIGH);
        analogWrite(led_red,28); /*utilizamos o comando analogWrite para 
        tornar possível variar a intensidade de cada pino do led de forma a 
        permitir escolher a intensidade da cor a apresentar*/
        analogWrite(led_green,198);
        delay(1000);
        digitalWrite(led_red,HIGH);
        digitalWrite(led_green,HIGH);
        digitalWrite(buzzer,LOW);
        delay(100);
        
      }
        
      else
        {
        digitalWrite(buzzer,LOW);
        digitalWrite(led_red,HIGH);
          }
          
     if(valor_analog >=500)
      {
        digitalWrite(buzzer,HIGH);
        digitalWrite(led_red,LOW);
        delay(1000);
        digitalWrite(led_red,HIGH);
        digitalWrite(buzzer,LOW);
        delay(100);
        
      }
        
      else
        {
        digitalWrite(buzzer,LOW);
        digitalWrite(led_red,HIGH);
          }
          
       valor_analog = analogRead(MQ_analog);
       Serial.print("Qualidade do ar: ");
       Serial.print(valor_analog);
       Serial.println();
}

void rtc ()
{
   Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
  int segundos = ConverteparaDecimal(Wire.read());
  int minutos = ConverteparaDecimal(Wire.read());
  int horas = ConverteparaDecimal(Wire.read() & 0b111111);
  int diadasemana = ConverteparaDecimal(Wire.read()); 
  int diadomes = ConverteparaDecimal(Wire.read());
  int mes = ConverteparaDecimal(Wire.read());
  int ano = ConverteparaDecimal(Wire.read());

  // Mostra os dados no display
  lcd.setCursor(0,0);
  lcd.print("Horas:");
  // Acrescenta o 0 (zero) se a hora for menor do que 10
  if (horas <10)
    lcd.print("0");
  lcd.print(horas);
  lcd.print(":");
  // Acrescenta o 0 (zero) se minutos for menor do que 10
  if (minutos < 10)
     lcd.print("0");
  lcd.print(minutos);
  lcd.print(":");
  if (segundos<10)
  {
    lcd.print("0");
  }
  lcd.print(segundos);
  }
  
void ldr()
{
if(a ==0)
  { 
 
 ///ler o valor do LDR
leitura = analogRead(ldr_Pin);
  value = analogRead(ldr_Pin);
  value = constrain(value,190,760);
  value = map(value,190,760,0,255);

  Serial.print("luminosidade: ");
  Serial.print(value);
  analogWrite(led_1, value);
  analogWrite(led_3, value);
 }
}

 void dHt()
 {
   DHT.read11(dht_dpin); //Lê as informações do sensor
      Serial.println();
      Serial.print("Hum:");
      Serial.print(DHT.humidity);
      Serial.print("%");
      Serial.print(" Temp:");
      Serial.print(DHT.temperature); 
      Serial.println(" º ");
      Serial.println ("");
  
      
  }

 void bluetooth()
 {


  if(Serial.available())
    {
       /*utilizamos a função millis para tornar possível a apresentação 
       dos dados dos diversos sensores no smartphone em intervalos de 
       tempo maiores*/
       unsigned long currentMillis = millis();    //Tempo atual em ms

      if (currentMillis - previousMillis > serialinterval) { 
      previousMillis = currentMillis;    // Salva o tempo atual

     Serial.print("Luminosidade: ");
     Serial.println(ldr_Valor);
     Serial.print("Humidade: ");
     Serial.println(DHT.humidity);
     Serial.print("Temperatura: ");
     Serial.println(DHT.temperature);
      }

     char caracter = Serial.read();
          switch (caracter) 
          {
            case '1': 
                    digitalWrite(led_1, HIGH);
                    delay(1000);
            break;
            
             case '2': 
                    digitalWrite(led_2, HIGH);
                    delay(1000);
            break; 
            
             case '3': 
                    digitalWrite(led_3, HIGH);
                    delay(1000);
            break;
            
             case '4': 
                    digitalWrite(led_1, LOW);
                    delay(1000);
            break;
            
            case '5': 
                    digitalWrite(led_2, LOW);
                    delay(1000);
            break;
            
             case '6': 
                    digitalWrite(led_3, LOW);
                    delay(1000);
            break;
            
             case 'a': 
                      a = 1;
                      digitalWrite(led_1, HIGH);
                      digitalWrite(led_2, HIGH);
                      digitalWrite(led_3, HIGH);
                      
            break;
            
             case 's': digitalWrite(led_1, LOW);
                      digitalWrite(led_2, LOW);
                      digitalWrite(led_3, LOW) ;   
                      a = 0;
            break;
          }
    }
 }

Lista de Material:

Todos os produtos foram adquiridos na loja de eletrónica e robótica ElectroFun: www.electrofun.pt.

Outros produtos que possam ser úteis:

 

Todos os produtos utilizados neste artigo podem ser encontrados na Loja de Eletrónica e Robótica – ElectroFun.

Gostaram deste artigo? Deixem o vosso comentário no formulário a baixo e partilhem com os vossos amigos.

Não se esqueçam de fazer like na nossa Página no Facebook.

Podem ainda colocar as vossas dúvidas no nosso Forum da Comunidade Arduino em Portugal ou no nosso Grupo no Facebook Arduino Portugal – Qual o teu projeto?   “

 

SUBSCREVA A NOSSA NEWSLETTER PARA NÃO PERDER O PRÓXIMO ARTIGO!

Comments

Comentários

ArduinoPortugal.pt

Deixar uma resposta

Este site utiliza o Akismet para reduzir spam. Fica a saber como são processados os dados dos comentários.