#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <NusabotSimpleTimer.h>
NusabotSimpleTimer timer;
#define DHTPIN 4 // Pin GPIO 4 untuk sensor DHT22
#define DHTTYPE DHT22 // Tipe sensor DHT22
DHT dht(DHTPIN, DHTTYPE); // Inisialisasi sensor DHT
LiquidCrystal_I2C lcd(0x27, 20, 4); // Inisialisasi LCD dengan alamat I2C 0x27 dan ukuran 20x4
int sensorPin = 34; // Pin GPIO 34 untuk sensor kelembaban tanah
int relayPin1 = 27; // Pin GPIO 27 untuk pompa
int relayPin2 = 26; // Pin GPIO 26 untuk kipas
int relayLampu = 32; // Pin GPIO 32 untuk lampu tanaman
int relayFan = 33; // Pin GPIO 33 untuk kipas sirkulasi udara (diganti dari GPIO 4)
int buzzerPin = 5; // Pin GPIO 5 untuk buzzer
int ldrPin = 25; // Pin GPIO 25 untuk LDR
int ldrValue = 0; // Variabel untuk menyimpan nilai LDR
String statusLampu = "OFF"; // Status lampu
String statusPompa = "OFF"; // Status pompa
String ket = ""; // Variabel untuk menyimpan keterangan
void setLCD() {
lcd.init();
lcd.backlight();
}
void setup() {
Serial.begin(115200);
dht.begin();
setLCD();
pinMode(relayPin1, OUTPUT);
pinMode(relayPin2, OUTPUT);
pinMode(relayLampu, OUTPUT); // Atur mode pin untuk lampu
pinMode(relayFan, OUTPUT); // Atur mode pin untuk kipas sirkulasi udara
pinMode(buzzerPin, OUTPUT); // Atur mode pin untuk buzzer
pinMode(ldrPin, INPUT); // Set LDR sebagai input
}
void loop() {
// Baca nilai analog dari sensor kelembaban tanah
int sensor_analog = analogRead(sensorPin);
float kelembaban_tanah = 100 - ((sensor_analog / 4095.00) * 100);
// Baca suhu dari sensor DHT22
float suhu = dht.readTemperature();
// Baca nilai dari LDR
ldrValue = analogRead(ldrPin);
// Debugging nilai
Serial.print("Nilai LDR: ");
Serial.println(ldrValue);
Serial.print("Kelembaban Tanah: ");
Serial.println(kelembaban_tanah);
Serial.print("Suhu: ");
Serial.println(suhu);
// Update tampilan LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Klb Tnh: " + String(kelembaban_tanah, 2) + "%");
lcd.setCursor(0, 1);
lcd.print("Suhu: " + String(suhu, 2) + (char)223 + "C");
// Logika pengendalian berdasarkan kelembaban tanah
if (kelembaban_tanah < 60.0) {
ket = "Tanah Kering";
digitalWrite(relayPin1, LOW); // Aktifkan pompa
digitalWrite(relayPin2, HIGH); // Matikan kipas
digitalWrite(buzzerPin, HIGH); // Aktifkan buzzer
statusPompa = "ON";
} else if (kelembaban_tanah >= 60.0 && kelembaban_tanah <= 80.0 && suhu >= 18.0 && suhu <= 27.0) {
ket = "Tanah Normal";
digitalWrite(relayPin1, HIGH); // Matikan pompa
digitalWrite(relayPin2, LOW); // Matikan kipas
digitalWrite(buzzerPin, LOW); // Matikan buzzer
statusPompa = "OFF";
} else {
ket = "Terlalu Basah!";
digitalWrite(relayPin1, HIGH); // Matikan pompa
digitalWrite(relayPin2, HIGH); // Nyalakan kipas
digitalWrite(buzzerPin, LOW); // Matikan buzzer
statusPompa = "OFF";
}
// Logika untuk mengatur lampu berdasarkan nilai LDR
if (ldrValue < 500) { // Angka 500 bisa disesuaikan berdasarkan pengujian
digitalWrite(relayLampu, HIGH); // Nyalakan lampu
statusLampu = "ON";
} else {
digitalWrite(relayLampu, LOW); // Matikan lampu
statusLampu = "OFF";
}
// Logika pengendalian kipas sirkulasi udara untuk mendinginkan
if (suhu > 27.0) {
digitalWrite(relayFan, LOW); // Aktifkan kipas sirkulasi udara jika suhu di atas 27°C (mendinginkan)
} else if (suhu < 18.0) {
digitalWrite(relayFan, HIGH); // Matikan kipas sirkulasi udara jika suhu di bawah 18°C (terlalu dingin)
} else {
digitalWrite(relayFan, HIGH); // Matikan kipas di suhu antara 18°C hingga 27°C (suhu optimal)
}
// Tampilkan keterangan di LCD
lcd.setCursor(0, 2); // Baris ketiga untuk keterangan
lcd.print("KT: " + ket);
// Tampilkan status di Serial Monitor
Serial.print("Status Pompa: ");
Serial.println(statusPompa);
Serial.print("Status Lampu: ");
Serial.println(statusLampu);
Serial.print("Status Kipas Sirkulasi: ");
Serial.println(digitalRead(relayFan) == LOW ? "ON" : "OFF");
delay(1000); // Delay untuk refresh tampilan
}