LAPORAN AKHIR MODUL 4

 [KEMBALI KE MENU SEBELUMNYA]

 




MODUL 4

Sistem Penerangan Lampu Jalan Otomatis di Wilayah Terdampak Bencana Berbasis PLTS dengan Menggunakan STM32BluePill

1. Pendahuluan [Kembali]

Ketersediaan sistem penerangan yang andal merupakan salah satu kebutuhan penting di wilayah terdampak bencana untuk mendukung aktivitas masyarakat, meningkatkan keamanan, serta mempermudah proses evakuasi dan penyaluran bantuan pada malam hari. Namun, kerusakan infrastruktur kelistrikan akibat bencana sering menyebabkan terputusnya pasokan listrik sehingga penerangan jalan tidak dapat beroperasi secara normal. Oleh karena itu, diperlukan suatu sistem penerangan yang mampu bekerja secara mandiri tanpa bergantung pada jaringan listrik utama. Salah satu solusi yang dapat diterapkan adalah pemanfaatan Pembangkit Listrik Tenaga Surya (PLTS) sebagai sumber energi terbarukan yang ramah lingkungan dan mudah diimplementasikan pada daerah terdampak bencana.

Pada praktikum mikroprosesor dan mikrokontroler ini, dirancang sebuah Sistem Penerangan Lampu Jalan Otomatis di Wilayah Terdampak Bencana Berbasis PLTS Menggunakan STM32 Blue Pill. Sistem ini memanfaatkan sensor Light Dependent Resistor (LDR) untuk mendeteksi intensitas cahaya lingkungan sehingga lampu dapat menyala secara otomatis saat kondisi gelap dan mati ketika kondisi terang. Mikrokontroler STM32 Blue Pill berfungsi sebagai pusat kendali yang memproses data dari sensor dan mengatur operasi lampu secara efisien. Dengan adanya sistem ini, penggunaan energi dapat dioptimalkan, ketergantungan terhadap jaringan listrik konvensional dapat dikurangi, serta ketersediaan penerangan di daerah terdampak bencana dapat tetap terjaga. Melalui proyek ini, mahasiswa dapat mempelajari penerapan mikrokontroler dalam sistem otomasi, integrasi sensor, serta pemanfaatan energi terbarukan untuk menyelesaikan permasalahan nyata di masyarakat.

2. Tujuan [Kembali]

  1. Merancang dan mengimplementasikan sistem penerangan lampu jalan otomatis di wilayah terdampak bencana berbasis mikrokontroler STM32 Blue Pill.
  2. Menerapkan konsep pemanfaatan Pembangkit Listrik Tenaga Surya (PLTS) sebagai sumber energi alternatif yang mandiri dan ramah lingkungan.
  3. Mengembangkan kemampuan mahasiswa dalam merancang solusi teknologi yang dapat diterapkan pada wilayah terdampak bencana untuk mendukung kebutuhan penerangan darurat.
  4. Mengevaluasi efisiensi penggunaan energi melalui penerapan sistem penerangan yang bekerja secara otomatis sesuai kondisi lingkungan.

3. Alat dan Bahan [Kembali]

A. Bahan

1. STM32 Bluepill

  



2. Servo 9g biru
 




3. MOSFET 3A Kontinu
   



4. Resistor 20 kOhm

                                     
Resistor adalah komponen Elektronika Pasif yang memiliki nilai resistansi atau hambatan tertentu yang berfungsi untuk membatasi dan mengatur arus listrik dalam suatu rangkaian Elektronika (V=I R). 
Jenis Resistor yang digunakan disini adalah Fixed Resistor, dimana merupakan resistor dengan nilai tetap terdiri dari film tipis karbon yang diendapkan subtrat isolator kemudian dipotong berbentuk spiral. Keuntungan jenis fixed resistor ini dapat menghasilkan resistor dengan toleransi yang lebih rendah.
Cara menghitung nilai resistor:
Tabel warna

Contoh :
Gelang ke 1 : Coklat = 1
Gelang ke 2 : Hitam = 0
Gelang ke 3 : Hijau   = 5 nol dibelakang angka gelang ke-2; atau kalikan 105
Gelang ke 4 : Perak  = Toleransi 10%
Maka nilai resistor tersebut adalah 10 * 105 = 1.000.000 Ohm atau 1 MOhm dengan toleransi 10%.

