Modul 4
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.
·
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.
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:
·
Jumper
![]() |
4. Landasan Teori
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.
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.
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.
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.
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.
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
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.
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.
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.
PWM adalah
metode pengaturan daya dengan mengubah
lebar pulsa sinyal
digital. Duty Cycle:
Fungsi:
·
Mengatur posisi servo.
·
Mengatur tingkat
kecerahan lampu.
·
Menghemat energi 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.
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.
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 kΩ 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 kΩ 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.
/* 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
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













Comments
Post a Comment