#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myServo;
// Pin definisi
const int potPin = 34; // Potensiometer di GPIO34
const int ledPin = 13; // LED indikator di GPIO13
const int servoPin = 14; // Servo di GPIO14
const int buzzerPin = 12; // Buzzer di GPIO12
void setup() {
Serial.begin(115200);
// LCD setup
lcd.init();
lcd.backlight();
lcd.setCursor(1, 0);
lcd.print("Plant Watering");
lcd.setCursor(5, 1);
lcd.print("System");
delay(2000);
lcd.clear();
// Servo, LED, Buzzer Setup
myServo.attach(servoPin);
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
}
void loop() {
int kelembaban = analogRead(potPin); // 0 - 4095
int persentase = map(kelembaban, 0, 4095, 0, 100);
lcd.setCursor(0, 0);
lcd.print("Moist Level:");
lcd.print(persentase);
lcd.print("% ");
if (persentase < 40) { // Threshold penyiraman
lcd.setCursor(0, 1);
lcd.print("Watering... ");
myServo.write(90); // Buka valve
// LED kedip selama 3 detik (6 kali kedip @500ms)
for (int i = 0; i < 6; i++) {
digitalWrite(ledPin, HIGH);
tone(buzzerPin, 1000);
delay(250); // nyala 250ms
digitalWrite(ledPin, LOW);
noTone(buzzerPin);
delay(250); // mati 250ms
}
} else {
lcd.setCursor(0, 1);
lcd.print("Soil Moist OK ");
myServo.write(0);
digitalWrite(ledPin, LOW);
noTone(buzzerPin);
}
delay(2000);
}