#include <WiFi.h>
#include <WebServer.h>
#include <HTTPClient.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
String writeAPIKey = "4OXS308W9OG4KTHH";
String serverTS = "http://api.thingspeak.com/update?api_key=";
const int ledPin1 = 19;
const int ledPin2 = 18;
const int ledPin3 = 5;
const int ledPin4 = 17;
const int btn1 = 16;
const int btn2 = 4;
const int btn3 = 0;
const int btn4 = 2;
int lastBtn1 = HIGH, lastBtn2 = HIGH, lastBtn3 = HIGH, lastBtn4 = HIGH;
WebServer server(80);
String htmlPage =
"<!DOCTYPE html><html><head><title>ESP32 LED Control</title></head><body>"
"<h2>Kontrol LED IoT (ESP32 + ThingSpeak)</h2>"
"<form action='/led' method='POST'>"
"<button name='nyala_1'>NYALAKAN LED 1</button>"
"<button name='mati_1'>MATIKAN LED 1</button><br><br>"
"<button name='nyala_2'>NYALAKAN LED 2</button>"
"<button name='mati_2'>MATIKAN LED 2</button><br><br>"
"<button name='nyala_3'>NYALAKAN LED 3</button>"
"<button name='mati_3'>MATIKAN LED 3</button><br><br>"
"<button name='nyala_4'>NYALAKAN LED 4</button>"
"<button name='mati_4'>MATIKAN LED 4</button><br><br>"
"</form></body></html>";
// ===== Variabel countdown =====
unsigned long lastUpdate = 0;
const unsigned long updateInterval = 15000; // 15 detik
bool countdownAktif = false;
unsigned long countdownStart = 0;
void updateThingSpeak(int field, int value) {
unsigned long now = millis();
if (now - lastUpdate >= updateInterval) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = serverTS + writeAPIKey + "&field" + String(field) + "=" + String(value);
http.begin(url);
int httpCode = http.GET();
if (httpCode > 0) {
Serial.println("ThingSpeak updated: field" + String(field) + " = " + String(value));
} else {
Serial.println("Error updating ThingSpeak");
}
http.end();
lastUpdate = now;
// mulai countdown
countdownAktif = true;
countdownStart = millis();
}
} else {
Serial.println("Update diblokir, tunggu cooldown selesai.");
}
}
void setup() {
Serial.begin(115200);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
pinMode(btn1, INPUT_PULLUP);
pinMode(btn2, INPUT_PULLUP);
pinMode(btn3, INPUT_PULLUP);
pinMode(btn4, INPUT_PULLUP);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Connected!");
Serial.print("IP ESP32: ");
Serial.println(WiFi.localIP());
server.on("/", HTTP_GET, []() {
server.send(200, "text/html", htmlPage);
});
server.on("/led", HTTP_POST, []() {
if (server.hasArg("nyala_1")) {
digitalWrite(ledPin1, HIGH);
updateThingSpeak(1, 1);
} else if (server.hasArg("mati_1")) {
digitalWrite(ledPin1, LOW);
updateThingSpeak(1, 0);
} else if (server.hasArg("nyala_2")) {
digitalWrite(ledPin2, HIGH);
updateThingSpeak(2, 1);
} else if (server.hasArg("mati_2")) {
digitalWrite(ledPin2, LOW);
updateThingSpeak(2, 0);
} else if (server.hasArg("nyala_3")) {
digitalWrite(ledPin3, HIGH);
updateThingSpeak(3, 1);
} else if (server.hasArg("mati_3")) {
digitalWrite(ledPin3, LOW);
updateThingSpeak(3, 0);
} else if (server.hasArg("nyala_4")) {
digitalWrite(ledPin4, HIGH);
updateThingSpeak(4, 1);
} else if (server.hasArg("mati_4")) {
digitalWrite(ledPin4, LOW);
updateThingSpeak(4, 0);
}
server.send(200, "text/html", htmlPage);
});
server.begin();
Serial.println("Web server started!");
}
void loop() {
server.handleClient();
int btnState1 = digitalRead(btn1);
if (btnState1 == LOW && lastBtn1 == HIGH) {
digitalWrite(ledPin1, !digitalRead(ledPin1));
updateThingSpeak(1, digitalRead(ledPin1));
}
lastBtn1 = btnState1;
int btnState2 = digitalRead(btn2);
if (btnState2 == LOW && lastBtn2 == HIGH) {
digitalWrite(ledPin2, !digitalRead(ledPin2));
updateThingSpeak(2, digitalRead(ledPin2));
}
lastBtn2 = btnState2;
int btnState3 = digitalRead(btn3);
if (btnState3 == LOW && lastBtn3 == HIGH) {
digitalWrite(ledPin3, !digitalRead(ledPin3));
updateThingSpeak(3, digitalRead(ledPin3));
}
lastBtn3 = btnState3;
int btnState4 = digitalRead(btn4);
if (btnState4 == LOW && lastBtn4 == HIGH) {
digitalWrite(ledPin4, !digitalRead(ledPin4));
updateThingSpeak(4, digitalRead(ledPin4));
}
lastBtn4 = btnState4;
// ===== countdown display =====
if (countdownAktif) {
unsigned long elapsed = millis() - countdownStart;
int detikSisa = updateInterval / 1000 - elapsed / 1000;
if (detikSisa >= 0) {
static int lastShown = -1;
if (detikSisa != lastShown) {
Serial.println("Cooldown: " + String(detikSisa) + " detik");
lastShown = detikSisa;
}
} else {
countdownAktif = false;
Serial.println("Siap update lagi!");
}
}
}