M4

1. Judul Rancangan [Kembali]

"Rancang Bangun Smart Robot Wiper Pembersih Panel Surya Berbasis STM32F103C8T6"

2. Tujuan Rancangan [Kembali]

1. Merancang dan merealisasikan prototipe sistem pembersih otomatis pada panel surya guna menjaga efisiensi penyerapan intensitas cahaya matahari.

2. Mengimplementasikan mikrokontroler 32-bit (STM32F103C8T6) dalam mengolah data sensor (direct conditional reading) dan mengendalikan aktuator motor stepper secara presisi.

3. Melakukan simulasi dan analisis rangkaian logika secara komprehensif menggunakan perangkat lunak Proteus dan STM32CubeIDE.

4. Mengintegrasikan berbagai komponen perangkat keras (sensor, mikrokontroler, aktuator) dan menganalisis peranannya masing-masing dalam membentuk sistem otomasi yang utuh.

5. Menjalin kemitraan dengan Bapak Zaini, Ph.D. serta memberikan bantuan teknologi terapan kepada masyarakat daerah Batu Busuk untuk memudahkan mereka dalam memanfaatkan dan memelihara instalasi panel surya milik Bapak Zaini, Ph.D.

3. Daftar Alat & Komponen [Kembali]

1. STM32F103C8T6

2. Modul Sensor LDR

3. Sensor Ultrasonik HC-SR04

4. Sensor Arus ACS712-20A

5. Sakelar Batas

6. Penggerak Motor l298

7. Motor BiStepper 12V

8. Motor DC 5V

9. LCD 16x2 LM016L

10. Pendukung Perangkat Lunak (STM32CubeIDE)

4. Landasan Teori + Grafik Respon Sensor [Kembali]

A. Galodo

Galodo merupakan istilah lokal di Sumatera Barat yang merujuk pada fenomena banjir bandang yang membawa sedimen material berupa lumpur tebal, bebatuan, dan mengoceh kayu. Daerah Batu Busuk, Kota Padang, yang memiliki topografi berbukit dan dilintasi aliran sungai, sangat rentan terhadap dampak cuaca ekstrem dan galodo. Pasca terjadinya hujan lebat atau galodo, hembusan angin dan percikan material sering kali meninggalkan lapisan lumpur kering dan debu tebal pada instalasi luar ruangan. Jika material ini menutupi permukaan panel surya milik warga atau instalasi Bapak Zaini, Ph.D., maka efisiensi penyerapan energi matahari akan terjadi secara drastis. Oleh karena itu, inovasi robot wiper otomatis ini menjadi solusi mitigasi yang sangat mendesak dan relevan untuk kondisi lingkungan di Batu Busuk.

B. Panel Surya dan Pengaruh Kotoran (Soiling Effect)

Panel surya merupakan perangkat semikonduktor yang berfungsi mengubah energi cahaya matahari menjadi energi listrik melalui efek fotovoltaik. Kinerja dan efisiensi daya keluaran panel surya berbanding lurus dengan intensitas cahaya (iradiasi) yang diterima oleh sel fotovoltaik. Namun, kinerja panel surya sangat rentan terhadap soiling effect , yaitu penurunan efisiensi akibat penumpukan kotoran seperti debu, lumpur sisa badai, atau kotoran burung di permukaan kaca pelindung. Lapisan kotoran ini menghalangi foton cahaya matahari untuk mencapai sel silikon, yang pada menyebabkan penurunan arus keluaran (Ampere) secara signifikan. Pembersihan secara berkala menjadi prosedur pemeliharaan yang wajib dilakukan agar instalasi panel surya dapat memproduksi daya sesuai dengan kapasitas maksimal yang dirancang.

C. Arsitektur Mikrokontroler STM32F103C8T6 (Blue Pill)

