Guest User

Untitled

a guest
Jan 29th, 2026
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.95 KB | None | 0 0
  1. void handleRoot() {
  2. String html =
  3. "<!DOCTYPE html><html><head><meta charset='UTF-8'><meta name='viewport' "
  4. "content='width=device-width, initial-scale=1.0'>";
  5. html += "<title>ESP32-EVB Control</title>";
  6. html += "<style>";
  7. html += "body { font-family: 'Segoe UI', Arial, sans-serif; background: "
  8. "#f0f2f5; color: #1c1e21; display: flex; flex-direction: column; "
  9. "align-items: center; min-height: 100vh; margin: 0; padding: 20px; }";
  10. html += ".card { background: white; border-radius: 12px; box-shadow: 0 4px "
  11. "6px rgba(0,0,0,0.1); width: 100%; max-width: 400px; padding: 24px; "
  12. "margin-bottom: 20px; text-align: center; }";
  13. html += "h1 { color: #0066cc; margin-top: 0; font-weight: 600; }";
  14. html += ".status { display: inline-block; padding: 4px 12px; border-radius: "
  15. "20px; font-size: 0.9em; font-weight: bold; margin-bottom: 16px; }";
  16. html += ".connected { background: #e7f3ff; color: #1877f2; }";
  17. html += ".relay-group { display: flex; justify-content: space-around; gap: "
  18. "15px; margin-top: 20px; }";
  19. html += ".btn { border: none; border-radius: 8px; padding: 12px 24px; "
  20. "font-size: 1em; font-weight: 600; cursor: pointer; transition: "
  21. "transform 0.1s, background 0.3s; color: white; flex: 1; }";
  22. html += ".btn:active { transform: scale(0.95); }";
  23. html += ".on { background: #42b72a; } .off { background: #f02849; }";
  24. html += ".footer { color: #65676b; font-size: 0.85em; margin-top: auto; }";
  25. html += "</style></head><body>";
  26.  
  27. html += "<div class='card'>";
  28. html += "<h1>ESP32-EVB</h1>";
  29. html += "<div class='status connected'>Ethernet Connected</div>";
  30. html += "<p>Uptime: <span id='uptime'>" + String(millis() / 1000) +
  31. "</span>s</p>";
  32.  
  33. html += "<div class='relay-group'>";
  34. html +=
  35. "<button id='r1' class='btn " + String(relay1State ? "on" : "off") +
  36. "' onclick='toggle(1)'>Relay 1: " + String(relay1State ? "ON" : "OFF") +
  37. "</button>";
  38. html +=
  39. "<button id='r2' class='btn " + String(relay2State ? "on" : "off") +
  40. "' onclick='toggle(2)'>Relay 2: " + String(relay2State ? "ON" : "OFF") +
  41. "</button>";
  42. html += "</div>";
  43. html += "</div>";
  44.  
  45. html += "<div class='footer'>Olimex ESP32-EVB Control Panel</div>";
  46.  
  47. html += "<script>";
  48. html += "function toggle(id) {";
  49. html +=
  50. " fetch('/relay/' + id + '/toggle').then(r => r.json()).then(data => {";
  51. html += " const btn = document.getElementById('r' + id);";
  52. html += " btn.className = 'btn ' + (data.state ? 'on' : 'off');";
  53. html +=
  54. " btn.innerText = 'Relay ' + id + ': ' + (data.state ? 'ON' : 'OFF');";
  55. html += " });";
  56. html += "}";
  57. html += "setInterval(() => { fetch('/uptime').then(r => r.text()).then(t => "
  58. "document.getElementById('uptime').innerText = t); }, 5000);";
  59. html += "</script>";
  60.  
  61. html += "</body></html>";
  62. server.send(200, "text/html", html);
  63. }
Advertisement
Add Comment
Please, Sign In to add comment