#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP32Servo.h> // Ganti dengan ESP32Servo
#include <RTClib.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
// Konfigurasi Wi-Fi
const char* ssid = "Your_SSID";
const char* password = "Your_PASSWORD";
// Token Telegram
const char* telegramBotToken = "Your_Bot_Token";
const char* chatID = "Your_Chat_ID";
// Setup untuk sensor suhu DS18B20
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Setup untuk sensor ultrasonik
#define TRIG_PIN 13
#define ECHO_PIN 12
// Setup untuk servo motor
Servo servo;
#define SERVO_PIN 14
// Setup untuk RTC DS3231
RTC_DS3231 rtc;
// Setup untuk LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variabel untuk Telegram
WiFiClientSecure client;
UniversalTelegramBot bot(telegramBotToken, client);
// Fungsi untuk mengukur jarak menggunakan sensor ultrasonik
long getUltrasonicDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
long distance = duration * 0.034 / 2; // Hitung jarak dalam cm
return distance;
}
// Fungsi untuk memberi makan ikan
void feedFish() {
servo.write(90); // Putar servo untuk memberi makan
delay(1000); // Tunggu 1 detik
servo.write(0); // Kembalikan servo ke posisi semula
}
// Fungsi untuk mengirim pesan ke Telegram
void sendTelegramMessage(String message) {
bot.sendMessage(chatID, message, "");
}
void setup() {
// Setup komunikasi serial
Serial.begin(115200);
// Setup Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Menghubungkan ke Wi-Fi...");
}
Serial.println("Terhubung ke Wi-Fi");
// Setup LCD
lcd.begin(16, 2); // Menggunakan parameter ukuran LCD 16x2
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Fish Feeder");
// Setup sensor suhu
sensors.begin();
// Setup sensor ultrasonik
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Setup servo
servo.attach(SERVO_PIN);
// Setup RTC DS3231
if (!rtc.begin()) {
Serial.println("RTC tidak terdeteksi");
lcd.setCursor(0, 1);
lcd.print("RTC Error");
while (1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Setup Telegram
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
}
void loop() {
// Baca suhu dari sensor DS18B20
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
// Baca jarak dari sensor ultrasonik
long distance = getUltrasonicDistance();
// Tampilkan suhu dan jarak sisa pakan di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatureC);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Sisa Pakan: ");
lcd.print(distance);
lcd.print(" cm");
// Kirim notifikasi ke Telegram jika pakan di bawah ambang batas
if (distance < 5) {
sendTelegramMessage("Sisa pakan ikan kurang dari 5 cm!");
}
// Kirim pembacaan suhu ke Telegram jika lebih dari 30°C
if (temperatureC > 30.0) {
sendTelegramMessage("Suhu air terlalu tinggi: " + String(temperatureC) + " °C!");
}
// Pemberian makan ikan secara otomatis setiap jam 8 pagi
DateTime now = rtc.now();
if (now.hour() == 8 && now.minute() == 0) {
feedFish();
sendTelegramMessage("Pakan diberikan pada pukul 08:00.");
}
delay(60000); // Tunggu 1 menit sebelum mengulang
}