#include <WiFi.h>
#include <WebServer.h>
#include <HTTPClient.h>
#include <ESP32Servo.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
Servo myServo;
int servoPin = 19;
int posTutup = 0;
int posBuka = 90;
WebServer server(80);
const char* thingspeakApiKey = "OUUKB0UQ9QSRWQIP";
const char* thingspeakServer = "http://api.thingspeak.com/update";
bool TiraiTerbuka = false;
unsigned long lastUpdate = 0;
const unsigned long updateInterval = 15000; // 15 detik
bool countdownAktif = false;
unsigned long countdownStart = 0;
void updateThingSpeak(int status) {
unsigned long now = millis();
if (now - lastUpdate >= updateInterval) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = String(thingspeakServer) + "?api_key=" + thingspeakApiKey + "&field1=" + String(status);
http.begin(url);
int httpCode = http.GET();
http.end();
Serial.println("ThingSpeak update, code: " + String(httpCode));
lastUpdate = now;
// Mulai countdown
countdownAktif = true;
countdownStart = millis();
}
} else {
Serial.println("Update diblokir, tunggu cooldown selesai.");
}
}
void setup() {
Serial.begin(115200);
myServo.attach(servoPin);
myServo.write(posTutup);
WiFi.begin(ssid, password);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected. IP Address: ");
Serial.println(WiFi.localIP());
server.on("/buka", HTTP_GET, []() {
if (!TiraiTerbuka) {
Serial.println("Membuka Tirai...");
myServo.write(posBuka);
TiraiTerbuka = true;
updateThingSpeak(1);
server.send(200, "text/plain", "Tirai terbuka");
} else {
server.send(200, "text/plain", "Tirai sudah terbuka");
}
});
server.on("/tutup", HTTP_GET, []() {
if (TiraiTerbuka) {
Serial.println("Menutup Tirai...");
myServo.write(posTutup);
TiraiTerbuka = false;
updateThingSpeak(0);
server.send(200, "text/plain", "Tirai tertutup");
} else {
server.send(200, "text/plain", "Tirai sudah tertutup");
}
});
server.begin();
Serial.println("Web server started!");
}
void loop() {
server.handleClient();
// Kendali via Serial Monitor
if (Serial.available()) {
String cmd = Serial.readStringUntil('\n');
cmd.trim();
if (cmd.equalsIgnoreCase("buka") && !TiraiTerbuka) {
myServo.write(posBuka);
TiraiTerbuka = true;
updateThingSpeak(1);
Serial.println("Tirai terbuka");
}
else if (cmd.equalsIgnoreCase("tutup") && TiraiTerbuka) {
myServo.write(posTutup);
TiraiTerbuka = false;
updateThingSpeak(0);
Serial.println("Tirai tertutup");
}
}
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!");
}
}
}