Modul 4

[KEMBALI KE MENU SEBELUMNYA]




1. Pendahuluan

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

Adapun tujuan dari praktikum modul 4 ini Adalah: 

1. Merancang dan mengimplementasikan sistem penerangan lampu jalan otomatis berbasis mikrokontroler STM32 Blue Pill.

 2. Mempelajari cara kerja dan pemrograman mikrokontroler STM32 Blue Pill dalam mengendalikan perangkat elektronik secara otomatis. 

3. Mengintegrasikan sensor LDR (Light Dependent Resistor) sebagai pendeteksi intensitas cahaya untuk mengatur kondisi nyala dan mati lampu secara otomatis. 

4. Menerapkan konsep pemanfaatan Pembangkit Listrik Tenaga Surya (PLTS) sebagai sumber energi alternatif yang mandiri dan ramah lingkungan.

 5. Menguji kinerja sistem penerangan otomatis dalam merespons perubahan kondisi pencahayaan lingkungan. 

6. Meningkatkan pemahaman mahasiswa mengenai integrasi antara sensor, aktuator, dan mikrokontroler dalam suatu sistem kendali otomatis. 

7. Mengembangkan kemampuan mahasiswa dalam merancang solusi teknologi yang dapat diterapkan pada wilayah terdampak bencana untuk mendukung kebutuhan penerangan darurat. 

8. Mengevaluasi efisiensi penggunaan energi melalui penerapan sistem penerangan yang bekerja secara otomatis sesuai kondisi lingkungan. 

3. Alat dan Komponen

·       STM32 Bluepill

Fungsi: Mikrokontroler utama yang memproses data sensor dan mengendalikan seluruh sistem.

 

·       Servo 9g biru

Fungsi: Aktuator otomatis yang digunakan untuk melindungi Sensor LDR dari kotoran ketika sensor LDR sudah tidak berjalan sesuai logika yang deprogram.



 

·       MOSFET 3A Kontinu

Fungsi: Berfungsi sebagai saklar elektronik untuk mengendalikan lampu dengan arus yang lebih besar.



 

·       Resistor 20 kOhm

Fungsi: Resistor pull-down pada gate MOSFET agar MOSFET tetap OFF saat tidak ada sinyal dari STM32.

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:


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%.

Spesifikasi


·       Adaptor 5V 3A

Fungsi: sebagai sumber tegangan DC 5 volt untuk mensuplai komponen-komponen elektronika yang membutuhkan tegangan kerja 5V.



 

·       Lampu DC 12Watt 5V

Fungsi: Beban utama yang berfungsi sebagai penerangan jalan.



 

·       Sensor LDR

LDR adalah sensor cahaya yang nilai resistansinya berubah berdasarkan intensitas cahaya di sekitarnya. Berfungsi untuk memberikan sinyal supaya motor bergerak saat mendeteksi perubahan kondisi dari gelap ke terang.

Prinsip kerja:

Saat cahaya terang, maka resistansi LDR akan menurun dan arus akan meningkat sehingga motor dapat menyala.

Saat cahaya gelap, maka resistansi LDR meningkat dan arus akan menurun sehingga motor tidak dapat menyala.



·       Sensor PIR

Fungsi: Mendeteksi keberadaan atau pergerakan manusia melalui radiasi inframerah, ketika sensor mendeteksi keberadaan manusia maka lampu otomatis akan menyala terang, sebaliknya jika sensor tidak mendeteksi adanya keberadaan manusia maka lampu otomatis akan menyala redup.


 

 

·      


Saklar SPST

·       LCD I2C

Fungsi: Menampilkan informasi seperti kondisi terang/gelap, status PIR, dan kondisi lampu.



 

·       Sensor Touch

Fungsi: Sebagai input manual untuk mengatur sistem


2.     Alat

·       Multimeter

DC Voltmeter merupakan alat yang digunakan untuk mengukur besar tengangan pada suatu komponen. Cara pemakaiannya adalah dengan memparalelkan kaki2 Voltmeter dengan komponen yang akan diuji tegangannya.

 

Berikut adalah Spesifikasi dan keterangan Probe DC Volemeter:

 


 


·       Ampermeter


 

 

Ampermeter adalah alat ukur listrik yang digunakan untuk mengukur besar arus listrik

(I) yang mengalir pada suatu rangkaian. Satuan yang digunakan adalah Ampere (A), sesuai dengan hukum Ohm dan konsep dasar arus listrik. Agar pembacaan akurat, ampermeter harus disusun secara seri dengan beban sehingga seluruh arus yang mengalir ke beban juga melewati ampermeter.

