#include <LiquidCrystal_I2C.h>
#include <Wire.h>
// bagian pin sensor
const int sensor_suhu = 35;
const int sensor_ph = 32;
const int sensor_salinitas = 33;
const int sensor_tds = 34;
// variabel nilai sensor
int val_sensor_suhu = 0;
int val_sensor_ph = 0;
int val_sensor_salinitas = 0;
int val_sensor_tds = 0;
// bagian pin led
const int supply_pump = 16;
const int filter_pump = 17;
const int supply_valve = 25;
const int bottom_valve = 26;
const int drain_valve = 27;
// bagian button
const int power = 12;
bool power_state = false; // Menyimpan state tombol power
bool last_power_state = HIGH; // Menyimpan state terakhir tombol power
// bagian pelampung switch
const int pelampung = 14;
bool pelampung_state = false;
bool last_pelampung_state = HIGH;
// bagian lcd
LiquidCrystal_I2C lcd(0x27, 16, 2);
// bagian millis
const unsigned long readInterval = 1000; // Interval untuk membaca sensor
const unsigned long scrollInterval = 250; // Interval untuk menggeser teks pada LCD
unsigned long previousMillisRead = 0;
unsigned long previousMillisScroll = 0;
unsigned long powerOnTime = 0;
bool drainState = false;
unsigned long drainStartTime = 0;
const unsigned long powerOnDuration = 10000; // 2 menit dalam milidetik
const unsigned long drainDuration = 5000; // 20 detik dalam milidetik
String lcdMessage = "";
String lcdDisplay = "";
int scrollPosition = 0;
void setup() {
Serial.begin(115200);
pinMode(power, INPUT_PULLUP);
pinMode(sensor_suhu, INPUT);
pinMode(sensor_ph, INPUT);
pinMode(sensor_salinitas, INPUT);
pinMode(sensor_tds, INPUT);
pinMode(supply_pump, OUTPUT);
pinMode(filter_pump, OUTPUT);
pinMode(supply_valve, OUTPUT);
pinMode(bottom_valve, OUTPUT);
pinMode(drain_valve, OUTPUT);
// konfigurasi lcd
lcd.init();
lcd.backlight();
lcd.setCursor(1, 0);
lcd.print("Sistem Embedded");
delay(2000);
lcd.clear();
}
void togglePower() {
bool current_power_state = digitalRead(power);
if (current_power_state == LOW && last_power_state == HIGH) {
power_state = !power_state; // Toggle state power
delay(50); // menghindari debouncing
powerOnTime = millis(); // Catat waktu saat tombol power ditekan
}
last_power_state = current_power_state;
}
void relay(){
if (power_state) {
unsigned long currentMillis = millis();
if (currentMillis - powerOnTime < powerOnDuration) {
digitalWrite(supply_pump, HIGH); // Nyalakan supply pump
digitalWrite(filter_pump, HIGH); // Nyalakan filter pump
digitalWrite(bottom_valve, HIGH); // Nyalakan bottom valve
digitalWrite(drain_valve, LOW); // Pastikan drain valve mati
} else if (!drainState) {
digitalWrite(supply_pump, LOW); // Matikan supply pump
digitalWrite(filter_pump, LOW); // Matikan filter pump
digitalWrite(bottom_valve, LOW); // Matikan bottom valve
digitalWrite(drain_valve, HIGH); // Nyalakan drain valve
drainStartTime = currentMillis; // Catat waktu saat drain valve dinyalakan
drainState = true;
} else if (currentMillis - drainStartTime < drainDuration) {
digitalWrite(drain_valve, HIGH); // Pastikan drain valve tetap nyala
} else {
digitalWrite(drain_valve, LOW); // Matikan drain valve
digitalWrite(supply_valve, HIGH); // Nyalakan supply valve
digitalWrite(supply_pump, HIGH); // Nyalakan supply pump kembali
}
} else {
digitalWrite(supply_pump, LOW); // Matikan supply pump
digitalWrite(filter_pump, LOW); // Matikan filter pump
digitalWrite(bottom_valve, LOW); // Matikan bottom valve
digitalWrite(drain_valve, LOW); // Matikan drain valve
digitalWrite(supply_valve, LOW); // Matikan supply valve
drainState = false; // Reset state drain
}
}
void valve(){
// Semua logika katup dipindahkan ke fungsi pompa
}
void sd_card(){
//untuk mengirimkan data pembacaan sensor ke kartu memori tiap 10 menit
}
void loop() {
unsigned long currentMillis = millis();
// Memeriksa apakah tombol power ditekan
togglePower();
// Jalankan loop hanya jika power_state adalah true
if (power_state) {
// Periksa apakah sudah waktunya membaca sensor
if (currentMillis - previousMillisRead >= readInterval) {
previousMillisRead = currentMillis;
// Bagian sensor suhu
val_sensor_suhu = analogRead(sensor_suhu);
val_sensor_suhu = map(val_sensor_suhu, 0, 4095, 0, 100);
// Bagian sensor pH
val_sensor_ph = analogRead(sensor_ph);
val_sensor_ph = map(val_sensor_ph, 0, 4095, 0, 14);
// Bagian sensor salinitas
val_sensor_salinitas = analogRead(sensor_salinitas);
val_sensor_salinitas = map(val_sensor_salinitas, 0, 4095, 0, 100);
// Bagian sensor tds
val_sensor_tds = analogRead(sensor_tds);
val_sensor_tds = map(val_sensor_tds, 0, 4095, 0, 1000);
lcdMessage = "T:" + String(val_sensor_suhu) + "C pH:" + String(val_sensor_ph) + " Sal:" + String(val_sensor_salinitas) + " TDS:" + String(val_sensor_tds) + " ";
Serial.print("Temp :");
Serial.print(val_sensor_suhu);
Serial.print(" pH :");
Serial.print(val_sensor_ph);
Serial.print(" Sal :");
Serial.print(val_sensor_salinitas);
Serial.print(" Tds :");
Serial.print(val_sensor_tds);
Serial.println("");
}
// Periksa apakah sudah waktunya menggeser teks pada LCD
if (currentMillis - previousMillisScroll >= scrollInterval) {
previousMillisScroll = currentMillis;
// Menggeser teks jika panjang pesan lebih dari panjang layar LCD
int messageLength = lcdMessage.length();
if (messageLength > 16) {
scrollPosition++;
if (scrollPosition >= messageLength) {
scrollPosition = 0;
}
lcdDisplay = lcdMessage.substring(scrollPosition);
if (lcdDisplay.length() < 16) {
lcdDisplay += lcdMessage.substring(0, 16 - lcdDisplay.length());
}
lcd.setCursor(0, 0);
lcd.print(lcdDisplay);
} else {
lcd.setCursor(0, 0);
lcd.print(lcdMessage);
}
}
// Panggil fungsi untuk mengendalikan pompa dan valve
relay();
} else {
// Bersihkan LCD ketika power_state adalah false
lcd.setCursor(0, 0);
lcd.print("Depurasi Standby");
// Matikan semua pompa dan valve ketika power_state adalah false
digitalWrite(supply_pump, LOW);
digitalWrite(filter_pump, LOW);
digitalWrite(bottom_valve, LOW);
digitalWrite(drain_valve, LOW);
digitalWrite(supply_valve, LOW);
}
}