#include <Keypad.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Definisikan pin keypad
const byte ROWS = 4; // Jumlah baris pada keypad
const byte COLS = 4; // Jumlah kolom pada keypad
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; // Sambungan baris keypad ke pin Arduino
byte colPins[COLS] = {5, 4, 3, 2}; // Sambungan kolom keypad ke pin Arduino
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Definisikan pin relay
const int relay1Pin = 22; // Relay untuk solenoid valve 1 (SV 1)
const int relay2Pin = 23; // Relay untuk solenoid valve 2 (SV 2)
const int relay3Pin = 24; // Relay untuk solenoid valve 3 (SV 3)
const int relay4Pin = 25; // Relay untuk pompa 1
const int relay5Pin = 26; // Relay untuk pompa 2
const int relay6Pin = 27; // Relay untuk pompa 3
const int relay7Pin = 28; // Relay untuk motor DC
const int relay8Pin = 29; // Relay untuk aerator
// Definisikan pin sensor TDS
const int tdsSensorPin = A0;
// Inisialisasi OneWire dan DallasTemperature
OneWire oneWire(A1);
DallasTemperature sensors(&oneWire);
// Definisikan pin sensor suhu DS18B20
const int ds18b20SensorPin = 2;
// Definisikan pin sensor pH
const int phSensorPin = A2;
// Nilai standar kualitas air
const float phMin = 6.5;
const float phMax = 9.0;
const int tdsMax = 500;
const float suhuMin = 20.0;
const float suhuMax = 40.0;
// Durasi dalam milidetik
const unsigned long pompa1Durasi = 3 * 60 * 1000; // 3 menit
const unsigned long motorDCDurasi = 10 * 60 * 1000; // 10 menit
const unsigned long sv1Durasi = 3 * 60 * 1000; // 3 menit
const unsigned long filtrasiFisikDurasi = 1 * 60 * 1000; // 1 menit
const unsigned long sv2Durasi = 3 * 60 * 1000; // 3 menit
const unsigned long biofiltrasiDurasi = 10 * 60 * 1000; // 10 menit
const unsigned long pompa2Durasi = 5 * 60 * 1000; // 5 menit
// Variabel untuk menyimpan waktu mulai
unsigned long pompa1WaktuMulai = 0;
unsigned long motorDCWaktuMulai = 0;
unsigned long sv1WaktuMulai = 0;
unsigned long filtrasiFisikWaktuMulai = 0;
unsigned long sv2WaktuMulai = 0;
unsigned long biofiltrasiWaktuMulai = 0;
unsigned long pompa2WaktuMulai = 0;
// Enum untuk mengatur urutan kerja
enum State {
KEYSTART,
POMPA1,
MOTOR_DC,
SV1,
FILTRASI_FISIK,
SV2,
BIOFILTRASI,
POMPA2,
CEK_KUALITAS_AIR,
POMPA3,
SELESAI
};
State currentState = KEYSTART;
// Fungsi untuk mengaktifkan relay
void aktifkanRelay(int pin) {
digitalWrite(pin, HIGH);
}
// Fungsi untuk mematikan relay
void matikanRelay(int pin) {
digitalWrite(pin, LOW);
}
// Fungsi untuk membaca nilai TDS
int bacaTDS() {
int tdsValue = analogRead(tdsSensorPin);
return tdsValue;
}
// Fungsi untuk membaca nilai suhu air
float bacaSuhu() {
sensors.requestTemperatures();
float suhu = sensors.getTempCByIndex(0);
return suhu;
}
// Fungsi untuk membaca nilai pH
float bacaPH() {
int sensorValue = analogRead(phSensorPin);
float voltage = sensorValue * (5.0 / 1023.0);
float ph = 3.5 * voltage;
return ph;
}
void setup() {
// Inisialisasi pin relay sebagai OUTPUT
pinMode(relay1Pin, OUTPUT);
pinMode(relay2Pin, OUTPUT);
pinMode(relay3Pin, OUTPUT);
pinMode(relay4Pin, OUTPUT);
pinMode(relay5Pin, OUTPUT);
pinMode(relay6Pin, OUTPUT);
pinMode(relay7Pin, OUTPUT);
pinMode(relay8Pin, OUTPUT);
// Inisialisasi sensor suhu DS18B20
sensors.begin();
// Inisialisasi Serial Monitor
Serial.begin(9600);
}
void loop() {
switch (currentState) {
case KEYSTART:
Serial.println("Silakan tekan tombol 1 untuk memulai");
if (keypad.getKey() == '1') {
currentState = POMPA1;
Serial.println("Memulai pompa 1...");
aktifkanRelay(relay4Pin);
pompa1WaktuMulai = millis();
}
break;
case POMPA1:
if (millis() - pompa1WaktuMulai >= pompa1Durasi) {
Serial.println("Pompa 1 selesai.");
matikanRelay(relay4Pin);
currentState = MOTOR_DC;
Serial.println("Memulai motor DC...");
aktifkanRelay(relay7Pin);
motorDCWaktuMulai = millis();
}
break;
case MOTOR_DC:
if (millis() - motorDCWaktuMulai >= motorDCDurasi) {
Serial.println("Motor DC selesai.");
matikanRelay(relay7Pin);
currentState = SV1;
Serial.println("Membuka solenoid valve 1...");
aktifkanRelay(relay1Pin);
sv1WaktuMulai = millis();
}
break;
case SV1:
if (millis() - sv1WaktuMulai >= sv1Durasi) {
Serial.println("Solenoid valve 1 ditutup.");
matikanRelay(relay1Pin);
currentState = FILTRASI_FISIK;
Serial.println("Filtrasi fisik dimulai...");
filtrasiFisikWaktuMulai = millis();
}
break;
case FILTRASI_FISIK:
if (millis() - filtrasiFisikWaktuMulai >= filtrasiFisikDurasi) {
Serial.println("Filtrasi fisik selesai.");
currentState = SV2;
Serial.println("Membuka solenoid valve 2...");
aktifkanRelay(relay2Pin);
sv2WaktuMulai = millis();
}
break;
case SV2:
if (millis() - sv2WaktuMulai >= sv2Durasi) {
Serial.println("Solenoid valve 2 ditutup.");
matikanRelay(relay2Pin);
currentState = BIOFILTRASI;
Serial.println("Biofiltrasi dimulai...");
aktifkanRelay(relay8Pin);
biofiltrasiWaktuMulai = millis();
}
break;
case BIOFILTRASI:
if (millis() - biofiltrasiWaktuMulai >= biofiltrasiDurasi) {
Serial.println("Biofiltrasi selesai.");
matikanRelay(relay8Pin);
currentState = POMPA2;
Serial.println("Memulai pompa 2...");
aktifkanRelay(relay5Pin);
pompa2WaktuMulai = millis();
}
break;
case POMPA2:
if (millis() - pompa2WaktuMulai >= pompa2Durasi) {
Serial.println("Pompa 2 selesai.");
matikanRelay(relay5Pin);
currentState = CEK_KUALITAS_AIR;
Serial.println("Mengukur kualitas air...");
}
break;
case CEK_KUALITAS_AIR:
float ph = bacaPH();
int tds = bacaTDS();
float suhu = bacaSuhu();
Serial.print("Nilai pH: ");
Serial.println(ph);
Serial.print("Nilai TDS: ");
Serial.println(tds);
Serial.print("Suhu air: ");
Serial.println(suhu);
if (ph >= phMin && ph <= phMax && tds <= tdsMax && suhu >= suhuMin && suhu <= suhuMax) {
Serial.println("Kualitas air memenuhi standar. Air dialirkan ke tangki 6.");
currentState = SELESAI;
aktifkanRelay(relay3Pin);
} else {
Serial.println("Kualitas air tidak memenuhi standar. Memulai pompa 3 untuk mengulangi proses filtrasi.");
currentState = POMPA3;
aktifkanRelay(relay6Pin);
}
break;
case POMPA3:
// Lakukan pengecekan kualitas air kembali
float ph2 = bacaPH();
int tds2 = bacaTDS();
float suhu2 = bacaSuhu();
if (ph2 >= phMin && ph2 <= phMax && tds2 <= tdsMax && suhu2 >= suhuMin && suhu2 <= suhuMax) {
Serial.println("Kualitas air memenuhi standar setelah proses filtrasi ulang. Air dialirkan ke tangki 6.");
currentState = SELESAI;
matikanRelay(relay6Pin);
aktifkanRelay(relay3Pin);
}
break;
case SELESAI:
Serial.println("Program selesai.");
break;
}
}