Spesifikasi:


 

·       Solder

 

 


 

 

 

·       Papan PCB


·       Jumper


 

4. Landasan Teori

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.

Persamaan Dasar:

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, maka:

·       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

·       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:

·       LDR mendeteksi malam hari.

·       PIR mendeteksi gerakan.

·       STM32 memproses data.

·       MOSFET mengaktifkan lampu.

·       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.


5. Flowchart dan Listing Program

Prosedur Perakitan Rangkaian:

1)     Menyiapkan seluruh komponen yang digunakan (STM32 Blue Pill, LDR, resistor 10 kΩ, PIR, touch sensor, LCD 16×2, PCF8574, MOSFET IRLZ44N, servo, buzzer, lampu, baterai, dan adaptor 5 V).

2)     Menghubungkan adaptor 5 V sebagai sumber tegangan rangkaian.

3)     Menghubungkan seluruh pin GND komponen ke ground yang sama (common ground).

4)     Merangkai LDR dan resistor 10 sebagai rangkaian voltage divider.

5)     Menghubungkan titik tengah rangkaian voltage divider ke pin PA0 STM32 sebagai input ADC.

6)     Menghubungkan sensor PIR ke sumber tegangan, ground, dan pin input digital STM32.

7)     Menghubungkan touch sensor ke sumber tegangan, ground, dan pin input STM32.

8)     Menghubungkan LCD 16×2 dengan modul I2C PCF8574.

9)     Menghubungkan pin SDA dan SCL PCF8574 ke pin komunikasi I2C STM32.

10) Menghubungkan motor servo ke pin VCC, GND, dan pin PWM STM32 (PB3).

11) Menghubungkan buzzer ke pin output STM32 dan ground.

12) Menghubungkan gate MOSFET ke pin output STM32 melalui resistor gate.

13) Memasang resistor pull-down 20 antara gate MOSFET dan ground.

14) Menghubungkan source MOSFET ke ground.

15) Menghubungkan drain MOSFET ke terminal negatif lampu.

16) Menghubungkan terminal positif lampu ke sumber tegangan baterai.

17) Menghubungkan baterai sebagai sumber energi untuk beban lampu.

18) Memeriksa seluruh koneksi dan memastikan tidak terjadi hubung singkat.

19) Menghubungkan STM32 Blue Pill ke komputer untuk proses pemrograman.

20) Mengunggah program ke STM32 menggunakan STM32CubeIDE atau software pemrograman yang digunakan.

21) Menyalakan sistem dan melakukan pengujian sensor LDR.

22) Melakukan pengujian sensor PIR.

23) Melakukan pengujian touch sensor.

24) Melakukan pengujian LCD dan tampilan informasi sistem.

25) Melakukan pengujian motor servo.

26) Melakukan pengujian MOSFET sebagai saklar elektronik.

27) Melakukan pengujian lampu pada kondisi terang dan gelap.

28) Melakukan pengujian sistem secara keseluruhan hingga lampu dapat bekerja otomatis sesuai kondisi lingkungan dan deteksi gerakan.

 

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,

(Sudut Maksimal 180 deg) target_posisi = 0;

}

 

else

 

{

 

  HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2,

(Sudut Minimal 0 deg)

 

target_posisi = 90;

 

}

 

}


200); // ~2ms Pulsa

 

 

 

 

 

 

 

 

 

 

100); // ~1ms Pulsa


 

 

 

//

=================================================================

 

// 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,

Maksimal (~95% dari ARR 999) HD44780_SetCursor(0, 1); HD44780_PrintStr("LAMP: TERANG MAX");

}

 

else

 

{

 

  HAL_TIM_SET_COMPARE(&htim3,     TIM_CHANNEL_3,

Standby (~12% dari ARR 999)


950);    //    Terang

 

 

 

 

 

 

 

 

 

 

 

 

120);    //    Redup


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


 

Prinsip kerja:

Prinsip kerja rangkaian Sistem Penerangan Lampu Jalan Otomatis di Wilayah Terdampak Bencana Berbasis PLTS Menggunakan STM32 Blue Pill dimulai dari penyediaan energi listrik yang berasal dari sistem PLTS dan disimpan dalam baterai. Energi yang tersimpan pada baterai digunakan untuk mensuplai seluruh rangkaian, termasuk mikrokontroler STM32 Blue Pill, sensor, LCD, motor servo, dan lampu penerangan. STM32 Blue Pill berperan sebagai pusat kendali yang menerima data dari berbagai sensor, memprosesnya sesuai program yang telah dibuat, kemudian memberikan perintah kepada perangkat keluaran.

