ENERGY METER PLUS PING SUKSES

 #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