STM32F103C8T6 adalah mikrokontroler berbasis arsitektur 32-bit ARM Cortex-M3. Memiliki kecepatan clock maksimal hingga 72 MHz (diset 8 MHz pada simulasi ini untuk stabilitas), memori Flash 64 KB, dan SRAM 20 KB. Kapasitas komputasi 32-bit memberikan keunggulan telak dibandingkan mikrokontroler 8-bit (seperti Arduino Uno) dalam menangani proses kalkulasi matematika yang kompleks. Arsitektur ini memungkinkan STM32 untuk menghitung timer mikrodetik (pada sensor ultrasonik), melakukan konversi Analog-to-Digital (ADC) secara simultan (pada sensor arus), serta mengirimkan instruksi I2C tanpa mengalami pemblokiran atau penundaan pada putaran motor stepper.

D. Kombinasi Multi Sensor dan Koordinasinya

Sistem ini mengandalkan tiga sensor utama yang bekerja sama dalam sebuah arsitektur Sensor Fusion guna mencegah alarm palsu ( false positif ) dan meningkatkan akurasi sistem pembersih:

  1. Modul LDR Fotosel (Sensor Cahaya) :

    • Prinsip Kerja: Menggunakan komponen fotoresistor yang nilai hambatannya turun saat terpapar cahaya. Melalui IC Komparator (misal LM393) pada modul, sensor ini menghasilkan sinyal digital.

    • Grafik Respon: Berrupa sinyal fungsi tangga (Diskrit) . Sumbu Y adalah tegangan (0V atau 5V) dan sumbu X adalah waktu. Ketika cahaya tertutup lumpur/debu melampaui batas ( threshold ) potensiometer, grafik tiba-tiba melonjak ke logika 1 (High).

  2. Sensor Arus (Analog - ACS712):

    • Prinsip Kerja: Memanfaatkan efek Hall ( Hall Effect ) untuk mengubah aliran elektron dari panel surya menjadi variasi tegangan analog yang proporsional. Tegangan ini dibaca oleh pin ADC STM32.

    • Grafik Respon: Berrupa kurva linier analog . Sumbu Y adalah nilai arus ( $I$ ) dan sumbu X adalah waktu. Jika debu semakin tebal, grafik akan menunjukkan penurunan arus secara eksponensial maupun linier hingga berada di bawah ambang batas minimum daya serap.

  3. Sensor Ultrasonik (HC-SR04):

    • Prinsip Kerja: Mengirimkan gelombang suara 40 kHz ( Trigger ) dan menghitung waktu pantulannya ( Echo ). Jarak ( $d$ ) dihitung dengan metode Time of Flight .

    • Grafik Respon: Ambang Linear Berrupa . Respon sistem terjadi seketika saat nilai jarak (sumbu Y) memotong garis batas ( $d < 10$ cm) pada sumbu waktu (sumbu X).

Sistem Koordinasi Sensor Ketiga: Sensor ketiga dikoordinasikan menggunakan algoritma conditional berdasarkan gerbang logika di mikrokontroler:

  • Logika AND (LDR & Arus): Hanya mengandalkan LDR bisa memicu wiper saat cuaca mendung awan. Oleh karena itu, dikoordinasikan dengan sensor arus. Jika LDR Gelap (1) DAN Arus sangat rendah (< 100mA), maka mikrokontroler memvalidasi bahwa halangan tersebut pasti adalah kotoran/lumpur padat yang menempel di panel, bukan awan gelap.

  • Logika OR (Ultrasonik): Berperan sebagai interupsi independen. Meskipun cuaca cerah (LDR terang), jika ada benda asing besar seperti mengomel atau daun jatuh menutupi panel (Ultrasonik < 10 cm), sistem akan mengabaikan kondisi cuaca dan langsung mengaktifkan wiper .

E. Protokol Komunikasi LCD Paralel 8 Bit

Layar LCD standar (berbasis controller HD44780) pada dasarnya berkomunikasi menggunakan protokol paralel 8-bit. Protokol ini membutuhkan setidaknya 11 jalur pin dari mikrokontroler: 8 pin Data (D0 hingga D7) untuk mengirim karakter ASCII atau instruksi heksadesimal, dan 3 pin Kontrol (RS, RW, EN).

  • RS (Register Select): Logika 0 untuk mengirim Instruksi (misal: clear screen ), Logika 1 untuk mengirim Data (karakter huruf).

  • RW (Read/Write): Logika 0 untuk menulis data ke LCD, Logika 1 untuk membaca data dari LCD.

  • EN (Enable): Pulsa dari High ke Low untuk memberikan "ketukan" agar LCD mengeksekusi proses dari pin data.

