#include <WiFi.h>
#include <PubSubClient.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
WiFiClient espClient;
PubSubClient client(espClient);
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define PIR_PIN 14
#define DHTPIN 15
#define DHTTYPE DHT22
#define BUTTON_PIN 4
DHT dht(DHTPIN, DHTTYPE);
bool treinoAtivo = false;
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi conectado!");
}
void reconnect() {
while (!client.connected()) {
if (client.connect("ESP32PassaBola")) {
Serial.println("Conectado ao MQTT!");
} else {
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
dht.begin();
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Erro ao iniciar OLED"));
for(;;);
}
display.clearDisplay();
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
int presenca = digitalRead(PIR_PIN);
float temperatura = dht.readTemperature();
float umidade = dht.readHumidity();
if (digitalRead(BUTTON_PIN) == LOW) {
treinoAtivo = !treinoAtivo;
delay(500);
}
String statusQuadra = (presenca == HIGH || treinoAtivo) ? "ocupada" : "livre";
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print("Quadra: ");
display.println(statusQuadra);
display.print("Temp: ");
display.print(temperatura);
display.println(" C");
display.print("Umid: ");
display.print(umidade);
display.println(" %");
display.display();
String payload = "{";
payload += "\"quadra\":\"Quadra01\",";
payload += "\"status\":\"" + statusQuadra + "\",";
payload += "\"temperatura\":" + String(temperatura) + ",";
payload += "\"umidade\":" + String(umidade) + ",";
payload += "\"presenca\":" + String(presenca) + ",";
payload += "\"treinoAtivo\":" + String(treinoAtivo ? 1 : 0);
payload += "}";
client.publish("/passaabola/quadra01/status", payload.c_str());
Serial.println(payload);
delay(3000);
}