#include <WiFi.h>
#include <PubSubClient.h>
// ------------------ WIFI ------------------
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ------------------ MQTT ------------------
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
// ------------------ PINOS ------------------
#define button1_pin 5
#define button2_pin 10
#define button3_pin 19
#define button4_pin 4 // NOVO: Botão físico para DESLIGAR TUDO
#define led1_pin 25 // Vermelho
#define led2_pin 26 // Verde
#define led3_pin 27 // Azul
#define buzzer_pin 15
// ------------------ ESTADOS ------------------
int led1_state = 0;
int led2_state = 0;
int led3_state = 0;
// ------------------ WIFI ------------------
void setup_wifi() {
Serial.begin(115200);
Serial.println("Conectando ao WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado!");
}
// ------------------ MQTT CALLBACK ------------------
void callback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
int value = message.toInt();
Serial.print("Mensagem [");
Serial.print(topic);
Serial.print("]: ");
Serial.println(value);
// Se ligar alguma cor → desliga todas primeiro localmente
if (value == 1) {
digitalWrite(led1_pin, LOW);
digitalWrite(led2_pin, LOW);
digitalWrite(led3_pin, LOW);
led1_state = 0;
led2_state = 0;
led3_state = 0;
}
// Controle individual
if (String(topic) == "pulseira/led1" && value == 1) {
led1_state = 1;
digitalWrite(led1_pin, HIGH);
bip(1);
}
if (String(topic) == "pulseira/led2" && value == 1) {
led2_state = 1;
digitalWrite(led2_pin, HIGH);
bip(2);
}
if (String(topic) == "pulseira/led3" && value == 1) {
led3_state = 1;
digitalWrite(led3_pin, HIGH);
bip(3);
}
// NOVO: Controle para Desligar Tudo via App
if (String(topic) == "pulseira/desligar" && value == 1) {
// Apenas garante que tudo fique desligado sem dar bipes de cores
// Um bipe longo opcional pode ser colocado aqui para feedback
digitalWrite(buzzer_pin, HIGH);
delay(500);
digitalWrite(buzzer_pin, LOW);
}
}
// ------------------ RECONEXÃO MQTT ------------------
void reconnect() {
while (!client.connected()) {
Serial.print("Conectando ao MQTT...");
if (client.connect("ESP32_Pulseira")) {
Serial.println("conectado!");
client.subscribe("pulseira/led1");
client.subscribe("pulseira/led2");
client.subscribe("pulseira/led3");
client.subscribe("pulseira/desligar"); // NOVO: Inscreve no tópico de desligar
} else {
Serial.print("Erro, rc=");
Serial.print(client.state());
Serial.println(" tentando novamente...");
delay(2000);
}
}
}
// ------------------ SETUP ------------------
void setup() {
pinMode(button1_pin, INPUT_PULLUP);
pinMode(button2_pin, INPUT_PULLUP);
pinMode(button3_pin, INPUT_PULLUP);
pinMode(button4_pin, INPUT_PULLUP); // NOVO: Inicia o pino do botão de desligar
pinMode(led1_pin, OUTPUT);
pinMode(led2_pin, OUTPUT);
pinMode(led3_pin, OUTPUT);
pinMode(buzzer_pin, OUTPUT);
digitalWrite(led1_pin, LOW);
digitalWrite(led2_pin, LOW);
digitalWrite(led3_pin, LOW);
digitalWrite(buzzer_pin, LOW);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
// ------------------ LOOP ------------------
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
listen_push_buttons();
}
// ------------------ BOTÕES FÍSICOS ------------------
void listen_push_buttons() {
if (digitalRead(button1_pin) == LOW) {
delay(200);
publish_led(1);
}
else if (digitalRead(button2_pin) == LOW) {
delay(200);
publish_led(2);
}
else if (digitalRead(button3_pin) == LOW) {
delay(200);
publish_led(3);
}
// NOVO: Verifica se o botão físico de desligar foi pressionado
else if (digitalRead(button4_pin) == LOW) {
delay(200);
turn_off_all();
}
}
// ------------------ PUBLICAÇÃO MQTT ------------------
void publish_led(int led) {
// Desliga todos antes de ligar o novo
turn_off_all_silent();
if (led == 1) {
led1_state = 1;
digitalWrite(led1_pin, HIGH);
client.publish("pulseira/led1", "1");
bip(1);
}
if (led == 2) {
led2_state = 1;
digitalWrite(led2_pin, HIGH);
client.publish("pulseira/led2", "1");
bip(2);
}
if (led == 3) {
led3_state = 1;
digitalWrite(led3_pin, HIGH);
client.publish("pulseira/led3", "1");
bip(3);
}
}
// NOVO: Função auxiliar para desligar sem avisar o MQTT (usado nas trocas de cor)
void turn_off_all_silent() {
led1_state = 0;
led2_state = 0;
led3_state = 0;
digitalWrite(led1_pin, LOW);
digitalWrite(led2_pin, LOW);
digitalWrite(led3_pin, LOW);
}
// NOVO: Função para o Botão de Desligar Tudo
void turn_off_all() {
turn_off_all_silent();
// Manda sinal para o App indicando que os LEDs apagaram
client.publish("pulseira/led1", "0");
client.publish("pulseira/led2", "0");
client.publish("pulseira/led3", "0");
// Toca um bipe longo para feedback sonoro de "tudo desligado"
digitalWrite(buzzer_pin, HIGH);
delay(500);
digitalWrite(buzzer_pin, LOW);
}
// ------------------ BUZZER ------------------
void bip(int quantidade) {
for (int i = 0; i < quantidade; i++) {
digitalWrite(buzzer_pin, HIGH);
delay(200);
digitalWrite(buzzer_pin, LOW);
delay(200);
}
}