Meskipun dalam proyek ini LCD hanya dikontrol dengan 2 kabel melalui perantara modul I2C (PCF8574), pemahaman terhadap protokol paralel 8-bit tetap menjadi landasan mutlak. Modul I2C (PCF8574) pada dasarnya hanyalah IC Expander yang menerima paket data serial dari STM32, lalu mengungkapnya menjadi sinyal paralel 8-bit secara fisik langsung ke kaki-kaki LCD sesuai dengan kaidah komunikasi paralel HD44780.

5. Flowchart Sistem [Kembali]

6. Program Pencatatan [Kembali]

/* USER CODE BEGIN Header */

/**

  ******************************************************************************

  * @file : main.c

  * @brief : Isi program utama untuk Robot Pembersih Kaca Surya yang Digerakkan Stepper

  ******************************************************************************

  */

/* Header AKHIR KODE PENGGUNA */


/* Termasuk ------------------------------------------------------------------*/

#include "main.h"


/* Penyertaan pribadi ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

/* KODE PENGGUNA BERAKHIR */


/* Variabel privat ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

uint8_t status_robot = 0; // 0 = Siaga/Maju, 1 = Mundur Kembali, 2 = Selesai

/* KODE PENGGUNA BERAKHIR PV */


/* Prototipe fungsi privat -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

/* USER CODE BEGIN PFP */

void Stepper_Drive(int direction);

void Stepper_Stop(void);


// === Deklarasi Fungsi LCD 4-Bit ===

void LCD_Send_4Bit(uint8_t data);

void LCD_Enable(void);

void LCD_Cmd(uint8_t cmd);

void LCD_Data(uint8_t data);

void LCD_Init(void);

void LCD_String(char* str);

void LCD_SetCursor(uint8_t row, uint8_t col);

void LCD_Clear(void);

/* KODE PENGGUNA BERAKHIR PFP */


/* Kode pengguna pribadi ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */


// ==================================================================

// STEPPER MOTOR FUNGSI

// ==================================================================

void Stepper_Drive(int direction)

{

  static int step_index = 0;


  jika (arah == 1) {

    step_index++;

    jika (indeks_langkah > 3) indeks_langkah = 0;

  }

  jika arah == -1) {

    indeks langkah--;

    jika (indeks_langkah < 0) indeks_langkah = 3;

  }


  beralih (indeks langkah)

  {

    Kasus 0:

      HAL_GPIO_WritePin(GPIOB, IN1_DRIVER_Pin, GPIO_PIN_SET);

      HAL_GPIO_WritePin(GPIOB, IN2_DRIVER_Pin, GPIO_PIN_RESET);

      HAL_GPIO_WritePin(GPIOB, IN3_DRIVER_Pin, GPIO_PIN_SET);

      HAL_GPIO_WritePin(GPIOB, IN4_DRIVER_Pin, GPIO_PIN_RESET);

      merusak;

    Kasus 1:

      HAL_GPIO_WritePin(GPIOB, IN1_DRIVER_Pin, GPIO_PIN_RESET);

      HAL_GPIO_WritePin(GPIOB, IN2_DRIVER_Pin, GPIO_PIN_SET);

      HAL_GPIO_WritePin(GPIOB, IN3_DRIVER_Pin, GPIO_PIN_SET);

      HAL_GPIO_WritePin(GPIOB, IN4_DRIVER_Pin, GPIO_PIN_RESET);

      merusak;

    Kasus 2:

      HAL_GPIO_WritePin(GPIOB, IN1_DRIVER_Pin, GPIO_PIN_RESET);

      HAL_GPIO_WritePin(GPIOB, IN2_DRIVER_Pin, GPIO_PIN_SET);

      HAL_GPIO_WritePin(GPIOB, IN3_DRIVER_Pin, GPIO_PIN_RESET);

      HAL_GPIO_WritePin(GPIOB, IN4_DRIVER_Pin, GPIO_PIN_SET);

      merusak;

    Kasus 3:

      HAL_GPIO_WritePin(GPIOB, IN1_DRIVER_Pin, GPIO_PIN_SET);

      HAL_GPIO_WritePin(GPIOB, IN2_DRIVER_Pin, GPIO_PIN_RESET);

      HAL_GPIO_WritePin(GPIOB, IN3_DRIVER_Pin, GPIO_PIN_RESET);

      HAL_GPIO_WritePin(GPIOB, IN4_DRIVER_Pin, GPIO_PIN_SET);

      merusak;

  }

}