5. Adaptor 5V 3A
    



6. Lampu DC 12Watt 5V





7. Sensor LDR






8. Sensor PIR
                                       



9. Saklar SPST
   


10. LCD I2C
    



11. Sensor Touch
   






B. Alat

1. Multimeter



3. Solder 


4. Papan PCB

5. Jumper


4. Landasan Teori [Kembali]

Gambar Ilustrasi Kerja


Landasan Teori Modul I: General Input dan Output

        General Purpose Input Output (GPIO) adalah pin pada mikrokontroler yang dapat dikonfigurasi sebagai input untuk menerima sinyal dari sensor atau sebagai output untuk mengendalikan perangkat keluaran. Pada rangkaian ini, STM32 Blue Pill memanfaatkan GPIO untuk berkomunikasi dengan seluruh komponen yang terhubung.

        Sebagai input, GPIO digunakan untuk membaca sinyal dari sensor PIR dan touch sensor, sedangkan LDR dibaca melalui pin ADC untuk mengetahui kondisi terang atau gelap. Sebagai output, GPIO digunakan untuk mengendalikan MOSFET yang menyalakan lampu, mengaktifkan buzzer, serta menghasilkan sinyal PWM untuk menggerakkan motor servo. Selain itu, GPIO juga digunakan sebagai jalur komunikasi I2C (SDA dan SCL) untuk menghubungkan STM32 dengan LCD melalui modul PCF8574.

        Dengan demikian, GPIO berperan sebagai antarmuka utama yang memungkinkan STM32 menerima data dari sensor dan mengendalikan perangkat keluaran sesuai program yang telah ditentukan.

Landasan Teori Modul II: PWM, ADC, dan Interrupt

        ADC (Analog to Digital Converter) merupakan fitur pada mikrokontroler yang berfungsi mengubah sinyal analog menjadi data digital agar dapat diproses oleh sistem. Pada rangkaian ini, ADC digunakan untuk membaca tegangan keluaran dari sensor LDR yang dirangkai sebagai voltage divider. Nilai tegangan yang berubah sesuai intensitas cahaya akan dikonversi menjadi data digital oleh STM32 Blue Pill. Berdasarkan nilai tersebut, mikrokontroler dapat menentukan apakah kondisi lingkungan sedang terang atau gelap sehingga dapat mengendalikan lampu secara otomatis.

        PWM (Pulse Width Modulation) adalah metode pengaturan daya dengan mengubah lebar pulsa sinyal digital pada frekuensi tertentu. Besarnya daya yang diberikan ditentukan oleh nilai duty cycle, yaitu perbandingan antara waktu sinyal aktif (ON) terhadap periode total sinyal.

        Pada rangkaian ini, PWM digunakan untuk mengendalikan motor servo yang terhubung ke STM32 Blue Pill. Perubahan lebar pulsa PWM akan menentukan sudut putar servo, sehingga servo dapat bergerak sesuai perintah yang diberikan oleh mikrokontroler. Dengan PWM, posisi servo dapat diatur secara presisi tanpa memerlukan sinyal analog.

        Interrupt adalah mekanisme yang memungkinkan mikrokontroler menghentikan sementara proses yang sedang dijalankan untuk menangani suatu kejadian penting secara langsung. Setelah kejadian tersebut selesai diproses, program akan kembali melanjutkan proses sebelumnya.

        Pada rangkaian ini, interrupt dapat diterapkan pada sensor PIR atau touch sensor. Ketika sensor PIR mendeteksi gerakan atau touch sensor disentuh, STM32 dapat segera merespons tanpa harus terus-menerus memeriksa kondisi sensor (polling). Dengan penggunaan interrupt, sistem menjadi lebih cepat, efisien, dan responsif dalam mengendalikan lampu maupun fungsi lainnya.

