#include <OneWire.h>
#include <DallasTemperature.h>
// Pin definisi
#define TRIG_PIN 9
#define ECHO_PIN 10
#define RELAY_PIN 7
#define ONE_WIRE_BUS 2 // Pin data DS18B20 terhubung ke pin 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
const int waterLevelThreshold = 30; // Threshold level air dalam cm
const unsigned long maxPumpTime = 300000; // 16 jam dalam milidetik
const unsigned long cooldownTime = 300000; // 8 jam dalam milidetik
unsigned long startTime;
unsigned long pumpOffTime = 0; // Waktu ketika pompa dimatikan
bool pumpRunning = false;
bool inCooldown = false;
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
Serial.begin(9600);
}
void loop() {
sensors.requestTemperatures(); // Meminta suhu dari sensor DS18B20
float temperature = sensors.getTempCByIndex(0); // Membaca suhu dalam °C
// Hitung kecepatan suara berdasarkan suhu
float speedOfSound = 331.3 + (0.606 * temperature); // Kecepatan suara dalam m/s
float soundSpeedCmPerMicrosecond = speedOfSound / 10000; // Konversi ke cm/µs
long duration, distance;
// Mengirimkan sinyal trigger
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Membaca sinyal echo
duration = pulseIn(ECHO_PIN, HIGH);
// Menghitung jarak berdasarkan kecepatan suara yang dinamis
distance = (duration * soundSpeedCmPerMicrosecond) / 2;
// Tampilkan hasil ke Serial Monitor
Serial.print("Suhu: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Kecepatan suara: ");
Serial.print(speedOfSound);
Serial.println(" m/s");
// Output jarak ke serial monitor
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// Cek jika sistem berada dalam cooldown periode
if (inCooldown) {
if (millis() - pumpOffTime >= cooldownTime) {
inCooldown = false; // Jika 8 jam sudah lewat, keluar dari cooldown
} else {
Serial.print("Cooldown: ");
unsigned long remainingCooldown = cooldownTime - (millis() - pumpOffTime);
unsigned long hoursCooldown = remainingCooldown / 3600000;
unsigned long minutesCooldown = (remainingCooldown % 3600000) / 60000;
unsigned long secondsCooldown = (remainingCooldown % 60000) / 1000;
if (hoursCooldown < 10) Serial.print("0");
Serial.print(hoursCooldown);
Serial.print(":");
if (minutesCooldown < 10) Serial.print("0");
Serial.print(minutesCooldown);
Serial.print(":");
if (secondsCooldown < 10) Serial.print("0");
Serial.println(secondsCooldown);
delay(1000); // Delay sebelum pengecekan berikutnya
return;
}
}
// Cek apakah level air melebihi threshold dan pompa tidak berjalan
if (distance <= waterLevelThreshold && !pumpRunning && !inCooldown) {
pumpRunning = true;
startTime = millis();
digitalWrite(RELAY_PIN, HIGH); // Nyalakan pompa
Serial.println("Pump ON");
}
// Jika pompa berjalan, tampilkan sisa waktu hingga pompa mati
if (pumpRunning) {
unsigned long elapsedTime = millis() - startTime;
unsigned long remainingTime = maxPumpTime - elapsedTime;
// Konversi waktu sisa menjadi jam dan menit
unsigned long hoursRemaining = remainingTime / 3600000;
unsigned long minutesRemaining = (remainingTime % 3600000) / 60000;
unsigned long secondsRemaining = (remainingTime % 60000) / 1000;
Serial.print("Time left:");
if (hoursRemaining < 10) Serial.print("0");
Serial.print(hoursRemaining);
Serial.print(":");
if (minutesRemaining < 10) Serial.print("0");
Serial.print(minutesRemaining);
Serial.print(":");
if (secondsRemaining < 10) Serial.print("0");
Serial.println(secondsRemaining);
}
// Cek jika pompa sudah berjalan selama 16 jam atau level air turun di bawah threshold
if (pumpRunning) {
if (millis() - startTime >= maxPumpTime || distance > waterLevelThreshold) {
pumpRunning = false;
pumpOffTime = millis(); // Catat waktu ketika pompa dimatikan
inCooldown = true; // Masuk ke mode cooldown
digitalWrite(RELAY_PIN, LOW); // Matikan pompa
Serial.println("Pump OFF, entering cooldown");
}
}
delay(1000); // Delay 1 detik sebelum pengecekan berikutnya
}