void Stepper_Stop(void)

{

  HAL_GPIO_WritePin(GPIOB, IN1_DRIVER_Pin|IN2_DRIVER_Pin|IN3_DRIVER_Pin|IN4_DRIVER_Pin, GPIO_PIN_RESET);

}


// ==================================================================

// DRIVER FUNGSI LCD 16x2

// ==================================================================

void LCD_Send_4Bit(uint8_t data) {

  HAL_GPIO_WritePin(GPIOB, D4_LCD_Pin, ((data >> 0) & 0x01) ? GPIO_PIN_SET : GPIO_PIN_RESET);

  HAL_GPIO_WritePin(GPIOB, D5_LCD_Pin, ((data >> 1) & 0x01) ? GPIO_PIN_SET : GPIO_PIN_RESET);

  HAL_GPIO_WritePin(GPIOB, D6_LCD_Pin, ((data >> 2) & 0x01) ? GPIO_PIN_SET : GPIO_PIN_RESET);

  HAL_GPIO_WritePin(GPIOB, D7_LCD_Pin, ((data >> 3) & 0x01) ? GPIO_PIN_SET : GPIO_PIN_RESET);

}


void LCD_Enable(void) {

  HAL_GPIO_WritePin(GPIOB, E_LCD_Pin, GPIO_PIN_SET);

  HAL_Delay(1);

  HAL_GPIO_WritePin(GPIOB, E_LCD_Pin, GPIO_PIN_RESET);

  HAL_Delay(1);

}


void LCD_Cmd(uint8_t cmd) {

  HAL_GPIO_WritePin(GPIOB, RS_LCD_Pin, GPIO_PIN_RESET);

  LCD_Send_4Bit(cmd >> 4);

  LCD_Aktifkan();

  LCD_Kirim_4Bit(cmd);

  LCD_Aktifkan();

}


void LCD_Data(uint8_t data) {

  HAL_GPIO_WritePin(GPIOB, RS_LCD_Pin, GPIO_PIN_SET);

  LCD_Send_4Bit(data >> 4);

  LCD_Aktifkan();

  LCD_Kirim_4Bit(data);

  LCD_Aktifkan();

}


void LCD_Init(void) {

  HAL_Delay(50);

  LCD_Cmd(0x02);

  LCD_Cmd(0x28);

  LCD_Cmd(0x0C);

  LCD_Cmd(0x01);

  HAL_Delay(2);

  LCD_Cmd(0x06);

}


void LCD_String(char* str) {

  sementara (*str) {

    LCD_Data(*str++);

  }

}


void LCD_SetCursor(uint8_t row, uint8_t col) {

  alamat uint8_t;

  jika (baris == 0) alamat = 0x80;

  jika tidak, alamat = 0xC0;

  alamat |= kolom;

  LCD_Cmd(alamat);

}


void LCD_Clear(void) {

  LCD_Cmd(0x01);

  HAL_Delay(2);

}

/* KODE PENGGUNA BERAKHIR 0 */


/**

  * @brief Titik masuk aplikasi.

  * @retval int

  */

int main(void)

