#include <WiFi.h> // Biblioteca para funções WiFi
#include <DHT.h> // Biblioteca para sensor DHT
#include <LiquidCrystal_I2C.h> // Biblioteca para LCD I2C
#include <WebServer.h> // Biblioteca para criar um servidor web
#define SSID "Chagas" // Nome da rede WiFi
#define PASSWORD "ch@g@s2024" // Senha da rede WiFi
#define DHTPIN 4 // Pino conectado ao DHT11
#define DHTTYPE DHT11 // Tipo de sensor DHT
float temperatura = 0; // Variável para armazenar a temperatura
float umidade = 0; // Variável para armazenar a umidade
DHT dht(DHTPIN, DHTTYPE); // Instância do sensor DHT
#define ADDRESS 0x27 // Endereço do LCD I2C
#define COLUNS 16 // Número de colunas do LCD
#define ROWS 2 // Número de linhas do LCD
LiquidCrystal_I2C lcd(ADDRESS, COLUNS, ROWS); // Instância do LCD I2C
#define portWeb 80 // Porta do servidor web
WebServer server(portWeb); // Instância do servidor web
#define BAUDRATE 115200 // Taxa de transmissão da comunicação serial
#define Lamp 13 // Pino conectado ao LED
int lampState = HIGH; // Estado inicial do LED
void setup() {
Serial.begin(BAUDRATE); // Inicia a comunicação serial
lcd.init(); // Inicializa o LCD
lcd.backlight(); // Liga a luz de fundo do LCD
lcd.home(); // Move o cursor para a posição inicial
dht.begin(); // Inicia o sensor DHT
pinMode(Lamp, OUTPUT); // Configura o pino do LED como saída
digitalWrite(Lamp, lampState); // Define o estado inicial do LED
while (!ConectWifi()) return; // Tenta conectar ao WiFi
}
bool ConectWifi() {
WiFi.begin(SSID, PASSWORD); // Conecta ao WiFi
lcd.clear(); // Limpa o LCD
Serial.print("Conectando a Rede: ");
Serial.print(SSID);
lcd.print("Conectando a Rede"); // Exibe mensagem no LCD
lcd.setCursor(0, 1);
lcd.print(SSID); // Exibe o nome da rede no LCD
while (WiFi.status() != WL_CONNECTED) { // Espera a conexão WiFi ser estabelecida
Serial.print(".");
lcd.print(".");
delay(500);
}
Serial.print("Wifi Conectado.");
lcd.clear();
lcd.print("Wifi Conectado."); // Exibe mensagem de conexão no LCD
lcd.setCursor(0, 1);
lcd.print(WiFi.localIP()); // Exibe o endereço IP no LCD
Serial.print(WiFi.localIP());
delay(2000);
ServerInit(); // Inicializa o servidor
return true;
}
void ServerInit() {
server.on("/", handleRoot); // Define o manipulador para a URL raiz
server.on("/toggle1", handleToggleLed); // Define o manipulador para alternar o LED
server.on("/dht", handleDHTRead); // Define o manipulador para a leitura do sensor DHT em JSON
server.begin(); // Inicia o servidor web
Serial.println("Servidor HTTP iniciado.");
}
void loop() {
while (WiFi.status() != WL_CONNECTED) ConectWifi(); // Verifica a conexão WiFi e reconecta se necessário
server.handleClient(); // Trata as requisições dos clientes
}
bool DHTRead() {
umidade = dht.readHumidity(); // Lê a umidade do sensor DHT
temperatura = dht.readTemperature(); // Lê a temperatura do sensor DHT
// Verificação de erro na leitura do sensor
if (isnan(umidade) || isnan(temperatura)) {
Serial.println("Falha ao ler do sensor DHT!");
server.send(500, "text/plain", "Erro ao ler do sensor DHT");
return false;
}
return true;
}
String WebPage() {
String webPage = "<!DOCTYPE html><html>"; // Inicia o HTML da página web
webPage += "<head><title>Leitura do Sensor DHT11</title>";
webPage += "<meta charset='UTF-8' http-equiv='refresh' content='3'>"; // Atualiza a página a cada 3 segundos
webPage += "<meta name='viewport' content='width=device-width, initial-scale=1.0'>"; // Meta tag para responsividade
webPage += "<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css'>"; // Inclui a biblioteca de ícones Font Awesome
webPage += "<style>";
webPage += "body {font-family: Arial; margin: 0; padding: 0;}";
webPage += ".container {max-width: 600px; margin: 20px auto; padding: 20px; border: 2px solid #ccc; border-radius: 10px; box-shadow: 0 0 10px rgba(0,0,0,0.1); background-color: #fff;}";
webPage += "h1 {color: #333;}";
webPage += "p {font-size: 1.2em;}";
webPage += "button {padding: 10px 20px; margin: 5px; font-size: 1em; background-color: #007bff; color: #fff; border: none; border-radius: 5px; cursor: pointer;}";
webPage += "button:hover {background-color: #0056b3;}";
webPage += ".icon {margin-right: 5px;}";
webPage += "@media screen and (max-width: 600px) {"; // Media query para ajustes em dispositivos menores
webPage += ".container {margin: 10px;}";
webPage += "}";
webPage += "</style>";
webPage += "</head><body>";
webPage += "<div class='container'>";
webPage += "<h1>Leitura do Sensor DHT11</h1>";
webPage += "<p><i class='fas fa-thermometer-half icon'></i>Temperatura: " + String(temperatura) + " °C</p>"; // Mostra a temperatura com ícone de termômetro
webPage += "<p><i class='fas fa-tint icon'></i>Umidade: " + String(umidade) + " %</p>"; // Mostra a umidade com ícone de gota
webPage += "<button onclick=\"location.href='/toggle'\">"; // Botão para alternar o LED
webPage += lampState ? "<i class='fas fa-toggle-on icon'></i>Ligar Lâmpada" : "<i class='fas fa-toggle-off icon'></i>Desligar Lâmpada"; // Texto do botão baseado no estado do LED
webPage += "</button>";
webPage += "</div></body></html>";
return webPage;
}
void handleRoot() {
if(!DHTRead()) return; // Lê os dados do sensor DHT e verifica erros
server.send(200, "text/html", WebPage()); // Envia a página web ao cliente
Serial.println("Página web enviada.");
}
void handleToggleLed() {
lampState = !lampState; // Alterna o estado do LED
digitalWrite(Lamp, lampState); // Define o novo estado do LED
server.sendHeader("Location", "/"); // Redireciona de volta para a raiz
server.send(303); // Envia resposta de redirecionamento
}
void handleDHTRead() {
if(!DHTRead()) return; // Lê os dados do sensor DHT e verifica erros
String json = "{\"temperatura\":" + String(temperatura) + ", \"umidade\":" + String(umidade) + "}"; // Cria um JSON com os valores de temperatura e umidade
server.send(200, "application/json", json); // Envia o JSON ao cliente
Serial.println("Dados do sensor enviados.");
}