#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h> // Para sensor de temperatura e umidade
#include <ESP32Servo.h> // Para controlar o servo motor
#define DHTPIN 4 // Pino digital para o sensor DHT11/DHT22 (GPIO2)
#define DHTTYPE DHT22 // Tipo de sensor DHT (DHT11 ou DHT22) - Você está usando DHT22
#define RAIN_SENSOR_PIN 19 // Pino digital para o sensor de chuva (GPIO13)
#define LDR_PIN 34 // Pino analógico para o fotorresistor (GPIO34)
#define SERVO_PIN 22 // Pino digital para o servo motor (GPIO19)
// configurando de Wi-Fi e MQTT
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Endereço do broker MQTT público
const char* mqtt_server = "broker.hivemq.com";
// coonfigurando tópicos de comunicação
const char* MQTT_TOPIC_DATA = "janela/dados"; // Onde o microcontrolador publica dados
const char* MQTT_TOPIC_COMMAND = "janela/comando"; // Onde o microcontrolador escuta comandos
// iniciando o sensor DHT
DHT dht(DHTPIN, DHTTYPE);
// iniciando o servo
Servo myServo;
// Variáveis para o estado da janela
bool janelaAberta = false;
bool modoAutomatico = false;
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [ ");
Serial.print(topic);
Serial.print(" ] ");
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println(message);
// Verifica se a mensagem veio do tópico de comando
if (String(topic) == MQTT_TOPIC_COMMAND) {
if (message == "abrir") {
Serial.println("Comando recebido: Abrir janela");
myServo.write(90); // Abre a janela (90 graus)
janelaAberta = true;
} else if (message == "fechar") {
Serial.println("Comando recebido: Fechar janela");
myServo.write(0); // Fecha a janela (0 graus)
janelaAberta = false;
} else if (message == "ativar_automatico") {
modoAutomatico = true;
Serial.println("Modo automático ATIVADO");
} else if (message == "desativar_automatico") {
modoAutomatico = false;
Serial.println("Modo automático DESATIVADO");
}
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected");
// O microcontrolador se inscreve para receber comandos
client.subscribe(MQTT_TOPIC_COMMAND);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
dht.begin(); // Inicia o sensor DHT
//delay(2000);
myServo.attach(SERVO_PIN); // Anexa o servo ao pino
Serial.println("Movendo servo para 90");
myServo.write(0); // Janela fechada (0 graus)
pinMode(RAIN_SENSOR_PIN, INPUT_PULLUP); // Configura o pino do sensor de chuva como entrada com pull-up
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 5000) {
lastMsg = now;
// Leitura do Sensor de Temperatura e Umidade (DHT22)
float temperatura = dht.readTemperature();
float umidade = dht.readHumidity();
// Leitura do Sensor de Chuva (Botão)
bool chovendo = (digitalRead(RAIN_SENSOR_PIN) == LOW); // LOW quando pressionado
// Leitura do Sensor de Luminosidade (Módulo LDR)
int luminosidadeAnalog = analogRead(LDR_PIN); // Leitura analógica (0-4095 no ESP32)
float luminosidade = map(luminosidadeAnalog, 0, 4095, 0, 1000);
// Verifica se as leituras são válidas
if (isnan(temperatura) || isnan(umidade)) {
Serial.println("Falha ao ler do sensor DHT!");
temperatura = 0.0;
umidade = 0.0;
}
// Publica os dados via MQTT
char jsonBuffer[256];
sprintf(jsonBuffer,
"{\"temperatura\":%.2f, \"umidade\":%.2f, \"chovendo\":%s, \"luminosidade\":%.2f, \"status_janela\":\"%s\"}",
temperatura, umidade, chovendo ? "true" : "false", luminosidade,
janelaAberta ? "aberta" : "fechada");
client.publish(MQTT_TOPIC_DATA, jsonBuffer);
// Lógica de controle automática: só funciona se ativada
if (modoAutomatico) {
if (chovendo && janelaAberta) {
Serial.println("Chovendo! Fechando janela automaticamente...");
myServo.write(0);
janelaAberta = false;
} else if (temperatura > 28.0 && !janelaAberta) {
Serial.println("Temperatura alta! Abrindo janela automaticamente...");
myServo.write(90);
janelaAberta = true;
} else if (temperatura < 25.0 && janelaAberta) {
Serial.println("Temperatura amena. Fechando janela automaticamente...");
myServo.write(0);
janelaAberta = false;
}
}
}
}
Sensor de temperatura e umidade
Sensor de luminosidade
Servo motor
pushbutton