#include <DHT.h>
// Definições para o sensor DHT22
#define DHTPIN 2 // Pino conectado ao sensor DHT22
#define DHTTYPE DHT22 // Tipo do sensor
DHT dht(DHTPIN, DHTTYPE);
// Definições dos pinos para os LEDs, botão e buzzer
const int ledVerde = 3;
const int ledAmarelo = 4;
const int ledVermelho = 5;
const int buzzer = 6;
const int botaoModo = 7;
// Variáveis para controle de estado
bool modoDia = true; // Começa no modo Dia
unsigned long ultimoTempo = 0; // Para controlar os intervalos de pisca
bool estadoBotaoAnterior = LOW;
// Limites de temperatura e umidade
const float tempMaxDia = 30.0;
const float tempMaxNoite = 25.0;
const float umidMin = 40.0;
const float umidMax = 70.0;
void setup() {
// Configuração dos pinos
pinMode(ledVerde, OUTPUT);
pinMode(ledAmarelo, OUTPUT);
pinMode(ledVermelho, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(botaoModo, INPUT_PULLUP);
// Inicialização do sensor DHT22
dht.begin();
// Inicia com LED verde ligado (condições normais)
digitalWrite(ledVerde, HIGH);
// Mensagem inicial no monitor serial
Serial.begin(9600);
Serial.println("Sistema de Monitoramento da Estufa Iniciado.");
}
void loop() {
// Leitura do botão para alternar modo
bool estadoBotao = digitalRead(botaoModo);
if (estadoBotao == HIGH && estadoBotaoAnterior == LOW) {
modoDia = !modoDia; // Alterna o modo
delay(200); // Debounce
Serial.println(modoDia ? "Modo Dia Ativado" : "Modo Noite Ativado");
}
estadoBotaoAnterior = estadoBotao;
// Leitura dos valores do sensor
float temperatura = dht.readTemperature();
float umidade = dht.readHumidity();
// Tratamento de erro na leitura do sensor
if (isnan(temperatura) || isnan(umidade)) {
Serial.println("Erro na leitura do sensor DHT22.");
return;
}
// Exibe os valores lidos no monitor serial
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.print(" ºC, Umidade: ");
Serial.print(umidade);
Serial.println(" %");
// Determina os limites de temperatura baseado no modo
float tempMax = modoDia ? tempMaxDia : tempMaxNoite;
// Controle dos alertas
if (temperatura > tempMax && (umidade < umidMin || umidade > umidMax)) {
alertaSimultaneo();
} else if (temperatura > tempMax) {
alertaTemperatura();
} else if (umidade < umidMin || umidade > umidMax) {
alertaUmidade();
} else {
condicoesNormais();
}
// Pequeno atraso para evitar leituras muito frequentes
delay(500);
}
// Função para condições normais
void condicoesNormais() {
digitalWrite(ledVerde, HIGH);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVermelho, LOW);
digitalWrite(buzzer, LOW);
}
// Função para alerta de temperatura
void alertaTemperatura() {
digitalWrite(ledVerde, LOW);
digitalWrite(ledAmarelo, LOW);
// Pisca o LED vermelho a cada 1 segundo
if (millis() - ultimoTempo >= 1000) {
ultimoTempo = millis();
digitalWrite(ledVermelho, !digitalRead(ledVermelho));
}
// Buzzer toca a cada 5 segundos
if (millis() % 5000 < 100) {
digitalWrite(buzzer, HIGH);
} else {
digitalWrite(buzzer, LOW);
}
}
// Função para alerta de umidade
void alertaUmidade() {
digitalWrite(ledVerde, LOW);
digitalWrite(ledVermelho, LOW);
// Pisca o LED amarelo a cada 2 segundos
if (millis() - ultimoTempo >= 2000) {
ultimoTempo = millis();
digitalWrite(ledAmarelo, !digitalRead(ledAmarelo));
}
// Buzzer toca a cada 10 segundos
if (millis() % 10000 < 100) {
digitalWrite(buzzer, HIGH);
} else {
digitalWrite(buzzer, LOW);
}
}
// Função para alertas simultâneos
void alertaSimultaneo() {
digitalWrite(ledVerde, LOW);
// LEDs vermelho e amarelo piscam alternadamente
if (millis() - ultimoTempo >= 500) {
ultimoTempo = millis();
digitalWrite(ledVermelho, !digitalRead(ledVermelho));
digitalWrite(ledAmarelo, !digitalRead(ledAmarelo));
}
// Buzzer toca a cada 3 segundos
if (millis() % 3000 < 100) {
digitalWrite(buzzer, HIGH);
} else {
digitalWrite(buzzer, LOW);
}
}