#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP32Servo.h>
// --- KONFIGURASI PIN & HARDWARE ---
#define PIN_SUHU 4 // Konfigurasi: Pin Data DS18B20
#define PIN_RELAY 12 // Konfigurasi: Pin Relay (Heater)
#define PIN_SERVO 13 // Konfigurasi: Pin Data Servo
#define LCD_ADDR 0x27 // Konfigurasi: Alamat I2C LCD
#define SDA_PIN 22 // Konfigurasi: Pin SDA Custom
#define SCL_PIN 23 // Konfigurasi: Pin SCL Custom
// --- KONFIGURASI WAKTU ---
const long intervalMakan = 10000; // Konfigurasi: Interval pakan (ms)
LiquidCrystal_I2C lcd(LCD_ADDR, 16, 2);
OneWire oneWire(PIN_SUHU);
DallasTemperature sensors(&oneWire);
Servo myServo;
unsigned long previousMillis = 0;
void setup() {
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("System Starting...");
sensors.begin();
myServo.setPeriodHertz(50);
myServo.attach(PIN_SERVO, 500, 2400);
myServo.write(0);
pinMode(PIN_RELAY, OUTPUT);
digitalWrite(PIN_RELAY, LOW);
delay(2000);
lcd.clear();
}
void loop() {
sensors.requestTemperatures();
float suhuAir = sensors.getTempCByIndex(0);
Serial.print("Suhu Air: ");
Serial.println(suhuAir);
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(suhuAir);
lcd.print(" C ");
if (suhuAir < 25.0) {
digitalWrite(PIN_RELAY, HIGH);
lcd.setCursor(0, 1);
lcd.print("Heater: ON ");
} else {
digitalWrite(PIN_RELAY, LOW);
lcd.setCursor(0, 1);
lcd.print("Heater: OFF");
}
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= intervalMakan) {
previousMillis = currentMillis;
lcd.setCursor(0, 1);
lcd.print("Feeding Time!");
Serial.println("Feeding...");
myServo.write(90);
delay(1000);
myServo.write(0);
Serial.println("Done.");
}
delay(1000);
}