#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#include <Wire.h>
#include <RTClib.h>
#include <WiFi.h>
#include <HTTPClient.h>
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4);
const char* server = "http://fishfeeder.infinityfreeapp.com/public/log/postLog";
const char *ssid = "Wokwi-GUEST";
const char *password = "";
const int oneWirePin = 26;
const int servoPin = 27;
const int ldrPin = 34;
const int ldrThreshold = 2000;
const float gama = 0.7;
const float rl10 = 50;
Servo servo;
unsigned long previousSecondMillis = 0;
unsigned long previousMinuteMillis = 0;
const long intervalSecond = 1000;
const long intervalMinute = 60000;
int statusId;
void setup() {
Serial.begin(9600);
pinMode(ldrPin, INPUT);
lcd.init();
lcd.backlight();
servo.attach(servoPin);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
} else {
Serial.println("RTC is running with correct time.");
}
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to WiFi");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
DateTime time = rtc.now();
char buf[6];
snprintf(buf, sizeof(buf), "%02d:%02d", time.hour(), time.minute());
int nilaiLDR = analogRead(ldrPin);
nilaiLDR = map(nilaiLDR, 4095, 0, 1024, 0); // mengubah nilai pembacaan sensor LDR dari nilai ADC arduino menjadi nilai ADC ESP32
float voltase = nilaiLDR / 1024.0 * 5.0;
float resistansi = 2000.0 * voltase / (1.0 - voltase / 5.0);
float kecerahan = pow(rl10 * 1e3 * pow(10, gama) / resistansi, (1 / gama));
unsigned long currentMillis = millis();
if (currentMillis - previousSecondMillis >= intervalSecond) {
previousSecondMillis = currentMillis;
lcd.setCursor(0,0);
lcd.print("Tanggal:");
lcd.setCursor(9,0);
lcd.print(time.timestamp(DateTime::TIMESTAMP_DATE));
lcd.setCursor(0,1);
lcd.print("Waktu :");
lcd.setCursor(9,1);
lcd.print(buf);
lcd.setCursor(0,2);
lcd.print("Kecerahan (Lux): ");
lcd.setCursor(0, 3);
lcd.print(String(kecerahan));
}
if (currentMillis - previousMinuteMillis >= intervalMinute) {
previousMinuteMillis = currentMillis;
Serial.print("Kecerahan: ");
Serial.println(kecerahan);
bool waterClear = kecerahan > ldrThreshold;
if (WiFi.status() == WL_CONNECTED) {
WiFiClient client;
HTTPClient http;
if (waterClear){
for (int i = 0; i < 3; i++) {
servo.write(0);
delay(1000);
servo.write(180);
delay(1000);
}
statusId = 1;
} else {
statusId = 2;
}
String postData = "tingkat_kekeruhan=" + String(kecerahan) +
"&status_id=" + String(statusId) +
"&tanggal_waktu=" + time.timestamp(DateTime::TIMESTAMP_DATE) +
"%20" + time.timestamp(DateTime::TIMESTAMP_TIME);
http.begin(client, server);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
Serial.println(postData);
int httpResponseCode = http.POST(postData);
// String serverPath = String(server) + "tingkat_kekeruhan=" + String(kecerahan)
// + "&status_id=" + String(statusId)
// + "&tanggal_waktu=" + time.timestamp(DateTime::TIMESTAMP_DATE)
// + "%20" + time.timestamp(DateTime::TIMESTAMP_TIME);
// Serial.println(serverPath);
// http.begin(client, serverPath.c_str());
// http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
} else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("WiFi Disconnected");
}
}
delay(500);
}