Landasan Teori Modul III: Communication

        Communication pada mikrokontroler merupakan proses pertukaran data antara mikrokontroler dengan perangkat lain menggunakan protokol komunikasi tertentu. Pada rangkaian Sistem Penerangan Lampu Jalan Otomatis Berbasis PLTS Menggunakan STM32 Blue Pill, komunikasi data digunakan untuk menghubungkan STM32 dengan LCD 16×2 melalui modul PCF8574 menggunakan protokol I2C (Inter-Integrated Circuit).

        I2C adalah protokol komunikasi serial yang menggunakan dua jalur utama, yaitu SDA (Serial Data) sebagai jalur pengiriman data dan SCL (Serial Clock) sebagai jalur sinkronisasi clock. Pada komunikasi ini, STM32 Blue Pill bertindak sebagai master yang mengirimkan data, sedangkan PCF8574 bertindak sebagai slave yang menerima data dan meneruskannya ke LCD. Melalui komunikasi I2C, STM32 dapat menampilkan informasi seperti kondisi terang atau gelap, status deteksi gerakan, dan kondisi lampu hanya dengan menggunakan dua pin komunikasi.

        Penggunaan komunikasi I2C pada rangkaian memberikan beberapa keuntungan, yaitu menghemat jumlah pin GPIO yang digunakan, menyederhanakan proses pengkabelan, serta memungkinkan komunikasi yang lebih efisien antara mikrokontroler dan perangkat periferal. Oleh karena itu, materi communication pada rangkaian ini diwujudkan melalui penerapan komunikasi serial I2C antara STM32 Blue Pill, PCF8574, dan LCD sebagai media pertukaran data dan informasi sistem.

1. Pembangkit Listrik Tenaga Surya (PLTS)

PLTS merupakan sistem pembangkit listrik yang mengubah energi cahaya matahari menjadi energi listrik menggunakan panel surya (fotovoltaik). Energi yang dihasilkan digunakan untuk mengisi baterai melalui charge controller, kemudian disalurkan ke beban seperti lampu jalan dan sistem kontrol.

Prinsip Kerja:

  • Panel surya menyerap energi matahari.
  • Sel surya menghasilkan tegangan DC.
  • Energi disimpan dalam baterai.
  • Energi dari baterai digunakan untuk menyalakan sistem penerangan.

Kelebihan

  • Ramah lingkungan.
  • Tidak bergantung pada jaringan PLN.
  • Cocok digunakan di daerah terdampak bencana.

2. Mikrokontroler STM32 Blue Pill

STM32 Blue Pill merupakan papan pengembangan yang menggunakan mikrokontroler STM32F103C8T6 berbasis ARM Cortex-M3.

Fungsi

  • Membaca data dari sensor.
  • Memproses logika pengendalian.
  • Mengendalikan lampu dan aktuator.
  • Menampilkan informasi pada LCD.

Karakteristik

  • Tegangan kerja 3,3 V.
  • Memiliki pin digital dan analog.
  • Mendukung komunikasi I2C, SPI, dan UART.

3. Sensor LDR (Light Dependent Resistor)

LDR adalah resistor yang nilai hambatannya berubah sesuai intensitas cahaya yang diterima.

Prinsip Kerja

  • Saat terang → resistansi kecil.
  • Saat gelap → resistansi besar.

Fungsi dalam Sistem

Menentukan kondisi siang atau malam sehingga lampu hanya aktif saat malam hari.

Menurut Hukum Ohm:

V=I×R

Perubahan resistansi LDR menyebabkan perubahan tegangan yang dibaca oleh ADC STM32.

4. Sensor PIR (Passive Infrared Sensor)

Sensor PIR digunakan untuk mendeteksi pergerakan manusia berdasarkan radiasi inframerah yang dipancarkan tubuh.

Prinsip Kerja:

  • Tubuh manusia memancarkan radiasi inframerah.
  • PIR mendeteksi perubahan radiasi tersebut.
  • Sensor menghasilkan sinyal HIGH ketika ada pergerakan.

Fungsi dalam Sistem:

Mengaktifkan lampu ketika terdapat aktivitas manusia atau kendaraan.

5. Sensor Sentuh (Touch Sensor)

Sensor sentuh bekerja berdasarkan perubahan kapasitansi saat permukaannya disentuh oleh jari.

Prinsip Kerja:

Ketika jari menyentuh sensor:

  • Kapasitansi berubah.
  • Modul menghasilkan sinyal digital yang dibaca STM32.

