#include <ESP32Servo.h>
#include <WiFi.h>
#include <PubSubClient.h>
// Configurações para rede
const char* SSID = "Wokwi-GUEST";
const char* PASSWORD = "";
// Configurações MQTT
const char* server = "broker.hivemq.com";
const int mqttPort = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
// Tópicos MQTT
const char* topicPir = "sihs/torivus/1/pir";
const char* topicSound = "sihs/torivus/1/sound";
// Pinos
const int pinTrigger = 12; // Disparo
const int pinServo = 13; // Servo da torreta
const int pinSound = 15; // Sensor de som
const int pinPir = 16; // Sensor PIR (movimento)
const int pinBuzzer = 17; // Buzzer
// Configuração do Servo
Servo torreta;
int pos = 90;
// Variáveis de Estado
int soundLevel = 0;
int pirState = LOW; // Estado do PIR
int soundState = LOW; // Estado do som
bool alarmeAtivo = false; // Estado do alarme
bool torretaAtiva = false; // Estado da torreta
// Controle de tempo para publicações
unsigned long lastSoundPublish = 0;
const unsigned long publishInterval = 2000; // Intervalo mínimo entre publicações (em ms)
// Função chamada ao receber uma mensagem MQTT
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Mensagem recebida: ");
Serial.println(topic);
String s = "";
for (int i = 0; i < length; i++) {
s += ((char)payload[i]);
}
Serial.println(s);
}
void setup() {
Serial.begin(115200);
Serial.println("Conectando ao Wi-Fi e MQTT...");
client.setServer(server, mqttPort);
client.setCallback(callback);
pinMode(pinSound, INPUT);
pinMode(pinPir, INPUT);
pinMode(pinBuzzer, OUTPUT);
pinMode(pinTrigger, OUTPUT);
reconnect();
torreta.attach(pinServo);
torreta.write(pos); // Posiciona a torreta no ângulo inicial
}
void reconnect() {
if (WiFi.status() == WL_CONNECTED)
return;
Serial.print("Tentando conexão Wi-Fi...");
WiFi.begin(SSID, PASSWORD); // Conecta na rede Wi-Fi
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\nWi-Fi conectado!");
if (!client.connected()) {
Serial.println("Tentando reconectar ao MQTT...");
if (client.connect("ESP32Client")) {
Serial.println("MQTT reconectado!");
client.subscribe(topicSound);
client.subscribe(topicPir);
} else {
Serial.print("Falha ao conectar MQTT. Erro: ");
Serial.println(client.state());
}
}
}
void gerenciarSensores() {
int soundLevel = analogRead(pinSound);
Serial.print("Nivel de Som: ");
Serial.println(soundLevel);
Serial.print("Movimento: ");
Serial.println(pirState);
}
void publicarMQTT() {
char buffer[4];
// Publica estado do PIR
if (pirState == HIGH) {
Serial.println("Movimento detectado! Publicando...");
client.publish(topicPir, "Movimento detectado!");
}
// Publica estado do som em intervalos regulares
sprintf(buffer, "%d", soundLevel);
Serial.print("Publicando nível de som: ");
Serial.println(buffer);
client.publish(topicSound, buffer);
}
void controlarTorreta() {
if (pirState == HIGH && !torretaAtiva) {
torretaAtiva = true;
for (pos; pos >= 0; pos--) {
torreta.write(pos);
delay(20);
}
} else if (pirState == LOW && torretaAtiva) {
torretaAtiva = false;
for (pos; pos <= 90; pos++) {
torreta.write(pos);
delay(20);
}
}
}
void gerenciarAlarme() {
if (soundState || pirState) {
if (!alarmeAtivo) {
Serial.println("Alarme ativado: Evento detectado!");
alarmeAtivo = true;
}
digitalWrite(pinBuzzer, HIGH);
tone(pinBuzzer, 1000, 500);
} else {
if (alarmeAtivo) {
Serial.println("Alarme desativado.");
alarmeAtivo = false;
}
noTone(pinBuzzer);
digitalWrite(pinBuzzer, LOW);
}
}
void loop() {
gerenciarSensores();
//Conecta MQTT
if (!client.connected() || WiFi.status() != WL_CONNECTED) {
reconnect(); //Caso caia a conexao
} else {
client.loop(); //Deixa MQTT no loop
}
publicarMQTT();
controlarTorreta();
gerenciarAlarme();
delay(5000);
}