#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// --- Configuração dos Pinos ---
#define POT_PIN 34 // Simulador de Ruído
#define BUTTON_PIN 15 // Botão de Pausa/Conclusão
#define Led_red 32
#define LED_R 32 // LED vermelho
#define LED_G 33 // LED verde
#define LED_B 25 // LED azul
// --- Configurações do OLED ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// --- Configuração de Rede ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.mqtt-dashboard.com";
WiFiClient espClient;
PubSubClient client(espClient);
bool onlineMode = false; // Variável para controlar se estamos online ou offline
// --- Tópicos MQTT ---
#define MQTT_TOPIC_RUIDO "work/sensorial/ruido_alerta"
#define MQTT_TOPIC_STATUS "work/status/atual"
// --- AGENDA (Tarefas e Reuniões) ---
struct Tarefa {
String horario;
String descricao;
String tipo; // "Foco", "Reuniao", "Pausa"
};
Tarefa agenda[] = {
{"09:00", "Daily Scrum", "Reuniao"},
{"09:30", "Codificar API", "Foco"},
{"11:00", "Cafezinho", "Pausa"},
{"11:15", "Rever Docs", "Foco"},
{"12:00", "Almoco Equipe", "Pausa"},
{"13:00", "Reuniao Cliente", "Reuniao"}
};
int totalTarefas = 6;
int indiceTarefaAtual = 0;
// --- Variáveis de Controle ---
unsigned long lastTimeUpdate = 0;
bool alertaRuido = false;
bool pausaSolicitada = false;
unsigned long tempoPausaInicio = 0;
// Declaração de funções
void setup_wifi_safe();
void tentar_mqtt();
void verificarRuido();
void verificarBotao();
void atualizarDisplay();
void atualizarLED();
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(POT_PIN, INPUT);
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
// Inicializa OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Erro no OLED")); for(;;);
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.println("Iniciando...");
display.display();
setup_wifi_safe();
if (onlineMode) {
client.setServer(mqtt_server, 1883);
}
}
void loop() {
// Só tenta reconectar MQTT se o WiFi estiver OK
if (onlineMode && !client.connected()) {
tentar_mqtt();
}
if (onlineMode) {
client.loop();
}
// 1. Simulação do Tempo (Avança a agenda a cada 5 segundos para teste rápido)
if (millis() - lastTimeUpdate > 5000 && !pausaSolicitada) {
lastTimeUpdate = millis();
indiceTarefaAtual++;
if (indiceTarefaAtual >= totalTarefas) indiceTarefaAtual = 0;
// Se estiver online, publica
if (onlineMode && client.connected()) {
client.publish(MQTT_TOPIC_STATUS, agenda[indiceTarefaAtual].descricao.c_str());
}
}
// 2. Sensores e Lógica (Funciona mesmo Offline)
verificarRuido();
verificarBotao();
// 3. Atualização Visual
atualizarDisplay();
atualizarLED();
delay(100);
int valor = analogRead(POT_PIN); // Lê de 0 a 4095
Serial.println(valor);
// Níveis de "som"
int baixo = 1400; // Ajuste fino
int moderado = 2800;
if (valor < baixo) {
somBaixo();
}
else if (valor < moderado) {
somModerado();
}
else {
somAlto();
}
delay(50);
}
// Funções de cor do LED RGB
void somBaixo() {
digitalWrite(LED_R, LOW);
digitalWrite(LED_G, HIGH);
digitalWrite(LED_B, LOW);
}
void somModerado() {
digitalWrite(LED_R, HIGH);
digitalWrite(LED_G, HIGH); // Vermelho + verde = amarelo
digitalWrite(LED_B, LOW);
}
void somAlto() {
digitalWrite(LED_R, HIGH);
digitalWrite(LED_G, LOW);
digitalWrite(LED_B, LOW);
}
// --- LÓGICA DE SENSORIAMENTO ---
void verificarRuido() {
int leitura = analogRead(POT_PIN);
if (leitura > 3000) { // Simulando ruído alto
if (!alertaRuido) {
if(onlineMode && client.connected()) client.publish(MQTT_TOPIC_RUIDO, "ALERTA");
alertaRuido = true;
}
} else {
alertaRuido = false;
}
}
void verificarBotao() {
if (digitalRead(BUTTON_PIN) == LOW) {
delay(200);
if (!pausaSolicitada) {
pausaSolicitada = true;
tempoPausaInicio = millis();
} else {
pausaSolicitada = false;
}
}
if (pausaSolicitada && millis() - tempoPausaInicio > 15000) {
pausaSolicitada = false;
}
}
// --- LÓGICA VISUAL (OLED e LED) ---
void atualizarDisplay() {
display.clearDisplay();
if (alertaRuido) {
display.setTextSize(2);
display.setCursor(10, 20);
display.print("SILENCIO!");
display.setTextSize(1);
display.setCursor(15, 45);
display.print("Ruido muito alto");
}
else if (pausaSolicitada) {
display.setTextSize(2);
display.setCursor(30, 10);
display.print("PAUSA");
display.setTextSize(1);
display.setCursor(10, 40);
display.print("Respire fundo...");
}
else {
Tarefa atual = agenda[indiceTarefaAtual];
// Cabeçalho
display.setTextSize(1);
display.setCursor(0, 0);
display.print(atual.horario);
display.print(" - ");
display.println(atual.tipo);
display.drawLine(0, 10, 128, 10, WHITE);
// Tarefa
display.setTextSize(2);
display.setCursor(0, 25); // Ajustei um pouco a posição
display.println(atual.descricao);
// Rodapé
int proximoIndex = (indiceTarefaAtual + 1) % totalTarefas;
display.setTextSize(1);
display.setCursor(0, 55);
display.print(">> ");
display.print(agenda[proximoIndex].descricao);
}
// Indicador de Conexão no cantinho
display.setCursor(120, 0);
display.print(onlineMode ? "*" : "X");
display.display();
}
void atualizarLED() {
// Variável para debug
String estadoLED = "Desligado";
// Imprime no monitor serial a cada 2 segundos para não poluir muito
static unsigned long lastDebug = 0;
if (millis() - lastDebug > 2000) {
lastDebug = millis();
Serial.print("Status LED: ");
Serial.println(estadoLED);
}
}
// --- WIFI SEGURO (NÃO TRAVA) ---
void setup_wifi_safe() {
display.clearDisplay();
display.setCursor(0,0);
display.println("Conectando WiFi...");
display.display();
WiFi.begin(ssid, password);
// Tenta por 5 segundos (10 tentativas de 500ms)
int tentativas = 0;
while (WiFi.status() != WL_CONNECTED && tentativas < 10) {
delay(500);
Serial.print(".");
tentativas++;
}
if (WiFi.status() == WL_CONNECTED) {
onlineMode = true;
Serial.println("\nWiFi Conectado!");
} else {
onlineMode = false;
Serial.println("\nWiFi Falhou. Iniciando modo OFFLINE.");
}
}
void tentar_mqtt() {
// Tenta conectar MQTT sem travar o loop
static unsigned long lastMqttAttempt = 0;
if (millis() - lastMqttAttempt > 5000) {
lastMqttAttempt = millis();
if (client.connect("ESP32_Agenda")) {
Serial.println("MQTT Conectado!");
client.subscribe(MQTT_TOPIC_RUIDO);
}
}
}