---
# System prepended metadata

title: '***Automatic Fish Feeder dengan MPPT Solar Charger***'

---

# ***Automatic Fish Feeder dengan MPPT Solar Charger***


**Automatic Fish Feeder dengan MPPT Solar Charger ini menggabungkan perangkat pemberi pakan ikan otomatis dengan sistem pengisian baterai berbasis tenaga surya yang memaksimalkan pemanfaatan daya panel surya dengan efisiensi tinggi yang bertujuan untuk menurunkan biaya operasional dan meningkatkan efisiensi produksi petani ikan.** 

*PROGRESS*
**Minggu 1 (15 Januari - 19 Januari 2024)**

* Mempelajari proyek yang telah di kerjakan oleh mahasiswa kerja praktik tahun lalu yaitu Automatic Fish Feeder
Untuk flowchart nya sebagai berikut:
![Flowchart Automatic Fish Feeder](https://hackmd.io/_uploads/r1_TO7-RT.jpg)

* Mulai memprogram hardware Automatic Fish Feeder menggunakan aplikasi Arduino IDE namun masih terdapat error

![IMG-20240116-WA00100_11zon](https://hackmd.io/_uploads/ryDVNyESC.jpg)


* Berhasil menampilkan Mode Menu ke LCD namun masih belum bisa melanjutkan ke mode lainnya, dokumentasinya sebagai berikut:

    [Dokumentasi](https://drive.google.com/file/d/1mhKDU0pubTqivNuMbx9PN-YhZ45MdILA/view?usp=sharing)

* Meneruskan program Automatic Fish Feeder sudah berhasil mengupload ke LCD 16x2 namun masih belum selesai secara keseluruhan
* Melanjutkan membuat program Menu Utama di ArduinoIDE seperti kemarin

**Minggu 2 (22 Januari - 26 Januari 2024)**

* Melanjutkan identifikasi sintaksis program untuk Menu pada display LCD I2C 16x2
* Mencoba menambahkan program untuk motor DC ke dalam program Menu yang telah dibuat sebelumnya
* Membuat program RTC pada Arduino. Selain itu juga mencari referensi untuk menggabungkan program Menu dengan Motor DC
* Mencoba menambahkan fitur RTC ke dalam program Menu yang telah dibuat
*  Melanjutkan program Menu dan program RTC yang sebelumnya telah dikerjakan

**Minggu 3 (29 Januari - 2 Februari 2024)**

* Melanjutkan program Menu yang telah dibuat sebelumnya. Namun masih belum menemukan sintaksis yang sesuai untuk program Menu tersebut
* Melanjutkan mengembangkan program Menu yang telah saya buat sebelumnya. Akan tetapi masih belum selesai
* Mencoba mengembangkan program RTC waktu secara real-time dengan mengubahnya menjadi temperature secara real-time dengan 6 satuan temperature yang ada, diantaranya Celcius Reamur Fahrenheit Kelvin Rankine dan Delisle. Selain itu mencoba menggabungkan program 6 satuan temperature tersebut dengan program Menu namun masih belum selesai
![01-02-2024_11zon](https://hackmd.io/_uploads/SkLuwyNSC.jpg)

![31-01-2024_11zon](https://hackmd.io/_uploads/rJLKDkEr0.jpg)

* Mencoba menggabungkan program RTC yang berisi suhu dan waktu secara real-time dengan program menu akan tetapi masih belum selesai
* Masih melanjutkan observasi tentang RTC DS3231 dan LCD I2C

**Minggu 4 (5 Februari - 7 Februari 2024)**

*  Mencoba upload program dari mahasiswa magang tahun kemarin. Selanjutnya mencoba upload program pengendalian RTC dengan Button Test Motor DC Mode Otomatis Mode Manual Interval dan Mode Manual Terjadwal
![5-2-2024_11zon](https://hackmd.io/_uploads/HkmjuJNSA.jpg)

*  Membuat program untuk menghidupkan Motor Pusher dan Motor Blower dengan menggunakan 4 button. Selanjutnya mencoba menggabungkan program Motor DC Menu dan RTC namun masih belum berhasil
![7-2-2024_11zon](https://hackmd.io/_uploads/BkfpF1VrA.jpg)


*  Melanjutkan kegiatan kerja praktik dengan memahami source code dari mahasiswa yang magang semester kemarin Selain itu juga mencoba program tersebut namun ada beberapa yang masih error

**Minggu 5 (15 Februari - 16 Februari 2024)**

*  Pada minggu ke 5 ini tidak ada progress dikarenakan sedang sakit

**Minggu 6 (19 Februari - 23 Februari 2024)**

*  Melanjutkan untuk mencoba menggabungkan semua program, tetapi masih belum berhasil
*  Sesuai saran dari Pak Fadel selaku pembimbing project Automatic Fish Feeder saya membuat beberapa program dengan acuan program mahasiswa yang Kerja Praktik pada tahun kemarin
![Screenshot (91)](https://hackmd.io/_uploads/By8VqyVH0.png)


*  Melanjutkan pemrogaman seperti kemarin yang menggunakan acuan program mahasiswa yang Kerja Praktek tahun kemarin
*  Melanjutkan program kemarin karena masih terdapat error dan masih ada beberapa program yang belum selesai
*  Membuat program Menu Manual Terjadwal yang mengacu pada program mahasiswa yang Kerja Praktik pada tahun kemarin
![Screenshot (95)](https://hackmd.io/_uploads/S1EL9kESC.png)



**Minggu 7 (26 Februari - 1 Maret 2024)**

*  Melanjutkan menggabungkan sintaksis antara program Menu dengan program Manual Interval, tetapi masih belum berhasil
![Screenshot (97)](https://hackmd.io/_uploads/BJBiqyNHR.jpg)


*  Melanjutkan menggabungkan program Mode Auto dengan Program Menu untuk fitur motor pusher aktif pada jam yang ditentukan sudah berhasil di jalankan,  namun setelah itu program tersebut stuck di Menu Home dan tidak bisa dipindahkan ke fitur lain
*  Program gabungan antara Menu dan Mode Auto bisa menjalankan 2 jadwal yang telah di inputkan, namun agar waktu di Mode Auto diperbarui setiap detik kita harus menekan button enter secara terus menerus
[Dokumentasi](https://drive.google.com/file/d/19xZ9NhSYY_ReDu7OhsxCpicmG476SzeN/view?usp=sharing)

*  Program gabungan antara Menu dan Mode Auto bisa menjalankan 2 jadwal yang telah di inputkan. Setelah jadwal pertama selesai maka langsung menampilkan Mode Auto lalu lanjut menjalankan jadwal kedua. Setelah jadwal kedua berjalan langsung menuju ke Menu Home. Namun program ini masih bisa berjalan walaupun kita tidak masuk ke mode Menu
[Dokumentasi](https://drive.google.com/file/d/1BZd3Q197iaZGtpbjl77fWCslmIq_hMKC/view?usp=drive_link)

*  Progress penggabungan program Menu dengan program Mode Auto masih belum selesai. Hal ini terkendala masalah waktu yang ditampilkan belum bisa memperbarui setiap detik dan Mode Auto masih tetap berjalan padahal kita tidak berada di dalam Mode Auto

**Minggu 8 (26 Februari - 1 Maret 2024)**

* Gabungan program Menu dengan program Mode Auto sudah bisa dijalankan Fiturnya diantaranya bisa mengaktifkan 2 jadwal memberi makan waktu yang di tampilkan akan diperbarui secara terus menerus setiap 1 detik dan program pada Mode Auto hanya bisa dijalankan jika kita memilih opsi Mode Auto
Untuk program dan flowchart nya seperti berikut:

![Flowchart Mode Auto](https://hackmd.io/_uploads/BkJXFQWAa.jpg)

```
//MENU HOME & MODE AUTO

#include <ESP32Servo.h>
#include <RTClib.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <HX711.h>

#define BUTTON_PIN_UP 34
#define BUTTON_PIN_DOWN 35
#define BUTTON_PIN_ENTER 32
#define BUTTON_PIN_CANCEL 33

const int motorPinValve = 18; // motor pusher
const int motorPinBlower = 27; // motor blower

// Inisialisasi LCD
LiquidCrystal_I2C lcd(0x20, 16, 2);

// Inisialisasi objek RTC DS3231
RTC_DS3231 rtc;

bool isSubmenuActive = false;
bool isNewSubMenuActive = false;
bool isSubmenuSelected = false;
bool isNewSubMenuSelected = false;
bool isAutoModeActive = false;

bool buttonUpPressed = false;
bool buttonDownPressed = false;

int currentMenu = 0;
int currentSubMenu = 0;
int currentAutoSubMenu = 0;
int currentSettingsSubMenu = 0;
int previousMenu = 0;
int previousSubMenu = 0;
int manualSubMenu = 0;
int manualHour = 0;
int manualMinute = 0;
int currentSelection = 0;
int scheduledHour1 = 16;  
int scheduledMinute1 = 31;
int scheduledSecond1 = 0;
int scheduledHour2 = 16;  
int scheduledMinute2 = 32;
int scheduledSecond2 = 0;

void showCurrentTime() {
  DateTime now = rtc.now();

  lcd.setCursor(0, 1);
  lcd.print("Waktu:");
  lcd.print(now.hour() < 10 ? "0" : "");
  lcd.print(now.hour());
  lcd.print(":");
  lcd.print(now.minute() < 10 ? "0" : "");
  lcd.print(now.minute());
  lcd.print(":");
  lcd.print(now.second() < 10 ? "0" : "");
  lcd.print(now.second());
}

void setup()
{
  // put your setup code here, to run once:
  lcd.begin(16, 2);
  lcd.backlight();
  Wire.begin();
  rtc.begin();

  if (!rtc.begin())
  {
    lcd.clear();
    while (1);
  }
  
  // Hilangkan komentar baris di bawah untuk set waktu saat pertama kali
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  // Inisialisasi pin tombol
  pinMode(BUTTON_PIN_UP, INPUT_PULLUP);
  pinMode(BUTTON_PIN_DOWN, INPUT_PULLUP);
  pinMode(BUTTON_PIN_ENTER, INPUT_PULLUP);
  pinMode(BUTTON_PIN_CANCEL, INPUT_PULLUP);

  displayMainMenu();
}

void displayMainMenu()
{
  lcd.clear();
  lcd.print("HOME");
  lcd.setCursor(0, 1);
  lcd.print("->Auto");
  lcd.setCursor(0, 1);
}

// MENU
void displayMenu()
{
  isAutoModeActive = false;
  
  lcd.clear();
  if (currentMenu == 0)
  {
    lcd.print("HOME");
    lcd.setCursor(0, 1);
    lcd.print("->Auto");
    lcd.setCursor(0, 1);
  }
  else if (currentMenu == 1)
  {
    lcd.print("HOME");
    lcd.setCursor(0, 1);
    lcd.print("->Manual");
    lcd.setCursor(0, 1);
  }
  else if (currentMenu == 2)
  {
    lcd.print("HOME");
    lcd.setCursor(0, 1);
    lcd.print("->Settings");
    lcd.setCursor(0, 1);
  }
}

void displayAutoSubMenu()
{
  isAutoModeActive = true;
  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("MODE AUTO");

  showCurrentTime();

 while (isAutoModeActive) {
   int buttonStateCancel = digitalRead(BUTTON_PIN_CANCEL); // Deklarasi variabel buttonStateCancel
   int buttonStateUp = digitalRead(BUTTON_PIN_UP);
   int buttonStateDown = digitalRead(BUTTON_PIN_DOWN);

  DateTime now = rtc.now();


    if (now.hour() == scheduledHour1 && now.minute() == scheduledMinute1 && now.second() == scheduledSecond1) {
      dispenseFood1();
    }

    if (now.hour() == scheduledHour2 && now.minute() == scheduledMinute2 && now.second() == scheduledSecond2) {
      dispenseFood2();
    }
   
  if (buttonStateCancel == LOW) {
        lcd.clear();
        lcd.print(" Mode  Otomatis");
        lcd.setCursor(0, 1);
        lcd.print("   Dibatalkan");
        delay(2000);
        isAutoModeActive = false;
        break;
      }

    // Penanganan tombol UP dan DOWN
    if (buttonStateUp == LOW && !buttonUpPressed) {
      buttonUpPressed = true;
      moveAutoSubMenuUp();
    } else if (buttonStateUp == HIGH) {
      buttonUpPressed = false;
    }

    if (buttonStateDown == LOW && !buttonDownPressed) {
      buttonDownPressed = true;
      moveAutoSubMenuDown();
    } else if (buttonStateDown == HIGH) {
      buttonDownPressed = false;
    }

      static unsigned long previousMillis = millis();
      unsigned long currentMillis = millis();
      if (currentMillis - previousMillis >= 1000) {
        previousMillis = currentMillis;
        showCurrentTime();
      }
    }
  }

void displaySettingsSubMenu() 
{
  isAutoModeActive = false;
  
  lcd.clear();
  if (currentSettingsSubMenu == 0) {
    lcd.print("> Lontaran");
    lcd.setCursor(0, 1);
    lcd.print("> Sebaran");
  }
}

void displayManualSubMenu()
{
  isAutoModeActive = false;
  
  lcd.clear();
  if (manualSubMenu == 0)
  {
    lcd.print("> Terjadwal");
    lcd.setCursor(0, 1);
    lcd.print("> Interval Waktu");
  }

  int buttonStateUp = digitalRead(BUTTON_PIN_UP);
  int buttonStateDown = digitalRead(BUTTON_PIN_DOWN);

  // KETIKA BUTTON UP DITEKAN
  if (buttonStateUp == LOW && !buttonUpPressed)
  {
    buttonUpPressed = true;
    moveManualMenuUp();
  }
  else if (buttonStateUp == HIGH)
  {
    buttonUpPressed = false;  // reset status tombol
  }

  // KETIKA BUTTON DOWN DITEKAN
  if (buttonStateDown == LOW && !buttonDownPressed)
  {
    buttonDownPressed = true;
    moveManualMenuDown();
  }
  else if (buttonStateDown == HIGH)
  {
    buttonDownPressed = false;  // reset status tombol
  }
}

void moveMenuUp() {
  previousMenu = currentMenu;
  currentMenu = (currentMenu + 2) % 3;  // Menggeser menu ke atas
  displayMenu();
  delay(500);
}

void moveMenuDown() {
  previousMenu = currentMenu;
  currentMenu = (currentMenu + 1) % 3;  // Menggeser menu ke bawah
  displayMenu();
  delay(500);
}

int buttonStateUpAuto = digitalRead(BUTTON_PIN_UP);
int buttonStateDownAuto = digitalRead(BUTTON_PIN_DOWN);

void moveAutoSubMenuUp() {
  // Sesuaikan dengan jumlah opsi submenu baru
  currentAutoSubMenu = (currentAutoSubMenu - 1 + 3) % 3;
  displayAutoSubMenu();
  delay(500);
}

void moveAutoSubMenuDown() {
  // Sesuaikan dengan jumlah opsi submenu baru
  currentAutoSubMenu = (currentAutoSubMenu + 1) % 3;
  displayAutoSubMenu();
  delay(500);
}

void moveManualMenuUp()
{
  previousSubMenu = currentSubMenu;
  currentSubMenu = (currentSubMenu - 1 + 2) % 2;  // Menggeser menu ke atas
  displayManualSubMenu();
  delay(500);
}

void moveManualMenuDown()
{
  previousSubMenu = currentSubMenu;
  currentSubMenu = (currentSubMenu + 1) % 2;  // Menggeser menu ke bawah
  displayManualSubMenu();
  delay(500);
}

void moveSettingsSubMenuUp() {
  // Sesuaikan dengan jumlah opsi submenu baru
  currentSettingsSubMenu = (currentSettingsSubMenu - 1 + 2) % 2;
  displaySettingsSubMenu();
  delay(500);
}

void moveSettingsSubMenuDown() {
  // Sesuaikan dengan jumlah opsi submenu baru
  currentSettingsSubMenu = (currentSettingsSubMenu + 1) % 2;
  displaySettingsSubMenu();
  delay(500);
}

void loop() {
  // put your main code here, to run repeatedly:
  int buttonStateUp = digitalRead(BUTTON_PIN_UP);
  int buttonStateDown = digitalRead(BUTTON_PIN_DOWN);
  int buttonStateEnter = digitalRead(BUTTON_PIN_ENTER);
  int buttonStateCancel = digitalRead(BUTTON_PIN_CANCEL);

  // Periksa waktu RTC dan panggil dispenseFood() jika waktunya telah tercapai
  
  if(isAutoModeActive){ 
  DateTime now = rtc.now();
  
  if(now.hour() == scheduledHour1 && 
     now.minute() == scheduledMinute1 &&
     now.second() == scheduledSecond1)
  {
     dispenseFood1();
  }

  if(now.hour() == scheduledHour2 &&
     now.minute() == scheduledMinute2 &&  
     now.second() == scheduledSecond2) 
  {
     dispenseFood2();
  }  
}
  // KETIKA BUTTON UP DITEKAN
  if (buttonStateUp == LOW && !buttonUpPressed)
  {
    buttonUpPressed = true;
    moveMenuUp();
  }
  else if (buttonStateUp == HIGH)
  {
    buttonUpPressed = false;  // reset status tombol
  }

  // KETIKA BUTTON DOWN DITEKAN
  if (buttonStateDown == LOW && !buttonDownPressed)
  {
    buttonDownPressed = true;
    moveMenuDown();
  }
  else if (buttonStateDown == HIGH)
  {
    buttonDownPressed = false;  // reset status tombol
  }

  // KETIKA BUTTON ENTER DITEKAN
  if (buttonStateEnter == LOW) {
    if (currentMenu == 0) // jika menu otomatis dipilih
    {
      displayAutoSubMenu();
    }
    else if (currentMenu == 1) // jika menu manual dipilih
    {
      displayManualSubMenu();
    }
    else if (currentMenu == 2) // jika menu setting dipilih
    {
      displaySettingsSubMenu();
    }

    // Reset state tombol
    buttonUpPressed = false;
    buttonDownPressed = false;

    // Cek lagi state tombol
    if (buttonStateUp == LOW && !buttonUpPressed) {
      buttonUpPressed = true;
      moveMenuUp();
    }

    if (buttonStateDown == LOW && !buttonDownPressed) {
      buttonDownPressed = true;
      moveMenuDown();
    }
  }

  // KETIKA BUTTON CANCEL DITEKAN
  if (buttonStateCancel == LOW)
  {
    currentSubMenu = 0;
    displayMenu();


    isSubmenuActive = false;
    isSubmenuSelected = false;
  }
}

void dispenseFood1()
{
  lcd.clear();
  lcd.print("FEEDING TIME...");

  analogWrite(motorPinValve, 0);
  delay(1000);
  analogWrite(motorPinValve, 100);
  delay(1000);
  analogWrite(motorPinValve, 150);
  delay(5000);
  analogWrite(motorPinValve, 0);
  delay(1000);

  lcd.clear();
  lcd.print("Selesai");
  delay(1000);

  displayAutoSubMenu();

  // Reset state tombol
  buttonUpPressed = false;
  buttonDownPressed = false;
}

void dispenseFood2()
{
  if(isAutoModeActive){
  lcd.clear();
  lcd.print("FEEDING TIME...");

  analogWrite(motorPinValve, 0);
  delay(1000);
  analogWrite(motorPinValve, 100);
  delay(1000);
  analogWrite(motorPinValve, 150);
  delay(5000);
  analogWrite(motorPinValve, 0);
  delay(1000);

  lcd.clear();
  lcd.print("Selesai");
  delay(1000);

  displayAutoSubMenu();

  // Reset state tombol
  buttonUpPressed = false;
  buttonDownPressed = false;
 }
}
```

>[ Dokumentasi Opsi Mode Auto di menu Home](https://drive.google.com/file/d/1EvSp31QAVczG162yoLYSzAJDhn0USKLF/view?usp=sharing)

* Melanjutkan proyek Automatic Fish Feeder yaitu menggabungkan gabungan program Menu Home dan Mode Auto yang telah berfungsi dengan Mode Manual Interval dan Mode Manual Terjadwal. Akan tetapi masih belum menemukan sintaksis yang sesuai
* Melanjutkan penggabungan Mode Menu Auto ditambahkan dengan Mode Manual Interval. Untuk penggabungannya masih stuck di tombol enter yang tidak bisa ditekan pada saat kita memiih mode Manual
[Dokumentasi](https://drive.google.com/file/d/1GXz-GhThabqe_rNh6WcFuhfsvlXHweor/view?usp=sharing)

* Gabungan program antara Menu dan Mode Auto dengan program Mode Manual masih belum bisa berjalan dengan benar. Program gabungan ini masih menunjukkan waktu secara *Real-Time* yang tidak sesuai dan setelah masuk ke Mode Manual keempat button tersebut tidak berfungsi
[Dokumentasi](https://drive.google.com/file/d/1HLG3zXhvdx12hRU34ovAiGrLRb_r0L23/view?usp=drive_link)

* Gabungan program antara Menu dan Mode Auto dengan program Mode Manual masih belum bisa berjalan dengan benar. Program gabungan ini masih menunjukkan waktu Real-Time yang tidak sesuai dan setelah masuk ke Mode Manual menu yang sudah di program tidak bisa ditampilkan
[Dokumentasi](https://drive.google.com/file/d/1Htvcg_uGxA3pI4GdD-vwkVRYsWG5DThQ/view?usp=sharing)


**Minggu 9 (13 Maret - 15 Maret 2024)**

* Masih mencoba mencari sintaksis yang sesuai dengan menu manual interval dan menu manual terjadwal
*  Masih melanjutkan menggabungkan Mode Manual ke dalam Program Menu Disini program pada saat masuk ke mode manual ketika di tekan up atau down pasti keluar ke menu awal
*  Revisi program Menu Auto agar tidak perlu me-reset setiap menjalankan Hardware Automatic Fish Feeder, berikut hasil revisi program:
```
//MENU HOME & MODE AUTO

#include <ESP32Servo.h>
#include <RTClib.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <HX711.h>

#define BUTTON_PIN_UP 34
#define BUTTON_PIN_DOWN 35
#define BUTTON_PIN_ENTER 32
#define BUTTON_PIN_CANCEL 33

const int motorPinValve = 18; // motor pusher
const int motorPinBlower = 27; // motor blower

// Inisialisasi LCD
LiquidCrystal_I2C lcd(0x20, 16, 2);

// Inisialisasi objek RTC DS3231
RTC_DS3231 rtc;

bool isSubmenuActive = false;
bool isNewSubMenuActive = false;
bool isSubmenuSelected = false;
bool isNewSubMenuSelected = false;
bool isAutoModeActive = false;

bool buttonUpPressed = false;
bool buttonDownPressed = false;

int currentMenu = 0;
int currentSubMenu = 0;
int currentAutoSubMenu = 0;
int currentSettingsSubMenu = 0;
int previousMenu = 0;
int previousSubMenu = 0;
int manualSubMenu = 0;
int manualHour = 0;
int manualMinute = 0;
int currentSelection = 0;
int scheduledHour1 = 11;  
int scheduledMinute1 = 0;
int scheduledSecond1 = 0;
int scheduledHour2 = 11;  
int scheduledMinute2 = 0;
int scheduledSecond2 = 20;

void showCurrentTime() {
  DateTime now = rtc.now();

  lcd.setCursor(0, 1);
  lcd.print("Waktu:");
  lcd.print(now.hour() < 10 ? "0" : "");
  lcd.print(now.hour());
  lcd.print(":");
  lcd.print(now.minute() < 10 ? "0" : "");
  lcd.print(now.minute());
  lcd.print(":");
  lcd.print(now.second() < 10 ? "0" : "");
  lcd.print(now.second());
}

void setup()
{
  lcd.init();
  // put your setup code here, to run once:
  lcd.begin(16, 2);
  lcd.backlight();
  Wire.begin();
  rtc.begin();

  if (!rtc.begin())
  {
    lcd.clear();
    while (1);
  }
  
  // Hilangkan komentar baris di bawah untuk set waktu saat pertama kali
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  // Inisialisasi pin tombol
  pinMode(BUTTON_PIN_UP, INPUT_PULLUP);
  pinMode(BUTTON_PIN_DOWN, INPUT_PULLUP);
  pinMode(BUTTON_PIN_ENTER, INPUT_PULLUP);
  pinMode(BUTTON_PIN_CANCEL, INPUT_PULLUP);

  displayMainMenu();
}

void displayMainMenu()
{
  lcd.clear();
  lcd.print("HOME");
  lcd.setCursor(0, 1);
  lcd.print("->Auto");
  lcd.setCursor(0, 1);
}

// MENU
void displayMenu()
{
  isAutoModeActive = false;
  
  lcd.clear();
  if (currentMenu == 0)
  {
    lcd.print("HOME");
    lcd.setCursor(0, 1);
    lcd.print("->Auto");
    lcd.setCursor(0, 1);
  }
  else if (currentMenu == 1)
  {
    lcd.print("HOME");
    lcd.setCursor(0, 1);
    lcd.print("->Manual");
    lcd.setCursor(0, 1);
  }
  else if (currentMenu == 2)
  {
    lcd.print("HOME");
    lcd.setCursor(0, 1);
    lcd.print("->Settings");
    lcd.setCursor(0, 1);
  }
}

void displayAutoSubMenu()
{
  isAutoModeActive = true;
  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("MODE AUTO");

  showCurrentTime();

 while (isAutoModeActive) {
   int buttonStateCancel = digitalRead(BUTTON_PIN_CANCEL); // Deklarasi variabel buttonStateCancel
   int buttonStateUp = digitalRead(BUTTON_PIN_UP);
   int buttonStateDown = digitalRead(BUTTON_PIN_DOWN);

  DateTime now = rtc.now();


    if (now.hour() == scheduledHour1 && now.minute() == scheduledMinute1 && now.second() == scheduledSecond1) {
      dispenseFood1();
    }

    if (now.hour() == scheduledHour2 && now.minute() == scheduledMinute2 && now.second() == scheduledSecond2) {
      dispenseFood2();
    }
   
  if (buttonStateCancel == LOW) {
        lcd.clear();
        lcd.print(" Mode  Otomatis");
        lcd.setCursor(0, 1);
        lcd.print("   Dibatalkan");
        delay(2000);
        isAutoModeActive = false;
        break;
      }

    // Penanganan tombol UP dan DOWN
    if (buttonStateUp == LOW && !buttonUpPressed) {
      buttonUpPressed = true;
      moveAutoSubMenuUp();
    } else if (buttonStateUp == HIGH) {
      buttonUpPressed = false;
    }

    if (buttonStateDown == LOW && !buttonDownPressed) {
      buttonDownPressed = true;
      moveAutoSubMenuDown();
    } else if (buttonStateDown == HIGH) {
      buttonDownPressed = false;
    }

      static unsigned long previousMillis = millis();
      unsigned long currentMillis = millis();
      if (currentMillis - previousMillis >= 1000) {
        previousMillis = currentMillis;
        showCurrentTime();
      }
    }
  }

void displaySettingsSubMenu() 
{
  isAutoModeActive = false;
  
  lcd.clear();
  if (currentSettingsSubMenu == 0) {
    lcd.print("> Lontaran");
    lcd.setCursor(0, 1);
    lcd.print("> Sebaran");
  }
}

void displayManualSubMenu()
{
  isAutoModeActive = false;
  
  lcd.clear();
  if (manualSubMenu == 0)
  {
    lcd.print("> Terjadwal");
    lcd.setCursor(0, 1);
    lcd.print("> Interval Waktu");
  }

  int buttonStateUp = digitalRead(BUTTON_PIN_UP);
  int buttonStateDown = digitalRead(BUTTON_PIN_DOWN);

  // KETIKA BUTTON UP DITEKAN
  if (buttonStateUp == LOW && !buttonUpPressed)
  {
    buttonUpPressed = true;
    moveManualMenuUp();
  }
  else if (buttonStateUp == HIGH)
  {
    buttonUpPressed = false;  // reset status tombol
  }

  // KETIKA BUTTON DOWN DITEKAN
  if (buttonStateDown == LOW && !buttonDownPressed)
  {
    buttonDownPressed = true;
    moveManualMenuDown();
  }
  else if (buttonStateDown == HIGH)
  {
    buttonDownPressed = false;  // reset status tombol
  }
}

void moveMenuUp() {
  previousMenu = currentMenu;
  currentMenu = (currentMenu + 2) % 3;  // Menggeser menu ke atas
  displayMenu();
  delay(500);
}

void moveMenuDown() {
  previousMenu = currentMenu;
  currentMenu = (currentMenu + 1) % 3;  // Menggeser menu ke bawah
  displayMenu();
  delay(500);
}

int buttonStateUpAuto = digitalRead(BUTTON_PIN_UP);
int buttonStateDownAuto = digitalRead(BUTTON_PIN_DOWN);

void moveAutoSubMenuUp() {
  // Sesuaikan dengan jumlah opsi submenu baru
  currentAutoSubMenu = (currentAutoSubMenu - 1 + 3) % 3;
  displayAutoSubMenu();
  delay(500);
}

void moveAutoSubMenuDown() {
  // Sesuaikan dengan jumlah opsi submenu baru
  currentAutoSubMenu = (currentAutoSubMenu + 1) % 3;
  displayAutoSubMenu();
  delay(500);
}

void moveManualMenuUp()
{
  previousSubMenu = currentSubMenu;
  currentSubMenu = (currentSubMenu - 1 + 2) % 2;  // Menggeser menu ke atas
  displayManualSubMenu();
  delay(500);
}

void moveManualMenuDown()
{
  previousSubMenu = currentSubMenu;
  currentSubMenu = (currentSubMenu + 1) % 2;  // Menggeser menu ke bawah
  displayManualSubMenu();
  delay(500);
}

void moveSettingsSubMenuUp() {
  // Sesuaikan dengan jumlah opsi submenu baru
  currentSettingsSubMenu = (currentSettingsSubMenu - 1 + 2) % 2;
  displaySettingsSubMenu();
  delay(500);
}

void moveSettingsSubMenuDown() {
  // Sesuaikan dengan jumlah opsi submenu baru
  currentSettingsSubMenu = (currentSettingsSubMenu + 1) % 2;
  displaySettingsSubMenu();
  delay(500);
}

void loop() {
  // put your main code here, to run repeatedly:
  int buttonStateUp = digitalRead(BUTTON_PIN_UP);
  int buttonStateDown = digitalRead(BUTTON_PIN_DOWN);
  int buttonStateEnter = digitalRead(BUTTON_PIN_ENTER);
  int buttonStateCancel = digitalRead(BUTTON_PIN_CANCEL);

  // Periksa waktu RTC dan panggil dispenseFood() jika waktunya telah tercapai
  
  if(isAutoModeActive){ 
  DateTime now = rtc.now();
  
  if(now.hour() == scheduledHour1 && 
     now.minute() == scheduledMinute1 &&
     now.second() == scheduledSecond1)
  {
     dispenseFood1();
  }

  if(now.hour() == scheduledHour2 &&
     now.minute() == scheduledMinute2 &&  
     now.second() == scheduledSecond2) 
  {
     dispenseFood2();
  }  
}
  // KETIKA BUTTON UP DITEKAN
  if (buttonStateUp == LOW && !buttonUpPressed)
  {
    buttonUpPressed = true;
    moveMenuUp();
  }
  else if (buttonStateUp == HIGH)
  {
    buttonUpPressed = false;  // reset status tombol
  }

  // KETIKA BUTTON DOWN DITEKAN
  if (buttonStateDown == LOW && !buttonDownPressed)
  {
    buttonDownPressed = true;
    moveMenuDown();
  }
  else if (buttonStateDown == HIGH)
  {
    buttonDownPressed = false;  // reset status tombol
  }

  // KETIKA BUTTON ENTER DITEKAN
  if (buttonStateEnter == LOW) {
    if (currentMenu == 0) // jika menu otomatis dipilih
    {
      displayAutoSubMenu();
    }
    else if (currentMenu == 1) // jika menu manual dipilih
    {
      displayManualSubMenu();
    }
    else if (currentMenu == 2) // jika menu setting dipilih
    {
      displaySettingsSubMenu();
    }

    // Reset state tombol
    buttonUpPressed = false;
    buttonDownPressed = false;

    // Cek lagi state tombol
    if (buttonStateUp == LOW && !buttonUpPressed) {
      buttonUpPressed = true;
      moveMenuUp();
    }

    if (buttonStateDown == LOW && !buttonDownPressed) {
      buttonDownPressed = true;
      moveMenuDown();
    }
  }

  // KETIKA BUTTON CANCEL DITEKAN
  if (buttonStateCancel == LOW)
  {
    currentSubMenu = 0;
    displayMenu();


    isSubmenuActive = false;
    isSubmenuSelected = false;
  }
}

void dispenseFood1()
{
  lcd.clear();
  lcd.print("FEEDING TIME...");

  analogWrite(motorPinValve, 0);
  delay(1000);
  analogWrite(motorPinValve, 100);
  delay(1000);
  analogWrite(motorPinValve, 150);
  delay(5000);
  analogWrite(motorPinValve, 0);
  delay(1000);

  lcd.clear();
  lcd.print("Selesai");
  delay(1000);

  displayAutoSubMenu();

  // Reset state tombol
  buttonUpPressed = false;
  buttonDownPressed = false;
}

void dispenseFood2()
{
  if(isAutoModeActive){
  lcd.clear();
  lcd.print("FEEDING TIME...");

  analogWrite(motorPinValve, 0);
  delay(1000);
  analogWrite(motorPinValve, 100);
  delay(1000);
  analogWrite(motorPinValve, 150);
  delay(5000);
  analogWrite(motorPinValve, 0);
  delay(1000);

  lcd.clear();
  lcd.print("Selesai");
  delay(1000);

  displayAutoSubMenu();

  // Reset state tombol
  buttonUpPressed = false;
  buttonDownPressed = false;
 }
}
```

**Minggu 10 (18 Maret - 22 Maret 2024)**
* Mempelajari Buku KP

* Mencari referensi tentang program Automatic Fish Feeder
* Mempelajari beberapa Tugas Akhir yang linier dengan proyek Automatic Fish Feeder

**Minggu 11 (25 Maret - 29 Maret 2024)**
* Mempelajari proposal TA yang mirip dengan Automatic Fish Feeder

**Minggu 12 (1 April - 5 April 2024)**
* Izin cuti lebaran

**Minggu 13 (8 April - 12 April 2024)**
* Izin cuti lebaran

**Minggu 14 (15 April - 19 April 2024)**
* Membaca referensi Tugas Akhir selagi masih menunggu jobdesk selanjutnya dari Bapak Fadel selaku mentor Kerja Praktik
* Berkonsultasi dengan Pak Fadel selaku pembimbing KP saya saya bisa mulai mencoba program ke Hardware yang aslinya mulai Senin depan

**Minggu 15 (22 April - 26 April 2024)**
* Mencoba testing Program ke Hardware Automatic Fish Feeder untuk program dan fiturnya sudah bekerja, namun yang hidup Motor Valve nya saja. Selain itu tadi menemukan problem untuk Motor DC untuk di Motor Pusher perlu diganti dengan Motor DC dengan Gear yang lebih tinggi spesifikasinya
![22-04-2024](https://hackmd.io/_uploads/B1v4NxNHR.jpg)

* Penggantian Motor DC lama yang ada di Motor Valve dengan Motor DC baru yang berasal dari Bor Listrik
![23-04-2024](https://hackmd.io/_uploads/SyYP4xEHR.jpg)


* Melanjutkan percobaan untuk mengaktifkan Motor DC baru lalu juga mencari solusi untuk penyangga Motor DC tersebut agar tidak terlepas apabila sedang aktif
![24-04-2024](https://hackmd.io/_uploads/BJWtNxEH0.jpg)

* Membuat program untuk ngelontar pakan untuk Motor Pusher itu nyalanya konstan tapi Motor Blowernya nyalanya dari minimum ke maksimum lalu kembali lagi ke minimum
* Mencoba program Motor Valve dan Motor Blower. Disini Motor Pusher dan Motor Blower berhasil aktif tetapi masih ada revisi untuk program tersebut
[Dokumentasi](https://drive.google.com/file/d/1TwLQqW6sb5BC_7zdtH6kcSvIzIRpL-wl/view?usp=sharing)

**Minggu 16 (29 April - 3 Mei 2024)**
* Melanjutkan pemasangan penyangga pada Motor Pusher tetapi masih belum dicoba dikarenakan ada problem dari input Motor DC ke PCB
* Testing penyangga dengan mengaktifkan motor pusher, hasilnya motor pusher masih belum disangga dengan kuat lalu untuk motor blowernya masih belum bisa aktif
* Pengetesan motor blower akan tetapi masih belum bisa dikarenakan baterai PCB nya habis. Lalu sambil menunggu pengisian baterai PCB saya membantu pengukuran tegangan dan arus pada project Sistem penerangan lampu jalan berbasis MESH. Lalu setelah saya melanjutkan pengetesan motor blower ternyata ada trouble di PCB
![02-05-2024](https://hackmd.io/_uploads/B14kSe4H0.jpg)


**Minggu 17 (6 Mei - 10 Mei 2024)**
* Melanjutkan test PCB namun masih terdapat error pada PCB yang mengakibatkan PCB tidak bisa menyala
* Sambil menunggu PCB diperbaiki oleh Pembimbing KP, saya melanjutkan mencari referensi judul untuk Tugas Akhir

**Minggu 18 (13 Mei - 19 Mei 2024)**
*  Melanjutkan program di PCB tetapi masih terdapat error
*  Melanjutkan percobaan aktivasi motor blower namun masih belum bisa aktif
*  Melanjutkan program pada motor blower tetapi masih belum bisa nyala. Masih belum diketahui error tersebut disebabkan oleh motor DC, PCB, atau dari programnya
*  Berhubung mendekati deadline submit judul Tugas Akhir, Hari Jumat pada minggu ini saya mencari referensi Tugas Akhir dan bimbingan dengan dosen pembimbing saya

**Minggu 19 (20 Mei - 25 Mei 2024)**
* Melanjutkan program untuk PCB akan tetapi masih belum bisa untuk menyalakan motor blower
![22-05-2024](https://hackmd.io/_uploads/r1uwIeEr0.jpg)


**Minggu 20 (27 Mei - 31 Mei 2024)**
* Masih terdapat error pada pcb dan program yang saya buat, oleh karena itu saya sekalian mencari referensi untuk Tugas Akhir saya

**Minggu 21 (3 Juni - 7 Juni 2024)**
* Masih melanjutkan pembuatan program untuk PCB dikarenakan masih banyak terdapat error yang mengakibatkan motor DC tidak dapat aktif
* Pengukuran baterai pada PCB hasil yg didapatkan daya baterai untuk 4 baterai tersebut sekitar 3 8 Volt namun masih tidak bisa menggerakkan motor DC
![04-06-2024](https://hackmd.io/_uploads/B1psIxNSA.jpg)

* Mengecek wiring kabel pada PCB dan ditemukan ada 1 kabel yang tidak terhubung yang kemungkinan menyebabkan motor DC tidak dapat aktif
![05-06-2024](https://hackmd.io/_uploads/rJLpIgVrR.jpg)

* Mengecek seluruh wire pada PCB dan motor DC mengecek tegangan baterai yang ada di PCB dan memperbaiki program. Semua dilakukan dengan koordinasi Pembimbing Kerja Praktik namun motor DC masih belum dapat berjalan
![06-06-2024](https://hackmd.io/_uploads/r1o0IlNHA.jpg)

* Melakukan konsultasi dengan pembimbing kerja praktik untuk permasalahan di PCB kemarin. Lalu untuk PCB tersebut dibawa oleh beliau

**Minggu 22 (10 Juni - 14 Juni 2024)**
* Memperbaiki konektor pada Hardware Automatic Fish Feeder
![10-06-2024](https://hackmd.io/_uploads/B1nAG9YH0.jpg)
* Memperbaiki Switch ON-OFF pada PCB
![11-06-2024](https://hackmd.io/_uploads/HktGQcKSR.jpg)

* Pengetesan kedua motor DC (Motor Valve dan Blower), kedua motor menyala normal pada PWM 50 untuk keduanya, namun penyangga pada motor Valve tidak cukup kuat untuk menahan putaran motor Valve tersebut 
* ![12-06-2024](https://hackmd.io/_uploads/BJ7s7qFr0.jpg)

* Melakukan pemasangan kembali untuk penyangga dengan menggunakan double tape dan cable ties 
![Pemasangan penyangga motor valve 13-06-2024](https://hackmd.io/_uploads/r14sH5FB0.jpg)

* Pengetesan menggunakan pakan pada kedua Motor DC. Pada motor valve di beri PWM 50, 100, dan 150. sedangkan untuk motor blower di beri PWM sebesar 50 secara konstan. Namun untuk motor Valve tidak bisa berputar sedangkan untuk Blower bisa berputar dengan lancar 
![Test Motor Valve 50-150 PWM & Motor Blower 50 PWM 13-06-2024](https://hackmd.io/_uploads/SyaIuqFr0.jpg)

* Hasil pada pengetesan PWM 150 untuk motor valve terdapat salah satu komponen pada PCB ada yang overheat dan mengeluarkan asap lalu untuk PCB nya langsung mati
![High PWM Effect 13-06-2024](https://hackmd.io/_uploads/S1R4D5FH0.jpg)


* 


**Minggu 23 (17 Juni - 21 Juni 2024)**
* PCB masih belum bisa menyala dan setelah dilakukan pengecekan ternyata ada salah satu kabel  sekun pada *switch* yang terlepas
![19-06-2024](https://hackmd.io/_uploads/B1PnBGlIA.jpg)

* Terdapat error "LiquidCrystal_I2C.h no such file or directory" pada arduino, padahal sudah install library LCD I2C
![20-06-2024](https://hackmd.io/_uploads/Bk71mgYLA.jpg)

* Memperbaiki beberapa komponen pada hardware. Namun setelah diperbaiki lalu di test menggunakan arduino teman saya, komponen pada selongsong yang terdapat di bawah tong pakan tidak bisa mendorong pakan keluar yang kemudian akan di lontarkan. Lalu setelah itu saya ubah kabel pada kutub di motor valve tetap tidak bisa mendorong pakan keluar
![21-06-2024](https://hackmd.io/_uploads/HkMCmlKU0.jpg)




**Minggu 24 (24 Juni - 28 Juni 2024)**
* Pengerjaan PPT dan Buku KP
* Hasil akhir seperti Source Code, Laporan, Presentasi, dan Video sebagai berikut:
[Hasil Akhir](https://drive.google.com/drive/folders/1r88RX1wdQCCMsRM4ypi54PWpkBDzU4Rg?usp=drive_link)
