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!

