#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h> // Impor pustaka DHT22
#define DHTPIN 19 // Pin sinyal DHT22
// Inisialisasi objek DHT22
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Inisialisasi objek LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Pin definisi untuk sensor ultrasonik dan relay
const int trigPin_A = 5;
const int echoPin_A = 18;
const int trigPin_P = 16;
const int echoPin_P = 17;
int release_A = 25;
int release_P = 27;
int filling_A = 26;
int filling_P = 13;
int waterpump = 33;
int fan = 32;
//indikator & buzzer level Air/Pestisida
const int indikator = 23;
// Rentang tinggi air dalam tangki (dalam cm)
const int minTinggi_A = 10;
const int maxTinggi_A = 2;
const int minTinggi_P = 10;
const int maxTinggi_P = 2;
// Waktu terakhir solenoid valve aktif
unsigned long lastActivationTime_P = 0;
// Waktu tunggu antara aktivasi solenoid valve (dalam milidetik) - 12 jam (dalam milidetik)
const unsigned long activationInterval_P = 15000; //12 * 60 * 60 * 1000;
void setup()
{
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Inisialisasi pin untuk sensor ultrasonik
pinMode(trigPin_A, OUTPUT);
pinMode(echoPin_A, INPUT);
pinMode(trigPin_P, OUTPUT);
pinMode(echoPin_P, INPUT);
// Inisialisasi pin untuk relay
pinMode(release_A, OUTPUT);
pinMode(release_P, OUTPUT);
pinMode(filling_A, OUTPUT);
pinMode(filling_P, OUTPUT);
pinMode(waterpump, OUTPUT);
pinMode(fan, OUTPUT);
// Indikator & buzzer Pin Relay
pinMode(indikator, OUTPUT);
// Inisialisasi Serial Monitor untuk debug
Serial.begin(9600);
// Inisialisasi sensor DHT22
dht.begin();
}
void loop()
{
// Variabel untuk menyimpan waktu pantulan gelombang ultrasonik
long duration_A, cm_A;
// Mengirimkan sinyal ultrasonik
digitalWrite(trigPin_A, LOW);
delayMicroseconds(2);
digitalWrite(trigPin_A, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin_A, LOW);
// Menerima waktu pantulan gelombang ultrasonik
duration_A = pulseIn(echoPin_A, HIGH);
// Menghitung ketinggian air dalam cm
cm_A = duration_A * 0.034 / 2;
// Variabel untuk menyimpan waktu pantulan gelombang ultrasonik
long duration_P, cm_P;
// Mengirimkan sinyal ultrasonik
digitalWrite(trigPin_P, LOW);
delayMicroseconds(2);
digitalWrite(trigPin_P, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin_P, LOW);
// Menerima waktu pantulan gelombang ultrasonik
duration_P = pulseIn(echoPin_P, HIGH);
// Menghitung ketinggian air dalam cm
cm_P = duration_P * 0.034 / 2;
// Menampilkan ketinggian air di Serial Monitor
Serial.print("Ketinggian Air: ");
Serial.print(cm_A);
Serial.println(" cm");
Serial.print("Ketinggian Air Pestisida: ");
Serial.print(cm_P);
Serial.println(" cm");
// Membaca data suhu dan kelembaban dari sensor DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Menampilkan data suhu dan kelembaban di Serial Monitor
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" *C");
delay(1000);
// Menghitung persentase ketinggian air dalam tangki
int persentase_A = map(cm_A, minTinggi_A, maxTinggi_A, 0, 100);
int persentase_P = map(cm_P, minTinggi_P, maxTinggi_P, 0, 100);
// Menampilkan hasil di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Stock Air:");
lcd.print(persentase_A);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Stock Pestisida:");
lcd.print(persentase_P);
lcd.print("%");
lcd.setCursor(0, 2);
lcd.print("Humidity:");
lcd.print(humidity);
lcd.print("%");
lcd.setCursor(0, 3);
lcd.print("Temperature:");
lcd.print(temperature);
lcd.print("*C");
//spray air non pestisida
if(temperature > 30 && humidity <= 50)
{
digitalWrite(waterpump, HIGH);
if(digitalRead(release_P) == LOW)
{
digitalWrite(release_A, HIGH);
}
//Kontrol spray pestisida terjadwal
unsigned long currentTime_P = millis();
if (currentTime_P - lastActivationTime_P >= activationInterval_P)
{
digitalWrite(waterpump, HIGH);
digitalWrite(release_P, HIGH);
digitalWrite(release_A, LOW);
lastActivationTime_P = currentTime_P; // Perbarui waktu terakhir solenoid valve aktif
}
else if(digitalRead(release_P) == HIGH && currentTime_P - lastActivationTime_P >= 5000)
{
// Matikan relay setelah 5 detik
digitalWrite(release_P, LOW);
digitalWrite(waterpump, LOW);
lastActivationTime_P = currentTime_P;
}
delay(500); // Delay untuk mengurangi frekuensi pembacaan
}
else if(temperature <= 28)
{
digitalWrite(waterpump, LOW);
digitalWrite(release_A, LOW);
}
//fan humidity
if(humidity >= 60 && temperature >= 30)
{
digitalWrite(fan, HIGH);
}
else if(humidity <= 50)
{
digitalWrite(fan, LOW);
}
// Buzzer indikator level vitamin & pestisida
if (persentase_A <= 25 && persentase_P > 25)
{
digitalWrite(filling_A, HIGH);
digitalWrite(filling_P, LOW);
}
else if (persentase_P <= 25 && persentase_A > 25)
{
digitalWrite(filling_A, LOW);
digitalWrite(filling_P, HIGH);
}
else if (persentase_A <= 25 && persentase_P <= 25)
{
digitalWrite(filling_A, HIGH);
digitalWrite(filling_P, HIGH);
}
else
{
digitalWrite(filling_A, persentase_A >= 100 ? LOW : HIGH);
digitalWrite(filling_P, persentase_P >= 100 ? LOW : HIGH);
}
if(persentase_P >= 90)
{
digitalWrite(indikator, HIGH);
}
else if(persentase_P < 90)
{
digitalWrite(indikator, LOW);
}
}