#include <LiquidCrystal.h> // Inclui a biblioteca para controle do display LCD.
#include <DHT.h> // Inclui a biblioteca para usar o sensor de temperatura e umidade DHT.
#define DHTPIN 3 // Define o pino 3 como o pino de conexão do sensor DHT.
#define DHTTYPE DHT22 // Define o tipo do sensor como DHT22.
DHT dht(DHTPIN, DHTTYPE); // Inicializa o sensor DHT no pino 3 com o tipo DHT22.
int modo = 1; // Variável para armazenar o modo (1 para automático, 0 para manual).
int msg = 1; // Variável para controlar a exibição de mensagens no LCD.
LiquidCrystal lcd(30, 32, 34, 36, 38, 40, 42);
// Inicializa o display LCD com os pinos conectados: RS, E, D4, D5, D6, D7.
void setup() {
// Configuração inicial do programa. Executada apenas uma vez.
pinMode(7, OUTPUT); // Configura o pino 7 como saída para LED verde.
pinMode(6, OUTPUT); // Configura o pino 6 como saída para LED vermelho.
pinMode(5, OUTPUT); // Configura o pino 5 como saída para LED azul.
pinMode(22, OUTPUT); // Configura o pino 22 como saída para relé.
pinMode(12, OUTPUT); // Configura o pino 12 como saída para o buzzer.
pinMode(10, OUTPUT); // Configura o pino 10 como saída para o TRIG do sensor ultrassônico.
pinMode(9, INPUT); // Configura o pino 9 como entrada para o ECHO do sensor ultrassônico.
pinMode(13, INPUT_PULLUP); // Configura o pino 13 como entrada com resistor pull-up para o botão.
Serial.begin(9600); // Inicia a comunicação serial a 9600 bps.
lcd.begin(16, 2); // Inicializa o LCD com 16 colunas e 2 linhas.
dht.begin(); // Inicializa o sensor DHT.
}
void loop() {
// Loop principal do programa. Executado continuamente.
if(digitalRead(13) == 0) {
// Verifica se o botão foi pressionado (lógica invertida por pull-up).
if(modo == 1) {
modo = 0; // Alterna para modo manual.
msg = 1; // Solicita exibição de mensagem no LCD.
} else {
modo = 1; // Alterna para modo automático.
msg = 1; // Solicita exibição de mensagem no LCD.
}
}
if(modo == 1) {
// Executa o modo automático.
if(msg == 1) {
lcd.clear(); // Limpa o display LCD.
lcd.setCursor(0,0); // Move o cursor para a posição inicial.
lcd.print("Modo Automatico"); // Exibe mensagem.
delay(2000); // Aguarda 2 segundos.
msg = 0; // Reseta o flag de mensagem.
}
digitalWrite(10, LOW); // Garante que o pino TRIG do ultrassônico está em nível baixo.
delayMicroseconds(2); // Espera 2 microssegundos.
digitalWrite(10, HIGH); // Envia um pulso de 10 microssegundos.
delayMicroseconds(10);
digitalWrite(10, LOW); // Finaliza o pulso TRIG.
int distancia = pulseIn(9, HIGH) * 0.034 / 2;
// Calcula a distância com base no tempo do pulso do ECHO.
if(distancia >= 50) {
// Verifica se a distância é maior ou igual a 50 cm.
float temperatura = dht.readTemperature(); // Lê a temperatura.
float umidade = dht.readHumidity(); // Lê a umidade.
lcd.setCursor(0, 0);
lcd.print("Temp: "); lcd.print(temperatura); lcd.print("C ");
// Exibe temperatura no LCD.
lcd.setCursor(0, 1);
lcd.print("Umid: "); lcd.print(umidade); lcd.print("% ");
// Exibe umidade no LCD.
digitalWrite(7, HIGH); // Acende LED verde.
digitalWrite(5, LOW); // Apaga LED azul.
digitalWrite(6, LOW); // Apaga LED vermelho.
digitalWrite(22, LOW); // Desliga o relé.
noTone(12); // Desliga o buzzer.
if(umidade < 30) {
// Verifica se a umidade está abaixo de 30%.
digitalWrite(5, HIGH); // Acende LED azul.
digitalWrite(22, HIGH); // Liga o relé.
}
}
if(distancia < 50) {
// Verifica se a distância é menor que 50 cm (possível intruso).
digitalWrite(7, LOW); // Apaga LED verde.
digitalWrite(6, HIGH); // Acende LED vermelho.
lcd.setCursor(0,0);
lcd.print("Alerta de ");
lcd.setCursor(0,1);
lcd.print("intruso!! ");
tone(12, 1500);
}
}
if(modo == 0) {
// Executa o modo manual (similar ao automático, mas com lógica diferente para LEDs e relé).
// Mesma lógica de detecção de distância e exibição de dados no LCD.
// Alterações principais:
// - LEDs azul e verde acendem ao mesmo tempo.
// - Relé fica sempre ligado para controle manual.
if(msg == 1){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Modo Manual");
delay(2000);
msg = 0;
}
digitalWrite(10, LOW); // Garante que o pino TRIG está em nível baixo
delayMicroseconds(2); // Espera 2 microssegundos
digitalWrite(10, HIGH); // Envia pulso de 10 microssegundos
delayMicroseconds(10);
digitalWrite(10, LOW); // Finaliza o pulso
int distancia = pulseIn(9, HIGH) * 0.034 / 2; // Calcula a distância em cm
if(distancia >= 50){
float temperatura = dht.readTemperature(); // Lê a temperatura
float umidade = dht.readHumidity();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatura);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Umid: ");
lcd.print(umidade);
lcd.print("% ");
digitalWrite(7, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(22, HIGH);
noTone(12);
}
if(distancia < 50){
digitalWrite(7, LOW);
digitalWrite(6, HIGH);
lcd.setCursor(0,0);
lcd.print("Alerta de ");
lcd.setCursor(0,1);
lcd.print("intruso!! ");
tone(12, 1500);
}
}
}