Fungsi: Sebagai tombol manual untuk mengontrol sistem.

6. LCD 16×2

LCD 16×2 merupakan perangkat output yang mampu menampilkan 16 karakter pada 2 baris.

Fungsi: Menampilkan:

  • Kondisi terang atau gelap.
  • Status PIR.
  • Status lampu.
  • Informasi sistem lainnya.

7. Komunikasi I2C dan PCF8574

PCF8574 merupakan IC ekspander I/O yang menggunakan protokol komunikasi I2C.

Prinsip Kerja I2C:

Komunikasi menggunakan dua jalur:

  • SDA (Serial Data)
  • SCL (Serial Clock)

Keuntungan: LCD dapat dikendalikan hanya menggunakan dua pin STM32 sehingga menghemat penggunaan pin.

8. MOSFET IRF520

MOSFET adalah transistor efek medan yang digunakan sebagai saklar elektronik.

Prinsip Kerja:

  • Tegangan diberikan ke Gate.
  • Arus dapat mengalir dari Drain ke Source.
  • Beban (lampu) menyala.

Fungsi dalam Sistem: Mengendalikan lampu dengan arus yang lebih besar dibanding kemampuan keluaran STM32.

Keunggulan:

  • Switching cepat.
  • Efisiensi tinggi.
  • Konsumsi daya kecil pada sisi kontrol.

9. Motor Servo

Motor servo merupakan motor DC yang dilengkapi sistem kontrol posisi.

Prinsip Kerja: Servo menerima sinyal PWM dari STM32.

Lebar pulsa PWM menentukan sudut putar servo.

Contoh:

  • 1 ms → 0°
  • 1,5 ms → 90°
  • 2 ms → 180°

Fungsi dalam Sistem:

  • Mengarahkan panel surya (solar tracker).
  • Mengatur arah lampu penerangan.
  • Sebagai aktuator mekanik otomatis.

10. Pulse Width Modulation (PWM)

PWM adalah metode pengaturan daya dengan mengubah lebar pulsa sinyal digital.

Duty Cycle:


Fungsi:

  • Mengatur posisi servo.
  • Mengatur tingkat kecerahan lampu.
  • Menghemat energi baterai.

11. Baterai

Baterai berfungsi sebagai penyimpan energi listrik yang dihasilkan panel surya.

Fungsi:

  • Menyuplai daya saat malam hari.
  • Menjaga sistem tetap bekerja ketika tidak ada sinar matahari.

12. Sistem Penerangan Jalan Otomatis

Sistem penerangan jalan otomatis merupakan sistem yang mengendalikan lampu berdasarkan kondisi lingkungan dan keberadaan pengguna jalan.

Prinsip Kerja:

  1. LDR mendeteksi malam hari.
  2. PIR mendeteksi gerakan.
  3. STM32 memproses data.
  4. MOSFET mengaktifkan lampu.
  5. Lampu menyala hanya saat diperlukan.

Manfaat:

  • Menghemat energi.
  • Memperpanjang umur baterai.
  • Meningkatkan keamanan daerah terdampak bencana.

13. Voltage Divider

Voltage divider (pembagi tegangan) adalah rangkaian yang terdiri dari dua resistor yang disusun seri untuk menghasilkan tegangan keluaran tertentu yang nilainya lebih kecil dari tegangan sumber.
LDR dan resistor R1 (10 kΩ) disusun sebagai rangkaian pembagi tegangan (voltage divider). Tujuannya adalah mengubah perubahan resistansi LDR akibat perubahan cahaya menjadi perubahan tegangan yang dapat dibaca oleh pin ADC STM32.

Tegangan keluaran mengikuti prinsip pembagi tegangan:

Vout=VinR1RLDR+R1V_{out}=V_{in}\frac{R_1}{R_{LDR}+R_1}

5. Flowchart dan Listing Program [Kembali]

FLOWCHART


LISTING PROGRAM

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body (Gabungan Logika Utuh + FIX ADC & I2C)
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2026 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "liquidcrystal_i2c.h" // Driver LCD I2C Baru
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
I2C_HandleTypeDef hi2c1;
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3;

/* USER CODE BEGIN PV */
uint32_t nilai_ldr = 0;

