#include #include #include // ==================== CONFIGURAÇÕES ==================== // WiFi const char* ssid = "NOME_DA_SUA_REDE_WIFI"; const char* password = "SENHA_DO_SEU_WIFI"; // MQTT - Seu servidor! const char* mqtt_server = "iot.xkbitcoin.com"; // Seu domínio const int mqtt_port = 1883; const char* device_id = "esp32_001"; // ID único do dispositivo // Pinos const int ledPin = 2; // LED interno do ESP32 const int sensorPin = 34; // Sensor analógico (opcional) // ==================== VARIÁVEIS ==================== WiFiClient espClient; PubSubClient client(espClient); unsigned long lastMsg = 0; bool ledStatus = false; // ==================== SETUP ==================== void setup() { Serial.begin(115200); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // Conectar WiFi setupWiFi(); // Conectar MQTT client.setServer(mqtt_server, mqtt_port); client.setCallback(callback); } // ==================== LOOP ==================== void loop() { // Reconectar MQTT se necessário if (!client.connected()) { reconnectMQTT(); } client.loop(); // Enviar status a cada 10 segundos unsigned long now = millis(); if (now - lastMsg > 10000) { lastMsg = now; enviarStatus(); } } // ==================== WIFI ==================== void setupWiFi() { Serial.print("Conectando ao WiFi"); WiFi.begin(ssid, password); int tentativas = 0; while (WiFi.status() != WL_CONNECTED && tentativas < 30) { delay(500); Serial.print("."); tentativas++; } if (WiFi.status() == WL_CONNECTED) { Serial.println("\n✅ WiFi Conectado!"); Serial.print("IP: "); Serial.println(WiFi.localIP()); } else { Serial.println("\n❌ Falha no WiFi! Reiniciando..."); ESP.restart(); } } // ==================== MQTT ==================== void reconnectMQTT() { while (!client.connected()) { Serial.print("Conectando ao MQTT..."); // Tentar conectar if (client.connect(device_id)) { Serial.println("✅ Conectado!"); // Assinar tópico de comandos String topicoComando = "esp32/" + String(device_id) + "/comando"; client.subscribe(topicoComando.c_str()); Serial.print("📡 Ouvindo: "); Serial.println(topicoComando); // Enviar status inicial enviarStatus(); } else { Serial.print("❌ Falha (rc="); Serial.print(client.state()); Serial.println(") Tentando novamente em 5s..."); delay(5000); } } } // Callback - Quando recebe comando void callback(char* topic, byte* payload, unsigned int length) { Serial.print("📩 Mensagem recebida: "); Serial.println(topic); // Converter payload para string String mensagem; for (int i = 0; i < length; i++) { mensagem += (char)payload[i]; } Serial.println("Conteúdo: " + mensagem); // Parse JSON StaticJsonDocument<200> doc; DeserializationError error = deserializeJson(doc, mensagem); if (!error) { const char* comando = doc["comando"]; int valor = doc["valor"]; // Executar comando if (strcmp(comando, "led") == 0) { ledStatus = (valor == 1); digitalWrite(ledPin, ledStatus ? HIGH : LOW); Serial.print("💡 LED "); Serial.println(ledStatus ? "LIGADO" : "DESLIGADO"); // Confirmar enviando status enviarStatus(); } } else { Serial.println("❌ Erro no JSON!"); } } // ==================== ENVIAR STATUS ==================== void enviarStatus() { // Criar JSON StaticJsonDocument<200> doc; doc["led"] = ledStatus ? 1 : 0; doc["sensor"] = analogRead(sensorPin); // Leitura do sensor doc["wifi"] = WiFi.RSSI(); // Sinal WiFi em dBm doc["uptime"] = millis() / 1000; // Tempo ligado em segundos // Serializar String payload; serializeJson(doc, payload); // Publicar String topicoStatus = "esp32/" + String(device_id) + "/status"; client.publish(topicoStatus.c_str(), payload.c_str()); Serial.println("📤 Status enviado: " + payload); }