//Caio Schneider, Henrique Rapadura e Flávio Fox
#include <WiFi.h>
#include <PubSubClient.h>
#include <ESP32Servo.h>
// --- Configurações de Rede e MQTT ---
const char* ssid = "NOME_DA_REDE";
const char* password = "SENHA";
const char* mqtt_server = "SEU_BROKER_MQTT";
const int mqtt_port = 1883;
const char* mqtt_user = "SEU_USUARIO";
const char* mqtt_password = "SUA_SENHA";
WiFiClient espClient;
PubSubClient client(espClient);
Servo meuServo;
// --- Definição dos Pinos ---
const int ledPin = 14; // LED Onboard ou alerta
const int pirPin = 13; // Sensor de Presença
const int btnPin = 12; // Botão de ativação
const int buzzerPin = 17; // Alarme sonoro
const int servoPin = 26; // Porta
// Variáveis de controle
bool sistemaAtivo = false;
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
pinMode(pirPin, INPUT);
pinMode(btnPin, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
meuServo.attach(servoPin);
meuServo.write(0); // Garante porta fechada ao iniciar
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback); // Define a função que recebe mensagens
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Conectando em ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado");
Serial.println("Endereço IP: ");
Serial.println(WiFi.localIP());
}
// Esta função é chamada quando uma mensagem chega nos tópicos assinados
void callback(char* topic, byte* message, unsigned int length) {
String msg;
for (int i = 0; i < length; i++) {
msg += (char)message[i];
}
Serial.print("Mensagem recebida no tópico [");
Serial.print(topic);
Serial.print("]: ");
Serial.println(msg);
// Controle do LED via MQTT (Exemplo do seu código)
if (String(topic) == "esp32/led") {
if (msg == "ON") {
digitalWrite(ledPin, HIGH);
} else if (msg == "OFF") {
digitalWrite(ledPin, LOW);
}
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Tentando conexão MQTT...");
// Tenta conectar usando usuário e senha do seu exemplo
if (client.connect("ESP32_Invasao_Lab", mqtt_user, mqtt_password)) {
Serial.println("conectado");
// Assina o tópico para receber comandos
client.subscribe("esp32/led");
} else {
Serial.print("falhou, rc=");
Serial.print(client.state());
Serial.println(" tentando novamente em 5 segundos");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// 1. Lógica do Botão Físico (Liga/Desliga o Alarme localmente)
if (digitalRead(btnPin) == LOW) {
sistemaAtivo = !sistemaAtivo;
digitalWrite(ledPin, sistemaAtivo); // LED indica se sistema está armado
Serial.println(sistemaAtivo ? "SISTEMA ARMADO" : "SISTEMA DESARMADO");
delay(500); // Debounce
}
// 2. Lógica do Sensor de Presença
if (sistemaAtivo && digitalRead(pirPin) == HIGH) {
Serial.println("MOVIMENTO DETECTADO!");
// Publica o alerta no Broker MQTT
client.publish("esp32/alerta", "INVASÃO DETECTADA!");
// Ações de Alarme
digitalWrite(buzzerPin, HIGH);
meuServo.write(90); // Abre a "porta" ou trava de segurança
delay(1000);
digitalWrite(buzzerPin, LOW);
}
}