<
*

Ivanov

  • Allahu Akbar
  • *****
  • 72
  • 2
  • Zhokhov
    • Ver perfil
Como fazer uma Casa Inteligente com Arduino – SmartHome (Parte 9/9)
« Online: Setembro 24, 2019, 10:05:54 am »
Como fazer uma Casa Inteligente com Arduino – SmartHome (Parte 9/9)

Projeto Final

/********Declaração de todas as librarias********/
  #include 
  #include 
  #include 
/*********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:

« Última modificação: Setembro 24, 2019, 10:12:42 am por Abaas »