// Variabel Tambahan Kendali Servo Non-blocking (PB3)
uint32_t waktu_sebelumnya = 0;
uint8_t target_posisi = 90;

// Buffer untuk menampung teks LCD jika dibutuhkan sprintf
char buff_lcd[16];

// --- Variabel Program Lama: Toggle Touch Sensor (Falling Edge) ---
uint8_t status_touch_terakhir = GPIO_PIN_RESET;
uint8_t lampu_manual_aktif = 0; // 0: Mati/Auto, 1: Redup Manual

// --- Variabel Program Lama: Pelacak Transisi LDR & Penentu Prioritas ---
uint8_t status_ldr_terakhir = 0;  // 0: Terang, 1: Gelap
uint8_t prioritas_sistem = 0;     // 0: Prioritas LDR (Otomatis), 1: Prioritas Touch (Manual)
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_I2C1_Init(void);
static void MX_TIM2_Init(void);
static void MX_TIM3_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_I2C1_Init();
  MX_TIM2_Init();
  MX_TIM3_Init();

  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3); // PWM Lampu di PB0
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); // PWM Servo di PB3

  // Set posisi awal servo ke 0 derajat (Skala Period/ARR 1999)
  __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 100);

  // Inisialisasi Tampilan Awal LCD via Library I2C Baru
  HD44780_Init(2); // Inisialisasi LCD 2 Baris
  HD44780_SetCursor(0, 0);
  HD44780_PrintStr("System Ready...");
  HAL_Delay(1000);
  HD44780_Clear();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    // =================================================================
    // 1. KENDALI SERVO OTOMATIS BOLAK-BALIK (TIAP 1 DETIK) - NON BLOCKING
    // =================================================================
    uint32_t waktu_sekarang = HAL_GetTick();

    if (waktu_sekarang - waktu_sebelumnya >= 1000)
    {
        waktu_sebelumnya = waktu_sekarang;

        if (target_posisi == 90)
        {
            __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 200); // ~2ms Pulsa (Sudut Maksimal 180 deg)
            target_posisi = 0;
        }
        else
        {
            __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 100); // ~1ms Pulsa (Sudut Minimal 0 deg)
            target_posisi = 90;
        }
    }

    // =================================================================
    // 2. PROSES BACA DATA SENSOR LDR (PA1) VIA ADC1
    // =================================================================
    HAL_ADC_Start(&hadc1);
    if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
    {
        nilai_ldr = HAL_ADC_GetValue(&hadc1);
    }
    HAL_ADC_Stop(&hadc1);

    // =================================================================
    // 3. LOGIKA DETEKSI TRANSISI EVENT & PENENTUAN PRIORITAS
    // =================================================================

    // --- EVALUASI EVENT 1: DETEKSI KETUKAN TOUCH SENSOR (FALLING EDGE) ---
    uint8_t status_touch_sekarang = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2);

    if (status_touch_terakhir == GPIO_PIN_SET && status_touch_sekarang == GPIO_PIN_RESET)
    {
        // Touch Sensor dipicu! Alihkan kendali ke MANUAL (Prioritas Touch)
        prioritas_sistem = 1;

        // Toggle kondisi status lampu manual
        if (lampu_manual_aktif == 0) lampu_manual_aktif = 1;
        else                         lampu_manual_aktif = 0;
    }
    status_touch_terakhir = status_touch_sekarang;

    // --- EVALUASI EVENT 2: DETEKSI PERUBAHAN TRANSISI SENSOR LDR ---
    // Batas tengah Lux diatur ke nilai 2000 untuk kalibrasi rangkaian pull-down di Proteus
    uint8_t status_ldr_sekarang = (nilai_ldr < 600) ? 1 : 0; // 1: Gelap, 0: Terang

    // Cek jika terjadi perubahan kondisi cuaca dari loop sebelumnya
    if (status_ldr_sekarang != status_ldr_terakhir)
    {
        // LDR mendeteksi perubahan kondisi! Kembalikan prioritas ke OTOMATIS
        prioritas_sistem = 0;

        // Reset status manual agar tidak mengunci sistem saat otomatis mengambil alih
        lampu_manual_aktif = 0;
    }
    status_ldr_terakhir = status_ldr_sekarang;


    // =================================================================
    // 4. EKSEKUSI OUTPUT LAMPU & UPDATE TAMPILAN LCD I2C
    // =================================================================
    uint8_t final_lampu_on = 0; // Penentu keputusan akhir lampu aktif

    if (prioritas_sistem == 1) // --- JIKA PRIORITAS TOUCH (MANUAL) ---
    {
        final_lampu_on = lampu_manual_aktif;

        // Tampilan LCD I2C Baris 1 penanda mode Manual
        HD44780_SetCursor(0, 0);
        if (status_ldr_sekarang == 1) HD44780_PrintStr("LDR:GLP (MANUAL)");
        else                          HD44780_PrintStr("LDR:TRG (MANUAL)");
    }
    else // --- JIKA PRIORITAS LDR (OTOMATIS) ---
    {
        final_lampu_on = status_ldr_sekarang; // Mengikuti kondisi gelap LDR

        // Tampilan LCD I2C Baris 1 penanda mode Otomatis
        HD44780_SetCursor(0, 0);
        if (status_ldr_sekarang == 1)
        {
            // Jika hari gelap, cek sekalian sensor gerakan PIR (PA3)
            if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == GPIO_PIN_SET)
                HD44780_PrintStr("LDR: GELAP +PIR ");
            else
                HD44780_PrintStr("LDR: GELAP      ");
        }
        else
        {
            HD44780_PrintStr("LDR: TERANG     ");
        }
    }

    // --- EKSEKUSI TINGKAT KECERAHAN PWM LAMPU (PB0) ---
    if (final_lampu_on == 1)
    {
        // Tetap responsif terhadap gerakan PIR jika lampu aktif
        if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == GPIO_PIN_SET)
        {
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 950); // Terang Maksimal (~95% dari ARR 999)
            HD44780_SetCursor(0, 1);
            HD44780_PrintStr("LAMP: TERANG MAX");
        }
        else
        {
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 120); // Redup Standby (~12% dari ARR 999)
            HD44780_SetCursor(0, 1);
            HD44780_PrintStr("LAMP: REDUP     ");
        }
    }
    else
    {
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0);      // Mati total (0%)
        HD44780_SetCursor(0, 1);
        HD44780_PrintStr("LAMP: MATI      ");
    }

    HAL_Delay(50); // Menjaga stabilitas loop agar tetap sensitif terhadap sensor
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_ADCPCLK2_DIV2;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (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;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief ADC1 Initialization Function (FIXED: Sampling Time diperlambat demi akurasi LDR)
  */
static void MX_ADC1_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};

  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; // Diubah ke 239.5 Cycles agar pembacaan analog stabil
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief I2C1 Initialization Function
  */
