#include <WiFi.h>
#include <DHT.h>
#include <PubSubClient.h>
// --------- Joystick ----------
const int VERT_PIN = 32; // Eixo vertical (usar pino ADC!)
const int HOR_PIN = 35; // Eixo horizontal (usar pino ADC!)
const int SEL_PIN = 5; // Botão do joystick
// --------- LEDs e botão externo ----------
const int LED_VERDE = 25;
const int LED_VERMELHO = 26;
const int BUTTON = 33;
volatile bool estado = true;
const int TIME_DEBOUNCE = 200;
// --------- DHT ----------
const int DHTPIN = 22;
DHT dht(DHTPIN, DHT22);
int temperature = 0;
// --------- Interrupção ----------
volatile unsigned long last_interrupt_time = 0;
unsigned long interrupt_time = 0;
// --------- WiFi ----------
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// --------- MQTT ----------
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* mqtt_client_id = "esp32-wokwi-demo";
const char* topic_joystick = "esp32/joystick";
const char* topic_dht = "esp32/dht";
// Objetos WiFi + MQTT
WiFiClient espClient;
PubSubClient client(espClient);
// Função de interrupção
void button_interrupt() {
interrupt_time = millis();
if (interrupt_time - last_interrupt_time > TIME_DEBOUNCE) {
estado = !estado;
last_interrupt_time = interrupt_time;
}
}
// Reconectar MQTT se cair
void reconnect() {
while (!client.connected()) {
Serial.print("Conectando ao MQTT...");
if (client.connect(mqtt_client_id)) {
Serial.println("✅ Conectado!");
client.subscribe("esp32/comandos"); // Exemplo de inscrição
} else {
Serial.print("Falha, rc=");
Serial.print(client.state());
Serial.println(" Tentando de novo em 5s");
delay(5000);
}
}
}
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(VERT_PIN, INPUT);
pinMode(HOR_PIN, INPUT);
pinMode(SEL_PIN, INPUT_PULLUP);
Serial.begin(115200);
Serial.println("Hello, ESP32!");
attachInterrupt(digitalPinToInterrupt(BUTTON), button_interrupt, FALLING);
dht.begin();
// Conectar WiFi
Serial.print("Conectando ao WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n✅ WiFi conectado!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Configurar servidor MQTT
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
// Reconectar MQTT se cair
if (!client.connected()) {
reconnect();
}
client.loop();
// Estado do botão externo
if (estado == false) {
Serial.println("desligado");
} else {
Serial.println("ligado");
}
// Leitura do joystick
int vertical = analogRead(VERT_PIN);
int horizontal = analogRead(HOR_PIN);
int sel = digitalRead(SEL_PIN);
// Publica no MQTT
char msg[100];
snprintf(msg, sizeof(msg), "{\"V\":%d,\"H\":%d,\"Btn\":%d}", vertical, horizontal, sel);
client.publish(topic_joystick, msg);
Serial.print("Joystick -> ");
Serial.println(msg);
// Leitura do DHT
temperature = dht.readTemperature();
float humidity = dht.readHumidity();
char dht_msg[100];
snprintf(dht_msg, sizeof(dht_msg), "{\"Temp\":%d,\"Hum\":%.1f}", temperature, humidity);
client.publish(topic_dht, dht_msg);
Serial.print("DHT -> ");
Serial.println(dht_msg);
delay(2000); // lê e publica a cada 2s
}