#include <WiFi.h>
#include <WebServer.h>
#include <ESPmDNS.h>
// --- KONFIGURASI WIFI ---
const char* ssid = "Dara@home";
const char* password = "rejeki88";
const char* mdnsHostname = "glosindo-server";
// --- PING STATS ---
const char* pingHost = "google.com";
float lastPingTimeMs = 0.0;
bool isInternetConnected = false;
unsigned long lastPingAttemptTime = 0;
const long pingInterval = 5000;
// --- WEB SERVER ---
WebServer server(8888);
// --- SENSOR & ENERGI ---
float voltage = 0, current = 0, power = 0;
float energyWhPerSecond = 0, energyWhPerMinute = 0, energyWhPerHour = 0, energyWhPerDay = 0, totalEnergyWh = 0;
unsigned long lastSensorReadTime = 0;
const long sensorReadInterval = 2000;
unsigned long lastEnergyCalcTime = 0;
const long energyCalcInterval = 1000;
unsigned long lastDayChangeTime = 0;
// --- FUNGSI UTAMA ---
void readSensors() {
voltage = random(2200, 2400) / 10.0;
current = random(50, 200) / 100.0;
power = voltage * current;
Serial.printf("Sensor: V=%.2f V, I=%.2f A, P=%.2f W\n", voltage, current, power);
}
void updateEnergyConsumption() {
unsigned long now = millis();
if (now - lastEnergyCalcTime >= energyCalcInterval) {
float deltaHours = (now - lastEnergyCalcTime) / 3600000.0;
float e = power * deltaHours;
totalEnergyWh += e;
energyWhPerSecond = power / 3600.0;
energyWhPerMinute = power / 60.0;
energyWhPerHour = power;
energyWhPerDay += e;
lastEnergyCalcTime = now;
Serial.printf("Energi: total %.2f Wh, hour rate %.2f Wh/h, daily %.2f Wh/day\n",
totalEnergyWh, energyWhPerHour, energyWhPerDay);
}
}
void performPing() {
if (WiFi.status() != WL_CONNECTED) {
isInternetConnected = false;
Serial.println("WiFi belum terhubung");
return;
}
IPAddress ip;
if (!WiFi.hostByName(pingHost, ip)) {
isInternetConnected = false;
Serial.println("DNS resolve gagal");
return;
}
WiFiClient client;
unsigned long start = millis();
if (client.connect(ip, 80)) {
lastPingTimeMs = millis() - start;
isInternetConnected = true;
Serial.printf("Ping %s: %.2f ms\n", pingHost, lastPingTimeMs);
client.stop();
} else {
lastPingTimeMs = 0;
isInternetConnected = false;
Serial.printf("Ping ke %s gagal\n", pingHost);
}
}
// --- HANDLER WEB ---
void handleRoot() {
String html = R"rawliteral(
<!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Glosindo Power Monitor</title>
<style>
body { font-family: Arial; text-align:center; background:#f4f4f4; margin:0;}
.header { background:#4CAF50;color:#fff;padding:15px;font-size:24px;}
.card-container { display:flex; flex-wrap: wrap; justify-content:center; padding:20px; }
.card { background:#fff;border-radius:8px;margin:10px;padding:20px;width:260px;text-align:left;
box-shadow:0 4px 8px rgba(0,0,0,0.1);}
.card h2 { margin:0;color:#333; }
.value { font-size:2em;color:#007bff; }
.status-online { color:#28a745; font-weight:bold;}
.status-offline { color:#dc3545; font-weight:bold;}
</style></head><body>
<div class="header">Glosindo Power & Network Monitor</div>
<div class="card-container">
<div class="card"><h2>Tegangan</h2><div class="value"><span id="voltageVal">0</span> V</div></div>
<div class="card"><h2>Arus</h2><div class="value"><span id="currentVal">0</span> A</div></div>
<div class="card"><h2>Daya</h2><div class="value"><span id="powerVal">0</span> W</div></div>
<div class="card"><h2>Rate Jam</h2><div class="value"><span id="energyHourlyRateVal">0</span> Wh/h</div></div>
<div class="card"><h2>Akumulasi Harian</h2><div class="value"><span id="energyDailyAccVal">0</span> Wh</div></div>
<div class="card"><h2>Total Energi</h2><div class="value"><span id="totalEnergyVal">0</span> Wh</div></div>
<div class="card"><h2>Status Jaringan</h2>
<div id="internetStatus">...</div><div><span id="pingTime">0</span> ms</div>
</div>
</div>
<script>
function updateSensorData() {
fetch('/data').then(r=>r.json()).then(d=>{
document.getElementById('voltageVal').innerText = d.voltage.toFixed(2);
document.getElementById('currentVal').innerText = d.current.toFixed(2);
document.getElementById('powerVal').innerText = d.power.toFixed(2);
document.getElementById('energyHourlyRateVal').innerText = d.energyWhPerHour.toFixed(2);
document.getElementById('energyDailyAccVal').innerText = d.energyWhPerDay.toFixed(2);
document.getElementById('totalEnergyVal').innerText = d.totalEnergy.toFixed(2);
let st = document.getElementById('internetStatus');
let pt = document.getElementById('pingTime');
if (d.isInternetConnected) {
st.innerText = 'ONLINE'; st.className='status-online';
pt.innerText = d.lastPingTimeMs.toFixed(0);
} else {
st.innerText = 'OFFLINE'; st.className='status-offline';
pt.innerText = '—';
}
}).catch(console.error);
}
setInterval(updateSensorData, 2000);
updateSensorData();
</script>
</body></html>
)rawliteral";
server.send(200, "text/html", html);
}
void handleData() {
String json = "{";
json += "\"voltage\":" + String(voltage) + ",";
json += "\"current\":" + String(current) + ",";
json += "\"power\":" + String(power) + ",";
json += "\"energyWhPerHour\":" + String(energyWhPerHour) + ",";
json += "\"energyWhPerDay\":" + String(energyWhPerDay) + ",";
json += "\"totalEnergy\":" + String(totalEnergyWh) + ",";
json += "\"lastPingTimeMs\":" + String(lastPingTimeMs) + ",";
json += "\"isInternetConnected\":" + String(isInternetConnected ? "true" : "false");
json += "}";
server.send(200, "application/json", json);
}
// --- SETUP & LOOP ---
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("Menghubungkan ke Wi‑Fi");
while (WiFi.status() != WL_CONNECTED) {
delay(500); Serial.print(".");
}
Serial.printf("\nTerhubung! IP: %s\n", WiFi.localIP().toString().c_str());
if (MDNS.begin(mdnsHostname)) {
MDNS.addService("http", "tcp", 8888);
Serial.printf("mDNS aktif: http://%s.local:8888\n", mdnsHostname);
}
server.on("/", handleRoot);
server.on("/data", handleData);
server.begin();
randomSeed(micros());
readSensors();
lastSensorReadTime = lastEnergyCalcTime = lastDayChangeTime = millis();
performPing();
lastPingAttemptTime = millis();
}
void loop() {
server.handleClient();
if (millis() - lastSensorReadTime >= sensorReadInterval) {
readSensors();
lastSensorReadTime = millis();
}
updateEnergyConsumption();
if (millis() - lastPingAttemptTime >= pingInterval) {
performPing();
lastPingAttemptTime = millis();
}
if (millis() - lastDayChangeTime >= 86400000UL) {
energyWhPerDay = 0;
lastDayChangeTime = millis();
Serial.println("Reset energi harian.");
}
}
Comments
Post a Comment