#include <WiFi.h>
#include <PubSubClient.h>
// Configuração WiFi
const char* ssid = "Wokwi-GUEST";
const char* senha = "";
// Configuração MQTT
const char* mqttServer = "mqtt-dashboard.com";
const int mqttPort = 1883; // Porta MQTT padrão
const char* mqttClientID = "ESP32_Client_ALPDS";
const char* mqttTopicPublish = "ifms/iot/ALPDS"; // Tópico para enviar mensagens
WiFiClient espClient;
PubSubClient mqttClient(espClient);
// Configuração do botão
const int buttonPin = 23; // Pino onde o botão está conectado
bool lastButtonState = HIGH; // Estado anterior do botão
bool ledState = false; // Estado do LED controlado pelo botão
// Conectar ao WiFi
void connectToWiFi() {
WiFi.begin(ssid, senha);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado! IP: " + WiFi.localIP().toString());
}
// Conectar ao broker MQTT
void connectToMQTT() {
mqttClient.setServer(mqttServer, mqttPort);
while (!mqttClient.connected()) {
Serial.println("Conectando ao MQTT...");
if (mqttClient.connect(mqttClientID)) {
Serial.println("Conectado ao MQTT!");
} else {
Serial.print("Falha na conexão MQTT. Código de erro: ");
Serial.println(mqttClient.state());
delay(2000);
}
}
}
void setup() {
Serial.begin(9600);
connectToWiFi();
connectToMQTT();
pinMode(buttonPin, INPUT_PULLUP); // Configura o botão como entrada com pull-up interno
}
void loop() {
// Verifica e reconecta ao MQTT, se necessário
if (!mqttClient.connected()) {
connectToMQTT();
}
mqttClient.loop(); // Mantém o cliente MQTT em funcionamento
// Lê o estado do botão
bool buttonState = digitalRead(buttonPin);
// Verifica se o botão foi pressionado (mudança de estado)
if (buttonState == LOW && lastButtonState == HIGH) {
ledState = !ledState; // Alterna o estado do LED
String message = ledState ? "1" : "0"; // "1" para ligar, "0" para desligar
// Publica a mensagem no tópico MQTT
mqttClient.publish(mqttTopic, message.c_str());
Serial.println("Mensagem enviada: " + message);
}
// Atualiza o estado anterior do botão
lastButtonState = buttonState;
delay(50); // Pequeno atraso para evitar debounce
}