// Incluindo as bibliotecas para controle de sensores e display
#include <LiquidCrystal.h> // Biblioteca do LCD
#include <DHT.h> // Biblioteca do sensor DHT
// Definindo os pinos conectados aos componentes
#define DHTPIN 1 // Pino do DHT22
#define DHTTYPE DHT22 // Tipo do sensor DHT
#define TRIGPIN 14 // Pino TRIG do sensor ultrassônico
#define ECHOPIN 15 // Pino ECHO do sensor ultrassônico
#define BUTTONPIN 9 // Pino do botão de pressão
#define RELAYPIN 8 // Pino do relay
#define BUZZERPIN 16 // Pino do buzzer
#define LED_RED 7 // Pino do LED vermelho
#define LED_BLUE 6 // Pino do LED azul
// Inicializando os objetos necessários
DHT dht(DHTPIN, DHTTYPE); // Inicia o sensor DHT22
LiquidCrystal lcd(13, 12, 11, 5, 4, 3, 2); // Configuração dos pinos do LCD
// Variáveis globais auxiliares
bool bombaLigada = false; // Indica se a bomba está ligada
unsigned long buzzerTimer = 0; // Temporizador do intermitente do buzzer
unsigned long lastUpdate = 0; // Temporizador da atualização principal
void setup() {
// Configurações dos pinos
pinMode(TRIGPIN, OUTPUT); // Define o pino TRIG como saída
pinMode(ECHOPIN, INPUT); // Define o pino ECHO como entrada
pinMode(BUTTONPIN, INPUT_PULLUP); // Define o botão com resistor pull-up interno
pinMode(RELAYPIN, OUTPUT); // Define o pino do relé como saída
pinMode(BUZZERPIN, OUTPUT); // Define o pino do buzzer como saída
pinMode(LED_RED, OUTPUT); // Define o pino do LED vermelho como saída
pinMode(LED_BLUE, OUTPUT); // Define o pino do LED azul como saída
// Inicia os dispositivos
lcd.begin(16, 2); // Configura o LCD como 16 colunas e 2 linhas
dht.begin(); // Inicia o DHT22
// Mensagem de inicialização no LCD
lcd.print("Sistema Iniciando");
delay(2000); // Pausa para exibição inicial
lcd.clear(); // Limpa o LCD
}
void loop() {
unsigned long currentTime = millis();
// Atualização periódica (a cada 500 ms)
if (currentTime - lastUpdate >= 500) {
lastUpdate = currentTime;
// Leitura de temperatura e umidade do DHT22
float temperatura = dht.readTemperature(); // Lê a temperatura
float umidade = dht.readHumidity(); // Lê a umidade
// Atualiza as informações no LCD
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("%");
// Verifica a umidade para ativar a bomba automaticamente
if (umidade < 30) {
ligarBomba(); // Liga a bomba se a umidade for baixa
} else if (!bombaLigada) {
desligarBomba(); // Garante que a bomba está desligada
}
// Detecta intrusão usando o sensor ultrassônico
long distancia = medirDistancia(); // Calcula a distância medida
if (distancia > 0 && distancia < 50) {
ativarAlarme(); // Ativa o alarme se a distância for menor que 50 cm
} else {
desativarAlarme(); // Desativa o alarme caso contrário
}
}
// Verifica o botão de pressão para controle manual da bomba
if (!digitalRead(BUTTONPIN)) {
bombaLigada = !bombaLigada;
if (bombaLigada) {
ligarBomba();
} else {
desligarBomba();
}
}
}
// Função para medir a distância com o sensor ultrassônico
long medirDistancia() {
digitalWrite(TRIGPIN, LOW); // Garante que o pino TRIG está em nível baixo
delayMicroseconds(2); // Espera 2 microssegundos
digitalWrite(TRIGPIN, HIGH); // Envia pulso de 10 microssegundos
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW); // Finaliza o pulso
return pulseIn(ECHOPIN, HIGH) * 0.034 / 2; // Calcula a distância em cm
}
// Função para ligar a bomba de irrigação
void ligarBomba() {
digitalWrite(RELAYPIN, HIGH); // Liga o relay
digitalWrite(LED_BLUE, HIGH); // Acende o LED azul
bombaLigada = true; // Atualiza a variável da bomba
}
// Função para desligar a bomba de irrigação
void desligarBomba() {
digitalWrite(RELAYPIN, LOW); // Desliga o relay
digitalWrite(LED_BLUE, LOW); // Apaga o LED azul
bombaLigada = false; // Atualiza a variável da bomba
}
// Função para ativar o alarme
void ativarAlarme() {
digitalWrite(LED_RED, HIGH); // Acende o LED vermelho
lcd.setCursor(0, 1); // Posiciona o cursor na linha 2
lcd.print("Alerta Intrusao!"); // Exibe mensagem de alerta
// Som intermitente do buzzer
if (millis() - buzzerTimer > 500) {
digitalWrite(BUZZERPIN, !digitalRead(BUZZERPIN)); // Alterna o estado do buzzer
buzzerTimer = millis(); // Atualiza o temporizador
}
}
// Função para desativar o alarme
void desativarAlarme() {
digitalWrite(LED_RED, LOW); // Apaga o LED vermelho
digitalWrite(BUZZERPIN, LOW); // Desliga o buzzer
lcd.setCursor(0, 1); // Posiciona o cursor na linha 2
lcd.print(" "); // Limpa a mensagem de alerta
}