{

  /* Konfigurasi MCU--------------------------------------------------------*/

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();


  /* USER CODE BEGIN 2 */

  Stepper_Stop();

  HAL_GPIO_WritePin(GPIOA, POMPA_AIR_Pin, GPIO_PIN_RESET);


  // Inisialisasi Layar LCD

  LCD_Init();

  LCD_SetCursor(0, 0);

  LCD_String("SISTEM WIPER");

  LCD_SetCursor(1, 0);

  LCD_String("SISTEM SIAP");

  HAL_Delay(2000);

  LCD_Clear();

  /* KODE PENGGUNA BERAKHIR 2 */


  /* Perulangan tak terbatas */

  /* KODE PENGGUNA DIMULAI SELAMA */


  uint8_t lcd_state = 99; // Memori untuk sinkronisasi LCD agar tidak berkedip


  sementara (1)

  {

    // 1. Membaca Saklar Batas Sensor

    GPIO_PinState kondisi_LimitStop = HAL_GPIO_ReadPin(GPIOB, LIMITSWITCH_STOP_Pin);

    GPIO_PinState kondisi_LimitBack = HAL_GPIO_ReadPin(GPIOB, LIMITSWITCH_BACK_Pin);


    // 2. Membaca Kondisi Sensor Digital

    uint8_t cahaya = HAL_GPIO_ReadPin(GPIOA, PHOTOCELL_Pin); // 1 = Siang, 0 = Malam

    uint8_t arus = HAL_GPIO_ReadPin(GPIOA, ACS_Pin); // 1 = Normal, 0 = Turun/Debu

    uint8_t ultrasonik = HAL_GPIO_ReadPin(GPIOA, ECHO_SONAR_Pin); // 1 = Ada Benda, 0 = Aman


    // ==================================================================

    // 3. Evaluasi Berdasarkan Logika Baru (Fotosel = Indikator Malam)

    // ==================================================================

    uint8_t motor_hidup = 0;


    // Aturan: Ultrasonic=1 WAJIB hidup dalam kondisi apa pun (Siang/Malam)

    jika (ultrasonik == 1)

    {

      motor_hidup = 1;

    }

    kalau tidak

    {

      // Jika Ultrasonic=0, motor HANYA boleh hidup jika SIANG (Cahaya=1) DAN ARUS TURUN (Arus=0)

      jika (cahaya == 1 && arus == 0)

      {

        motor_hidup = 1;

      }

      kalau tidak

      {

        motor_hidup = 0; // Jika Malam (Cahaya=0) atau Siang tapi Arus Bagus (Arus=1) -> Motor Mati

      }

    }


    // == MANAJEMEN TAMPILAN LCD (SINKRONISASI) ==

    uint8_t current_lcd_state = status_robot;


    if (status_robot == 0 && motor_hidup == 0) {

      keadaan_lcd_saat ini = 10; // Kode khusus mode Standby (Sensor tidak terpenuhi)

    }


    // Refresh layar LCD HANYA JIKA ADA PERUBAHAN FASE (Mencegah Glitch)

    jika (lcd_state != current_lcd_state) {

      LCD_Clear();

      jika (status_lcd_saat_ini == 10) {

        LCD_SetCursor(0, 0); LCD_String("MODE: STANDBY");

        LCD_SetCursor(1, 0); LCD_String("Matahari Bersih");

      } else if (current_lcd_state == 0) {

        LCD_SetCursor(0, 0); LCD_String("MEMBERSIHKAN...");

        LCD_SetCursor(1, 0); LCD_String("Pompa Air: AKTIF");

      } jika tidak (status_lcd_saat_ini == 1) {

        LCD_SetCursor(0, 0); LCD_String("RETRACT MUNDUR");

        LCD_SetCursor(1, 0); LCD_String("Kembali ke Awal");

      } jika tidak (status_lcd_saat_ini == 2) {

        LCD_SetCursor(0, 0); LCD_String("OPERASI SELESAI");

        LCD_SetCursor(1, 0); LCD_String("Panel Bersih!");

      }

      keadaan_lcd = keadaan_lcd_saat ini; // Simpan status memori saat ini

    }


    // == ROBOT SIKLUS UTAMA ==


    // FASE 0: ROBOT BERGERAK MAJU ATAU STANDBY

    jika (status_robot == 0)

    {

      jika (motor_hidup == 1)

      {

        HAL_GPIO_WritePin(GPIOA, POMPA_AIR_Pin, GPIO_PIN_SET); // Relay Pompa ON

        Stepper_Drive(1); // Motor Maju

        HAL_Penundaan(15); // Kecepatan & Kestabilan Proteus

      }

      kalau tidak

      {

        HAL_GPIO_WritePin(GPIOA, POMPA_AIR_Pin, GPIO_PIN_RESET); // Relay Pompa OFF

        Stepper_Stop(); // Diameter Motor

        HAL_Penundaan(15); // PENTING: Peristiwa CPU Proteus Freeze

      }


      // JIKA MENYENTUH LIMIT SWITCH PANEL UJUNG -> MUNDUR

      jika (kondisi_LimitBack == GPIO_PIN_SET)

      {

        HAL_GPIO_WritePin(GPIOA, POMPA_AIR_Pin, GPIO_PIN_RESET);

        Stepper_Stop();

        HAL_Penundaan(1000); // Pengereman 1 detik

        status_robot = 1; // Ganti fase ke Mundur

      }

    }


    // FASE 1: RETRAK ROBOT (MUNDUR KEMBALI KEPANGKAL)

    jika (status_robot == 1)

    {

      // Saat mundur, abaikan sensor lingkungan dan matikan pompa

      HAL_GPIO_WritePin(GPIOA, POMPA_AIR_Pin, GPIO_PIN_RESET);


      // JIKA MENYENTUH LIMIT SWITCH PANGKAL -> BERHENTI

      jika (kondisi_LimitStop == GPIO_PIN_SET)

      {

        Stepper_Stop();

        status_robot = 2; // Ganti fase ke Selesai

      }

      kalau tidak

      {

        Stepper_Drive(-1); // Motor Melangkah Mundur

        HAL_Penundaan(15); // Kecepatan mundur

      }

    }


    // FASE 2: OPERASI SELESAI & RESET KE STANDBY

    jika (status_robot == 2)

    {

      Stepper_Stop();

      HAL_GPIO_WritePin(GPIOA, POMPA_AIR_Pin, GPIO_PIN_RESET);


      HAL_Penundaan(3000); // Jeda istirahat 3 detik

      status_robot = 0; // Kembalikan ke Standby siap kerja lagi

    }


    /* KODE PENGGUNA BERAKHIR SELAMA */

  }

}