static void MX_I2C1_Init(void)
{
  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief TIM2 Initialization Function (FIXED: Frekuensi PWM Tepat 50 Hz untuk Servo)
  */
static void MX_TIM2_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 79; // Diperbaiki dari 0 menjadi 79 (8MHz / 80 = 100kHz)
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 1999;  // Diperbaiki dari 65535 menjadi 1999 (Sinyal Tepat 50Hz)
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_TIM_MspPostInit(&htim2);
}

/**
  * @brief TIM3 Initialization Function (FIXED: Frekuensi PWM Tepat 1 kHz untuk Dimming LED Mulus)
  */
static void MX_TIM3_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 7;   // Diperbaiki dari 0 menjadi 7 (8MHz / 8 = 1MHz)
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 999;    // Diperbaiki dari 65535 menjadi 999 (Sinyal Tepat 1kHz)
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_TIM_MspPostInit(&htim3);
}

/**
  * @brief GPIO Initialization Function
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /* Configure GPIO pins : PA2 (Touch) PA3 (PIR) */
  GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void Error_Handler(void)
{
  __disable_irq();
  while (1)
  {
  }
}

6. Rangkaian Simulasi dan Prinsip Kerja [Kembali]




Prinsip kerja: 
  1. Energi listrik dari sistem PLTS yang tersimpan pada baterai digunakan untuk mensuplai seluruh rangkaian, termasuk STM32 Blue Pill, sensor, LCD, servo, dan lampu.

  2. Sensor LDR mendeteksi intensitas cahaya lingkungan dan mengirimkan nilai tegangan hasil rangkaian voltage divider ke pin ADC STM32.

  3. STM32 memproses data dari LDR untuk menentukan kondisi siang atau malam.

  4. Ketika kondisi gelap terdeteksi, STM32 mengaktifkan proses pemantauan sensor PIR.

  5. Sensor PIR mendeteksi adanya pergerakan manusia atau kendaraan di sekitar lampu jalan dan mengirimkan sinyal ke STM32.

  6. STM32 memproses sinyal dari PIR dan memberikan perintah ke MOSFET IRF520 apabila terdapat gerakan yang terdeteksi.

  7. MOSFET IRF520 bekerja sebagai saklar elektronik yang menghubungkan sumber tegangan ke lampu sehingga lampu menyala.

  8. Ketika tidak ada gerakan yang terdeteksi atau kondisi kembali terang, STM32 mematikan MOSFET sehingga lampu padam.

  9. LCD 16×2 menampilkan informasi kondisi sistem seperti status cahaya, deteksi gerakan, dan kondisi lampu.

  10. Touch sensor digunakan sebagai kontrol manual untuk mengoperasikan sistem sesuai program yang dibuat.

  11. Motor servo bergerak berdasarkan sinyal PWM dari STM32 untuk menjalankan fungsi mekanis seperti mengatur arah lampu atau panel surya.

  12. Buzzer berfungsi sebagai indikator suara untuk memberikan notifikasi ketika kondisi tertentu terjadi pada sistem.

  13. Sistem bekerja secara otomatis sehingga lampu hanya menyala saat kondisi gelap dan terdapat aktivitas, sehingga energi baterai PLTS dapat digunakan secara lebih efisien.


