#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi LCD
LiquidCrystal_I2C lcd(0x27, 20, 4); // Alamat I2C mungkin berbeda pada modul LCD Anda
// Pin analog untuk sensor pH, suhu, dan sensor ultrasonik HC-SR04 (Trigger dan Echo)
const int pinPh = A0;
const int pinSuhu = A1;
const int pinTrigger = A2; // Pin trigger HC-SR04
const int pinEcho = A3; // Pin echo HC-SR04
// Nilai batas untuk pH, suhu, dan ketinggian air
const float batasBawahPh = 7.0; // Batas bawah untuk pH normal
const float batasAtasPh = 7.99; // Batas atas untuk pH normal
const float batasBawahSuhu = 26.0;
const float batasAtasSuhu = 31.0;
const float batasBawahKetinggianAir = 100.0; // Batas bawah ketinggian kolam (dalam cm)
const float batasAtasKetinggianAir = 120.0; // Batas atas ketinggian kolam (dalam cm)
// Pin output untuk mengendalikan perangkat eksternal
const int pinPemanas = 2;
const int pinWaterChiller = 3;
const int pinLed1 = 4;
const int pinLed2 = 5;
const int pinPompa = 6;
const int pinLed3 = 7;
void setup() {
Serial.begin(9600);
// Inisialisasi LCD
lcd.begin(20, 4);
lcd.print("Monitoring Kolam");
delay(1000);
lcd.clear();
lcd.print("Nilai suhu :");
lcd.setCursor(0, 1);
lcd.print("Nilai pH :");
lcd.setCursor(0, 2);
lcd.print("Tinggi air :");
// Konfigurasi pin sebagai OUTPUT
pinMode(pinPemanas, OUTPUT);
pinMode(pinWaterChiller, OUTPUT);
pinMode(pinLed1, OUTPUT);
pinMode(pinLed2, OUTPUT);
pinMode(pinPompa, OUTPUT);
pinMode(pinLed3, OUTPUT);
// Konfigurasi pin untuk sensor ultrasonik
pinMode(pinTrigger, OUTPUT);
pinMode(pinEcho, INPUT);
}
float bacaSensorUltrasonik() {
digitalWrite(pinTrigger, LOW);
delayMicroseconds(2);
digitalWrite(pinTrigger, HIGH);
delayMicroseconds(10);
digitalWrite(pinTrigger, LOW);
float duration = pulseIn(pinEcho, HIGH);
float distance = (duration * 0.0343) / 2; // Menghitung jarak dalam cm
return distance;
}
void loop() {
// Baca nilai sensor pH
float pHValue = analogRead(pinPh) * 14.0 / 1024.0; // Langsung mengonversi ke pH
// Baca nilai sensor suhu
int rawSuhu = analogRead(pinSuhu);
float suhu = (rawSuhu / 1024.0) * 5000; // Konversi ke mV
suhu = suhu / 10; // Konversi ke derajat Celsius
// Baca nilai sensor ketinggian air (ultrasonik HC-SR04)
float ketinggianAir = bacaSensorUltrasonik();
// Tampilkan nilai pada LCD
lcd.setCursor(12, 0);
lcd.print(suhu, 1); // Menampilkan satu digit desimal untuk suhu
lcd.setCursor(12, 1);
lcd.print(pHValue, 2); // Menampilkan dua digit desimal untuk pH
lcd.setCursor(12, 2);
lcd.print(ketinggianAir, 1); // Menampilkan satu digit desimal untuk ketinggian air
// Inisialisasi status peringatan
bool suhuRendah = false;
bool suhuTinggi = false;
bool phRendah = false;
bool phTinggi = false;
bool airKurang = false;
bool airBerlebih = false;
// Peringatan jika suhu di luar kisaran yang diinginkan
if (suhu < batasBawahSuhu) {
lcd.setCursor(0, 3);
lcd.print("suhu rendah");
suhuRendah = true;
digitalWrite(pinPemanas, HIGH);
delay(500); // Delay 0.5 detik sebelum menampilkan peringatan berikutnya
} else if (suhu > batasAtasSuhu) {
lcd.setCursor(0, 3);
lcd.print("suhu tinggi");
suhuTinggi = true;
digitalWrite(pinWaterChiller, HIGH);
delay(500);
} else {
lcd.setCursor(0, 3);
lcd.print(" ");
digitalWrite(pinPemanas, LOW);
digitalWrite(pinWaterChiller, LOW);
}
// Peringatan jika pH di luar batas yang diinginkan
if (pHValue < batasBawahPh) {
lcd.setCursor(0, 3);
lcd.print("ph rendah");
phRendah = true;
digitalWrite(pinLed1, HIGH);
delay(500);
} else if (pHValue > batasAtasPh) {
lcd.setCursor(0, 3);
lcd.print("ph tinggi");
phTinggi = true;
digitalWrite(pinLed2, HIGH);
delay(500);
} else {
lcd.setCursor(0, 3);
lcd.print(" ");
digitalWrite(pinLed1, LOW);
digitalWrite(pinLed2, LOW);
}
// Kontrol untuk ketinggian air
if (ketinggianAir <= batasBawahKetinggianAir) {
lcd.setCursor(0, 3);
lcd.print("air rendah");
airKurang = true;
digitalWrite(pinPompa, HIGH);
delay(500);
} else if (ketinggianAir > batasAtasKetinggianAir) {
lcd.setCursor(0, 3);
lcd.print("air tinggi");
airBerlebih = true;
digitalWrite(pinPompa, LOW);
delay(500);
} else {
lcd.setCursor(0, 3);
lcd.print(" ");
digitalWrite(pinPompa, LOW);
}
// Menampilkan kondisi normal jika tidak ada peringatan
if (!suhuRendah && !suhuTinggi && !phRendah && !phTinggi && !airKurang && !airBerlebih) {
lcd.setCursor(0, 3);
lcd.print("Normal");
digitalWrite(pinLed3, HIGH);
} else {
lcd.setCursor(0, 3);
lcd.print(" ");
digitalWrite(pinLed3, LOW);
}
delay(1000); // Delay untuk mengurangi frekuensi pembacaan
}