#include <WiFi.h>
#include "DHT.h"
#include <ESP32Servo.h>
#include <math.h>
// ----- CONFIGURAÇÕES DE PINOS -----
#define MQ2_PIN 34
#define PIN_LDR 35
#define PIN_DHT 15
#define DHTTYPE DHT22
#define SERVO1_PIN 17
#define SERVO2_PIN 16
#define PIN_BOTAO 18
// ----- CONSTANTES DO LDR -----
const float GAMMA = 0.7;
const float RL10 = 50.0;
// ----- CONFIGURAÇÃO DO WI-FI DO WOKWI -----
const char* ssid = "Wokwi-GUEST";
const char* senha = "";
// ----- OBJETOS E VARIÁVEIS -----
DHT dht(PIN_DHT, DHTTYPE);
Servo servo1;
Servo servo2;
volatile bool sistemaAtivo = true;
volatile bool botaoPressionado = false;
volatile unsigned long ultimaInterrupcao = 0;
const unsigned long debounceDelay = 300;
// ----- FUNÇÃO PARA MÉDIA DO LDR -----
int getAverage(int pin, int amostras = 32) {
long soma = 0;
for (int i = 0; i < amostras; i++) {
soma += analogRead(pin);
delay(10);
}
return soma / amostras;
}
// ----- INTERRUPÇÃO DO BOTÃO COM DEBOUNCE DENTRO DA ISR -----
void IRAM_ATTR tratarBotao() {
unsigned long agora = millis();
if (agora - ultimaInterrupcao > debounceDelay) {
ultimaInterrupcao = agora;
botaoPressionado = true;
}
}
// ----- CONEXÃO WI-FI -----
void conectarWiFi() {
Serial.println("Conectando ao WiFi Wokwi-GUEST...");
WiFi.begin(ssid, senha);
unsigned long tempoInicio = millis();
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (millis() - tempoInicio > 10000) {
Serial.println("\nFalha ao conectar ao WiFi.");
Serial.println("Reiniciando em 2 segundos...");
delay(2000);
ESP.restart();
}
}
Serial.println("\nConectado com sucesso!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
// ----- SETUP -----
void setup() {
Serial.begin(115200);
conectarWiFi();
pinMode(MQ2_PIN, INPUT);
pinMode(PIN_LDR, INPUT);
pinMode(PIN_BOTAO, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PIN_BOTAO), tratarBotao, FALLING);
dht.begin();
servo1.attach(SERVO1_PIN, 500, 2400);
servo2.attach(SERVO2_PIN, 500, 2400);
Serial.println("Sistema iniciado.");
}
// ----- LOOP PRINCIPAL -----
void loop() {
if (botaoPressionado) {
sistemaAtivo = !sistemaAtivo;
botaoPressionado = false;
if (sistemaAtivo) {
servo1.attach(SERVO1_PIN, 500, 2400);
servo2.attach(SERVO2_PIN, 500, 2400);
Serial.println(">>> SISTEMA ATIVADO — Motores e sensores ligados.");
} else {
servo1.detach();
servo2.detach();
Serial.println(">>> SISTEMA DESLIGADO — Motores e sensores pausados.");
Serial.println("Enviando mensagem via WhatsApp...");
Serial.println("Mensagem: \"Sistema desligado. Condições anormais detectadas.\"");
}
}
if (!sistemaAtivo) {
delay(100);
return;
}
// ----- LEITURA DOS SENSORES -----
int gasValue = analogRead(MQ2_PIN);
float ppmGas = map(gasValue, 0, 4095, 0, 300) + 0.1;
int adcLdr = getAverage(PIN_LDR);
float voltage = adcLdr * (3.3f / 4095.0f);
float resistance = (RL10 * 1000.0f) * (voltage / (3.3f - voltage));
float lux = 10 * pow(((RL10 * 1000.0f) * pow(10.0f, GAMMA)) / resistance, (1.0f / GAMMA));
float temperatura = dht.readTemperature();
float umidade = dht.readHumidity();
// ----- SAÍDA SERIAL -----
Serial.println("\n--- Leitura dos Sensores ---");
Serial.printf("Gás (MQ-2): %.1f ppm (estimado)\n", ppmGas);
Serial.printf("LDR: ADC = %d | Tensão = %.2f V | Resistência = %.0f Ω | Luminosidade = %.2f lux\n", adcLdr, voltage, resistance, lux);
if (isnan(temperatura) || isnan(umidade)) {
Serial.println("Falha na leitura do DHT22!");
} else {
Serial.printf("Temperatura: %.1f °C | Umidade: %.1f %%\n", temperatura, umidade);
}
Serial.println("-----------------------------\n");
delay(500);
// ----- MOVIMENTO DOS SERVOS -----
for (int pos = 0; pos <= 180 && sistemaAtivo; pos++) {
servo1.write(pos);
servo2.write(180 - pos);
delay(15);
}
for (int pos = 180; pos >= 0 && sistemaAtivo; pos--) {
servo1.write(pos);
servo2.write(180 - pos);
delay(15);
}
}