Sensor LDR digunakan untuk mendeteksi intensitas cahaya lingkungan. LDR dirangkai bersama resistor 10 kΩ sebagai rangkaian voltage divider sehingga perubahan resistansi LDR akibat perubahan cahaya dapat diubah menjadi perubahan tegangan. Tegangan tersebut dibaca oleh pin ADC pada STM32. Ketika kondisi lingkungan terang, resistansi LDR menjadi kecil sehingga STM32 mengenali kondisi siang hari. Sebaliknya, ketika kondisi lingkungan gelap, resistansi LDR meningkat sehingga STM32 mengenali kondisi malam hari. Informasi ini digunakan sebagai dasar untuk menentukan apakah sistem penerangan perlu diaktifkan atau tidak.

Setelah kondisi gelap terdeteksi, sensor PIR mulai berperan untuk mendeteksi adanya pergerakan manusia atau kendaraan di sekitar area lampu jalan. Sensor PIR bekerja dengan mendeteksi perubahan radiasi inframerah yang dipancarkan oleh tubuh manusia. Ketika terdapat pergerakan, sensor PIR akan menghasilkan sinyal digital yang dikirimkan ke STM32. Mikrokontroler kemudian memproses sinyal tersebut dan memutuskan untuk mengaktifkan lampu penerangan.

Proses penyalaan lampu dilakukan melalui MOSFET IRLZ44N yang berfungsi sebagai saklar elektronik. STM32 mengirimkan sinyal ke kaki gate MOSFET sehingga MOSFET menjadi aktif dan menghubungkan sumber tegangan baterai ke lampu. Akibatnya, lampu menyala dan memberikan penerangan pada area yang terdeteksi memiliki aktivitas. Ketika tidak ada pergerakan yang terdeteksi dalam waktu tertentu, STM32 dapat mematikan atau meredupkan lampu kembali untuk menghemat energi yang tersimpan dalam baterai.


Selain itu, rangkaian juga dilengkapi dengan LCD 16×2 yang terhubung melalui modul I2C PCF8574. LCD digunakan untuk menampilkan berbagai informasi sistem, seperti kondisi terang atau gelap, status deteksi gerakan oleh sensor PIR, kondisi lampu, serta informasi lain yang diperlukan pengguna. Penggunaan modul I2C memungkinkan komunikasi LCD dengan STM32 hanya menggunakan dua jalur komunikasi, yaitu SDA dan SCL, sehingga penggunaan pin mikrokontroler menjadi lebih efisien.

Touch sensor pada rangkaian berfungsi sebagai media kontrol manual. Ketika sensor disentuh, STM32 akan menerima sinyal masukan yang dapat digunakan untuk mengubah mode operasi sistem, menyalakan atau mematikan lampu secara manual, maupun menjalankan fungsi lain sesuai program yang dibuat. Selain itu, buzzer digunakan sebagai indikator suara untuk memberikan notifikasi ketika kondisi tertentu terjadi, misalnya saat gerakan terdeteksi atau saat sistem diaktifkan.

Motor servo yang terhubung ke STM32 berfungsi sebagai aktuator yang dapat bergerak sesuai sinyal PWM yang diberikan oleh mikrokontroler. Pada sistem ini, servo dapat dimanfaatkan untuk mengubah arah lampu penerangan atau mengatur posisi panel surya agar memperoleh penyinaran matahari yang lebih optimal. Pergerakan servo diatur berdasarkan logika yang telah diprogram pada STM32.

Secara keseluruhan, sistem bekerja dengan menggabungkan deteksi cahaya oleh LDR dan deteksi gerakan oleh PIR untuk mengendalikan lampu secara otomatis. Lampu hanya akan menyala ketika kondisi lingkungan gelap dan terdapat aktivitas yang terdeteksi, sehingga penggunaan energi listrik menjadi lebih efisien. Konsep ini sangat sesuai diterapkan pada wilayah terdampak bencana karena mampu menyediakan penerangan secara otomatis dengan memanfaatkan energi terbarukan dari PLTS serta menghemat kapasitas baterai yang tersedia.


7. Video Simulasi



8. Kesimpulan Dan Saran

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)     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.




8. Download File 

Laporan Akhir klik disini


Kembali ke Daftar Isi

Comments

Popular posts from this blog