7. Video Simulasi [Kembali]



8. Kesimpulan dan Saran [Kembali]

a)     A. Kesimpulan

            Berdasarkan perancangan dan implementasi sistem, dapat disimpulkan bahwa proyek Sistem Penerangan Lampu Jalan Otomatis di Wilayah Terdampak Bencana Berbasis PLTS Menggunakan STM32 Blue Pill berhasil mengintegrasikan teknologi energi terbarukan dan sistem kendali otomatis dalam satu kesatuan sistem yang efisien. Sensor LDR mampu mendeteksi kondisi terang dan gelap lingkungan sebagai dasar pengoperasian lampu, sedangkan sensor PIR mampu mendeteksi adanya pergerakan manusia atau kendaraan sehingga lampu hanya menyala ketika diperlukan. STM32 Blue Pill berfungsi sebagai pusat pengendali yang memproses data dari sensor dan mengatur kerja seluruh komponen, termasuk lampu, LCD, buzzer, dan motor servo. Penggunaan MOSFET sebagai saklar elektronik memungkinkan pengendalian beban lampu dengan aman dan efisien. Dengan memanfaatkan sumber energi dari PLTS yang disimpan pada baterai, sistem ini dapat menjadi solusi penerangan yang mandiri, hemat energi, dan cocok diterapkan pada wilayah terdampak bencana yang mengalami keterbatasan pasokan listrik.

b)  B.  Saran

            

                Untuk pengembangan lebih lanjut, sistem dapat dilengkapi dengan modul solar charge controller agar proses pengisian dan perlindungan baterai menjadi lebih optimal. Selain itu, penggunaan sensor cahaya yang lebih akurat atau penambahan beberapa sensor PIR pada area yang lebih luas dapat meningkatkan kinerja sistem dalam mendeteksi kondisi lingkungan. Sistem juga dapat dikembangkan dengan menambahkan fitur monitoring jarak jauh berbasis IoT sehingga kondisi baterai, status lampu, dan data sensor dapat dipantau secara real-time melalui aplikasi atau internet. Penggunaan panel surya dan baterai dengan kapasitas yang lebih besar juga dapat dipertimbangkan untuk meningkatkan keandalan sistem, terutama saat digunakan dalam jangka waktu yang lama pada daerah terdampak bencana. Dengan pengembangan tersebut, sistem diharapkan dapat menjadi solusi penerangan yang lebih efektif, efisien, dan berkelanjutan.

9.  Download File [Kembali]









Komentar

Postingan populer dari blog ini