#include <WiFi.h>
#include <PubSubClient.h>
// --- CONFIGURAÇÕES DA REDE VIRTUAL DO WOKWI ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// --- SUAS CREDENCIAIS DO ADAFRUIT IO (Preencha aqui!) ---
const char* mqtt_server = "io.adafruit.com";
const char* mqtt_user = "Lc_Joe17"; // Ex: joaosilva
const char* mqtt_password = "aio_XLUs27OHFOnLiIhnTKFnP2Ukp5ZU"; // Chave amarela longa
// --- OS TÓPICOS MQTT (Atenção aos nomes dos feeds!) ---
// Substitua SEU_USERNAME_AQUI pelo seu usuário real do Adafruit
const char* topico_comando = "Lc_Joe17/feeds/led-comando";
const char* topico_sensor = "Lc_Joe17/feeds/sensor-leitura";
// --- PINOS E VARIÁVEIS ---
const int pinoLED = 13;
const int pinoPot = 34; // O pino 34 que vimos na imagem!
unsigned long tempoAnterior = 0;
WiFiClient espClient;
PubSubClient client(espClient);
// --- FUNÇÃO QUE RECEBE DADOS DA INTERNET (Para acender o LED) ---
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Mensagem chegou do Adafruit: ");
String mensagem = "";
// Converte os bytes recebidos para texto (o famoso cast!)
for (int i = 0; i < length; i++) {
mensagem += (char)payload[i];
}
Serial.println(mensagem);
// Toma a decisão baseada na mensagem recebida
if (mensagem == "ON") {
digitalWrite(pinoLED, HIGH);
Serial.println("-> LIGANDO O LED");
} else if (mensagem == "OFF") {
digitalWrite(pinoLED, LOW);
Serial.println("-> DESLIGANDO O LED");
}
}
// --- FUNÇÃO PARA CONECTAR/RECONECTAR AO MQTT ---
void reconectar() {
while (!client.connected()) {
Serial.print("Conectando ao Adafruit IO...");
// Tenta conectar com usuário e senha
if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {
Serial.println(" Conectado!");
// Assim que conecta, assina o tópico para ouvir o botão do LED
client.subscribe(topico_comando);
} else {
Serial.print(" Falhou, erro: ");
Serial.print(client.state());
Serial.println(" Tentando de novo em 5 segundos...");
delay(5000);
}
}
}
// --- CONFIGURAÇÃO INICIAL ---
void setup() {
Serial.begin(115200);
pinMode(pinoLED, OUTPUT);
pinMode(pinoPot, INPUT); // Configura o pino 34 como entrada analógica
// Conecta no Wi-Fi do Simulador
Serial.println();
Serial.println("Conectando ao WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado!");
// Configura o servidor MQTT e a função que vai ouvir as mensagens (callback)
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
// --- LOOP PRINCIPAL (Roda infinitamente) ---
void loop() {
// 1. Garante que a conexão com o Adafruit está viva
if (!client.connected()) {
reconectar();
}
client.loop(); // Função essencial para o MQTT funcionar em background
// 2. Envia os dados do sensor a cada 2 segundos
unsigned long tempoAtual = millis();
if (tempoAtual - tempoAnterior >= 2000) {
tempoAnterior = tempoAtual;
// Lê o valor analógico do potenciômetro (0 a 4095 no pino 34)
int leitura = analogRead(pinoPot);
Serial.print("Lendo Sensor: ");
Serial.println(leitura);
// Converte o número para texto e publica no Adafruit
String paraEnviar = String(leitura);
client.publish(topico_sensor, paraEnviar.c_str());
}
}