/**

  * @brief Konfigurasi Jam Sistem

  * @retval Tidak ada

  */

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};


  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

  RCC_OscInitStruct.HSIState = RCC_HSI_ON;

  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

  jika (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }


  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;


  jika (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

  {

    Error_Handler();

  }

}


/**

  * @brief Fungsi Inisialisasi GPIO

  * @param Tidak ada

  * @retval Tidak ada

  */

void statis MX_GPIO_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};


  /* Pengaktifan Jam pada Port GPIO */

  __HAL_RCC_GPIOA_CLK_ENABLE();

  __HAL_RCC_GPIOB_CLK_ENABLE();


  /*Konfigurasi Level Output Pin GPIO*/

  HAL_GPIO_WritePin(GPIOB, RS_LCD_Pin|E_LCD_Pin|IN1_DRIVER_Pin|IN2_DRIVER_Pin

                          |Pin_DRIVER_IN3|Pin_DRIVER_IN4|Pin_LCD_D4|Pin_LCD_D5

                          |Pin_LCD_D6|Pin_LCD_D7, RESET_PIN_GPIO);


  /*Konfigurasi Level Output Pin GPIO*/

  HAL_GPIO_WritePin(GPIOA, POMPA_AIR_Pin, GPIO_PIN_RESET);


  /*Konfigurasi pin GPIO: PHOTOCELL_Pin ACS_Pin ECHO_SONAR_Pin*/

  // Catatan: Pin Trigger_Pin dihilangkan dari input karena tidak dipakai di logicstate/sementara

  GPIO_InitStruct.Pin = PHOTOCELL_Pin|ACS_Pin|ECHO_SONAR_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


  /*Konfigurasi pin GPIO: RS_LCD_Pin E_LCD_Pin IN1_DRIVER_Pin IN2_DRIVER_Pin

                             Pin_DRIVER_IN3 Pin_DRIVER_IN4 Pin_LCD_D4 Pin_LCD_D5

                             Pin LCD D6 Pin LCD D7

  GPIO_InitStruct.Pin = RS_LCD_Pin|E_LCD_Pin|IN1_DRIVER_Pin|IN2_DRIVER_Pin

                          |Pin_DRIVER_IN3|Pin_DRIVER_IN4|Pin_LCD_D4|Pin_LCD_D5

                          |Pin LCD D6|Pin LCD D7;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed ​​= GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


  /*Konfigurasi pin GPIO: LIMITSWITCH_STOP_Pin LIMITSWITCH_BACK_Pin*/

  GPIO_InitStruct.Pin = LIMITSWITCH_STOP_Pin|LIMITSWITCH_BACK_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


  /*Konfigurasi pin GPIO: POMPA_AIR_Pin*/

  GPIO_InitStruct.Pin = POMPA_AIR_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed ​​= GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}


