#include <WiFi.h>
#include <HTTPClient.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#define TRIG_PIN 13
#define ECHO_PIN 27
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* serverName = "https://script.google.com/macros/s/AKfycbyoDdDMraTwneJa1TmCT5h9wZ57vJr2LUxsmqMTHBBb71T0tkzW-sFTjKwJVXTey1kNcQ/exec";
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 7 * 3600, 60000);
unsigned long lastSendTime = 0;
const unsigned long sendInterval = 15000;
float bacaJarakCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = (duration * 0.0343) / 2;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
return distance;
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("Starting...");
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
WiFi.begin(ssid, password);
Serial.print("Connecting WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected.");
timeClient.begin();
timeClient.update();
Serial.println("NTP time sync.");
}
void loop() {
if (millis() - lastSendTime >= sendInterval) {
lastSendTime = millis();
float jarak = bacaJarakCM();
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
timeClient.update();
String waktu = timeClient.getFormattedTime();
String jsonData = "{\"method\":\"append\", \"distance\":" + String(jarak) +
", \"timestamp\":\"" + waktu + "\"}";
Serial.print("Sending data...");
http.begin(serverName);
http.addHeader("Content-Type", "application/json");
int httpResponseCode = http.POST(jsonData);
Serial.println(" done. Code: " + String(httpResponseCode));
if (httpResponseCode == HTTP_CODE_FOUND) {
String redirectUrl = http.getLocation();
http.end();
Serial.print("Redirect to: ");
Serial.println(redirectUrl);
Serial.print("Retrying POST...");
http.begin(redirectUrl);
http.addHeader("Content-Type", "application/json");
int redirectResponseCode = http.POST(jsonData);
Serial.println(" done. Code: " + String(redirectResponseCode));
if (redirectResponseCode > 0) {
Serial.println("Data sent OK via redirect.");
} else {
Serial.println("Redirect retry failed.");
}
} else if (httpResponseCode > 0) {
Serial.println("Data sent OK.");
} else {
Serial.println("Send failed.");
}
if (httpResponseCode != HTTP_CODE_FOUND) {
http.end();
}
} else {
Serial.println("WiFi disconnected.");
}
}
}