#include <Wire.h>
#include <WiFi.h>
#include <WebServer.h>
// Configurações de Rede para o Simulador
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WebServer server(80);
const int BUTTON_PIN = 4;
bool gravando = false;
// Variáveis de Medição Simulada (Evita o erro -nan)
float Current_mA = 0;
float BusVoltage_V = 5.0; // Tensão padrão da porta USB do seu diagrama
float Power_mW = 0;
unsigned long tempoPassado = 0;
// Interface Web Completa para o TCC
const char HTML_PAGINA[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Dashboard TCC - Analisador</title>
<style>
body { font-family: 'Segoe UI', Arial, sans-serif; text-align: center; background: #f4f6f9; padding: 20px; color: #333; }
.container { max-width: 700px; margin: 0 auto; }
.btn { padding: 14px 28px; font-size: 16px; font-weight: bold; color: white; border: none; border-radius: 6px; cursor: pointer; margin: 10px; transition: 0.2s; }
.btn-start { background: #28a745; }
.btn-stop { background: #dc3545; }
.card { background: white; padding: 20px; border-radius: 10px; box-shadow: 0 4px 8px rgba(0,0,0,0.05); display: inline-block; margin: 10px; min-width: 180px; }
.valor { font-size: 26px; font-weight: bold; color: #007bff; margin-top: 5px; }
</style>
<script>
function alternarAcao(acao) { fetch('/comando?acao=' + acao); }
setInterval(function() {
fetch('/dados').then(r => r.json()).then(data => {
document.getElementById('corrente').innerText = data.corrente.toFixed(1) + " mA";
document.getElementById('potencia').innerText = data.potencia.toFixed(1) + " mW";
document.getElementById('status').innerText = data.status;
});
}, 1000);
</script>
</head>
<body>
<div class="container">
<h2>Análise de Consumo de Potência em Microcontroladores</h2>
<div class="card"><h3>Status da Medição</h3><p id="status" class="valor">Aguardando</p></div><br>
<button class="btn btn-start" onclick="alternarAcao('iniciar')">Iniciar via Web</button>
<button class="btn btn-stop" onclick="alternarAcao('pausar')">Pausar via Web</button>
<br><br>
<div class="card"><h3>Corrente do DUT</h3><p id="corrente" class="valor">0.00 mA</p></div>
<div class="card"><h3>Potência do DUT</h3><p id="potencia" class="valor">0.00 mW</p></div>
</div>
</body>
</html>
)rawliteral";
void handleRoot() { server.send(200, "text/html", HTML_PAGINA); }
void handleDados() {
String json = "{";
json += "\"corrente\":" + String(Current_mA) + ",";
json += "\"potencia\":" + String(Power_mW) + ",";
json += "\"status\":\"" + String(gravando ? "Monitorando DUT..." : "Pausado/Aguardando") + "\"";
json += "}";
server.send(200, "application/json", json);
}
void handleComando() {
if (server.hasArg("acao")) {
String acao = server.arg("acao");
if (acao == "iniciar") { gravando = true; tempoPassado = millis(); }
if (acao == "pausar") gravando = false;
}
server.send(200, "text/plain", "OK");
}
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.println("\n[SISTEMA PRONTO - MODO SIMULAÇÃO]");
Serial.print("IP para controle Web: http://"); Serial.println(WiFi.localIP());
server.on("/", handleRoot);
server.on("/dados", handleDados);
server.on("/comando", handleComando);
server.begin();
}
void loop() {
server.handleClient();
// Controle por Botão Físico
if (digitalRead(BUTTON_PIN) == LOW) {
delay(50); // Debounce
if (digitalRead(BUTTON_PIN) == LOW) {
gravando = !gravando;
if (gravando) tempoPassado = millis();
Serial.printf("Botão Físico Pressionado. Novo Estado: %s\n", gravando ? "GRAVANDO" : "PAUSADO");
while(digitalRead(BUTTON_PIN) == LOW);
}
}
// Geração de telemetria baseada no comportamento do DUT
if (gravando) {
unsigned long seg = (millis() - tempoPassado) / 1000;
if (seg % 10 < 5) {
Current_mA = 65.0 + random(-2, 3); // Consumo padrão estável do dispositivo (ex: laço principal)
} else {
Current_mA = 195.0 + random(-8, 9); // Pico de consumo (ex: acionamento de periférico/transmissão)
}
Power_mW = BusVoltage_V * Current_mA;
// Impressão limpa no Monitor Serial a cada 1 segundo
static unsigned long ultimoPrint = 0;
if (millis() - ultimoPrint >= 1000) {
ultimoPrint = millis();
Serial.printf("DUT -> Corrente: %.1fmA | Potência: %.1fmW\n", Current_mA, Power_mW);
}
} else {
Current_mA = 0;
Power_mW = 0;
}
delay(20);
}