/* USER CODE BEGIN 4 */

/* KODE PENGGUNA BERAKHIR 4 */


void Error_Handler(void)

{

  __disable_irq();

  sementara (1)

  {

  }

}


#ifdef USE_FULL_ASSERT

void assert_failed(uint8_t *file, uint32_t line)

{

}

#endif /* USE_FULL_ASSERT */

7. Tangkapan Layar Rangkaian Sistem Simulasi [Kembali]

8. Foto Rangkaian Prototipe [Kembali]


9. Video Penjelasan Prinsip Kerja Sistem Rangkaian [Kembali]

10. Kesimpulan dan Saran [Kembali]

Kesimpulan

  1. Sistem robot wiper berhasil dirancang dan dioptimalkan. Implementasi visibilitas kombinasi ( sensor fusion ) antara LDR Photocell dan Sensor Arus (ACS712) terbukti sangat efektif mencegah aktivasi wiper keliru akibat cuaca mendung (transisi awan), sehingga secara signifikan menghemat daya baterai robot.

  2. Penggunaan motor Bi-Stepper dengan kontrol semi-tertutup menggunakan mekanisme Limit Switch sangat ideal untuk membatasi lintasan wiper dan memastikan wiper kembali ke titik nol ( home position ) dengan akurat.

  3. Melalui instrumen pengembangan ini, pemeliharaan instalasi panel surya milik Bapak Zaini, Ph.D. di Batu Busuk menjadi jauh lebih mandiri, meningkatkan efisiensi daya serap matahari harian masyarakat secara otomatis pasca fenomena alam ekstrim (seperti Galodo).

Saran

  1. Untuk implementasi perangkat keras ( hardware ) di dunia nyata, sangat disarankan menambahkan modul RTC (Real-Time Clock) agar fungsi pembersihan preventif juga dapat dijadwalkan secara periodik (misalnya 1 minggu sekali).

  2. Sensor Arus yang disimulasikan menggunakan ACS712 dapat ditingkatkan menggunakan modul sensor daya digital I2C (seperti INA219) agar beban pin ADC pada mikrokontroler STM32 berkurang dan pembacaan dayanya lebih kebal terhadap gangguan ( noise ) elektromagnetik.

11. Download File (File Proteus, Datasheet, dan Library Komponen) [Kembali]

  1. Lembar Data STM 32F103C8T6 [klik disini]
  2. Modul LDR lembar data  [klik disini]
  3. Lembar Data Sensor Ultrasonik HC-SR04  [klik disini]
  4. Lembar Data ACS712-20A  [klik disini]
  5. Lembar Data Driver Motor l298   [klik disini]
  6. Lembar Data LCD 16x2 LM016L  [klik disini]


Komentar