#include <Wire.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 15 // Pin tempat terhubungnya sensor DHT22
#define DHTTYPE DHT22 // Tipe sensor DHT yang digunakan
DHT dht(DHTPIN, DHTTYPE);
#define LDRPIN 14 // Pin tempat terhubungnya sensor LDR
#define SOILPIN 34 // Pin tempat terhubungnya sensor kelembaban tanah
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C dan ukuran LCD
float temp, hum, lux, soil;
const float gama = 0.7;
const float rl10 = 50;
void setup() {
Serial.begin(9600);
pinMode(LDRPIN, INPUT);
pinMode(DHTPIN, INPUT);
pinMode(SOILPIN, INPUT);
Wire.begin();
Serial.println("Smart Plant Monitoring System");
dht.begin();
lcd.init();
lcd.backlight();
lcd.print("Menyiapkan...");
delay(2000);
lcd.clear();
}
void loop() {
//Data Sensor DHT22
temp = dht.readTemperature();
hum = dht.readHumidity();
Serial.print("Suhu : " + String(temp, 2) + " °C");
Serial.println("Kelembaban : " + String(hum, 1) + " %");
//Data Sensor LDR Cahaya
int ldrValue = analogRead(LDRPIN);
ldrValue = map(ldrValue, 4095, 0, 1024, 0); //mengubah nilai pembacaan sensor LDR dari nilai ADC arduino menjadi nilai ADC ESP32
float ldrVoltage = ldrValue / 1024.*5;
float ldrResistance = 2000 * ldrVoltage / (1-ldrVoltage/5);
lux = pow(rl10*1e3*pow(10,gama)/ldrResistance,(1/gama));
Serial.println("Kecerahan : " + String(lux, 3) + " Lux");
String luxmsg = lux < 807 ? "Kurang" : lux > 808 && lux < 1614? "Medium" : "Tinggi";
//Data Sensor Soil Moisture
int16_t i = analogRead(SOILPIN);
String msg = i < 2165 ? "WET" : i > 3135 ? "DRY" : "OK";
//Relay untuk air berdasarkan kondisi soil moisture
// Kondisi Tanah
lcd.setCursor(0,0);
lcd.print("Tanah:");
lcd.setCursor(9,0);
lcd.print(msg);
if (lux < 807){
lcd.setCursor(0,1);
lcd.print("Kecerahan: ");
lcd.setCursor(10,1);
lcd.print(luxmsg);
}
else if (lux > 808 && lux < 1614){
lcd.setCursor(0,1);
lcd.print("Kecerahan: ");
lcd.setCursor(10,1);
lcd.print(luxmsg);
}
else{
lcd.setCursor(0,1);
lcd.print("Kecerahan: ");
lcd.setCursor(10,1);
lcd.print(luxmsg);
}
delay(2000);
// Suhu
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Suhu :");
lcd.setCursor(10,0);
lcd.print(temp);
lcd.setCursor(14,0);
lcd.print("C");
delay(2000);
// Kelembaban
lcd.clear();
lcd.setCursor(0,0);
lcd.print("lembap :");
lcd.setCursor(10,0);
lcd.print(hum);
lcd.setCursor(14,0);
lcd.print("%");
delay(2000);
// Kirim data ke serial monitor (opsional)
Serial.println("--------------");
delay(2000);
lcd.clear();
delay(2000);
lcd.clear();
}