MODUL 4
Tujuan rancangan Rambu Jalur Evakuasi Cerdas Interaktif untuk Mitigasi Bencana Galodo (Smart Evacuation Signage) Berbasis Multi-Sensor adalah sebagai berikut:
- Menyediakan sistem peringatan dini yang adaptif terhadap potensi bencana galodo dengan memanfaatkan berbagai sensor untuk mendeteksi kondisi lingkungan secara real-time.
- Memberikan informasi jalur evakuasi yang dinamis, sehingga arah evakuasi dapat berubah sesuai kondisi bahaya dan tidak hanya menggunakan rambu statis.
- Meningkatkan keselamatan masyarakat dengan mengarahkan warga menuju lokasi yang paling aman dan mengurangi risiko terjebak di jalur yang terdampak bencana.
- Mengintegrasikan data dari berbagai sensor (misalnya sensor getaran, ketinggian air, curah hujan, atau sensor jarak) untuk menghasilkan keputusan yang lebih akurat mengenai status bahaya.
- Mempercepat proses evakuasi melalui penggunaan indikator visual (LED/papan petunjuk), alarm suara, atau notifikasi sehingga masyarakat dapat segera merespons keadaan darurat.
- Mendukung sistem mitigasi bencana berbasis teknologi cerdas (smart disaster mitigation) yang dapat bekerja secara otomatis dan mengurangi ketergantungan pada informasi manual.
2. alat dan komponen [Kembali]
a. STM32F103C8T6
Mikrokontroler STM32F103C8T6 (Blue Pill) berfungsi sebagai pusat kendali sistem yang menerima data dari seluruh sensor, mengolah informasi, kemudian mengendalikan aktuator seperti servo, buzzer, LED, dan LCD. Mikrokontroler ini menggunakan arsitektur ARM Cortex-M3 32-bit dengan kecepatan hingga 72 MHz sehingga mampu melakukan pemrosesan data secara cepat dan efisien. Dalam sistem deteksi galodo atau banjir bandang, STM32 bertugas membaca nilai ketinggian air, mendeteksi getaran, memantau kondisi hujan, serta menentukan status siaga atau bahaya berdasarkan logika program yang telah dibuat.
b. ST-Link V2
ST-Link V2 merupakan alat pemrograman dan debugging yang digunakan untuk mengunggah program ke dalam memori STM32F103C8T6. Perangkat ini menghubungkan komputer dengan mikrokontroler melalui antarmuka SWD (Serial Wire Debug), sehingga proses pemrograman, pengujian, dan perbaikan program dapat dilakukan dengan mudah. Selain untuk mengunggah program, ST-Link juga digunakan untuk memantau jalannya program secara langsung saat proses debugging.
c. FTDI FT232RL USB to TTL
FTDI FT232RL USB to TTL berfungsi sebagai konverter komunikasi antara komputer dan mikrokontroler melalui antarmuka serial UART. Modul ini memungkinkan data dari STM32 dikirim ke komputer untuk ditampilkan pada Serial Monitor atau aplikasi monitoring lainnya. FTDI sering digunakan untuk menampilkan hasil pembacaan sensor, proses kalibrasi, maupun pengujian sistem sebelum perangkat digunakan secara permanen.
d. VL53L0X
Sensor jarak laser VL53L0X merupakan sensor berbasis teknologi Time of Flight (ToF) yang digunakan untuk mengukur jarak antara sensor dan permukaan objek dengan memanfaatkan pantulan sinar inframerah. Sensor ini memiliki tingkat akurasi yang cukup tinggi dibandingkan sensor ultrasonik karena tidak terpengaruh oleh kondisi suara di lingkungan sekitar. Pada sistem deteksi galodo, VL53L0X digunakan untuk mengukur perubahan ketinggian permukaan air sungai secara real-time. Ketika jarak yang terbaca semakin kecil, berarti permukaan air semakin naik dan sistem dapat memberikan peringatan dini.
e. sw-420
Sensor getar SW-420 berfungsi untuk mendeteksi adanya getaran atau guncangan pada lingkungan sekitar. Sensor ini memiliki saklar pegas internal yang akan menghasilkan sinyal ketika terjadi getaran dengan intensitas tertentu. Dalam sistem peringatan dini galodo, sensor SW-420 dapat digunakan untuk mendeteksi getaran tanah, benturan material, atau pergerakan yang berpotensi mengindikasikan longsoran dan aliran material dari hulu sungai.
f. MH-RD Rain Sensor
Sensor hujan MH-RD Rain Sensor digunakan untuk mendeteksi keberadaan air hujan pada permukaan sensornya. Sensor bekerja berdasarkan perubahan hambatan listrik yang terjadi ketika air mengenai jalur konduktif pada papan sensor. Semakin banyak air yang mengenai permukaan sensor, semakin besar perubahan sinyal yang dihasilkan. Pada sistem galodo, sensor ini berfungsi sebagai indikator kondisi cuaca karena hujan deras merupakan salah satu faktor utama yang dapat memicu terjadinya banjir bandang maupun aliran material vulkanik.
g. Push Button Tactile 12x12 mm
Push Button Tactile 12×12 mm digunakan sebagai tombol input manual yang memanfaatkan fitur interrupt pada STM32. Ketika tombol ditekan, mikrokontroler akan segera menjalankan fungsi tertentu tanpa harus menunggu proses pembacaan program utama selesai. Pada sistem ini, tombol dapat digunakan untuk mengaktifkan mode darurat, melakukan pengujian alarm, mereset status peringatan, atau menggerakkan servo secara manual saat proses pengujian.
h. Motor Servo Towerpro sg90
Motor servo TowerPro SG90 berfungsi sebagai aktuator yang mampu bergerak pada sudut tertentu berdasarkan sinyal PWM (Pulse Width Modulation) dari STM32. Servo memiliki sistem kontrol internal yang memungkinkan posisi porosnya diatur secara presisi antara 0° hingga 180°. Dalam sistem deteksi galodo, servo dapat digunakan untuk membuka dan menutup portal peringatan, menggerakkan indikator mekanik, atau mensimulasikan mekanisme penghalang ketika kondisi bahaya terdeteksi.
i. LCD 16X2 I2C
LCD 16×2 dengan modul I2C PCF8574 berfungsi sebagai media tampilan informasi bagi pengguna. LCD dapat menampilkan berbagai data seperti status sensor, jarak permukaan air, kondisi hujan, status getaran, serta level peringatan sistem. Penggunaan modul I2C memungkinkan komunikasi hanya menggunakan dua jalur data yaitu SDA dan SCL sehingga jumlah pin STM32 yang digunakan menjadi lebih sedikit dibandingkan koneksi paralel biasa.
j. active buzzer 5v
Active Buzzer 5V berfungsi sebagai sirine atau alarm suara ketika sistem mendeteksi kondisi berbahaya. Berbeda dengan buzzer pasif, buzzer aktif dapat langsung menghasilkan suara ketika diberi tegangan tanpa memerlukan sinyal frekuensi tambahan. Pada sistem galodo, buzzer akan aktif secara otomatis saat ketinggian air melebihi batas aman, terjadi getaran mencurigakan, atau kombinasi beberapa sensor menunjukkan potensi bencana.
k. LED 5mm
LED 5 mm Diffused digunakan sebagai indikator visual untuk menunjukkan kondisi sistem secara cepat dan mudah dipahami. LED dapat diprogram dengan beberapa status, misalnya warna hijau menunjukkan kondisi aman, kuning menunjukkan kondisi siaga, dan merah menunjukkan kondisi bahaya. Selain itu LED juga dapat digunakan sebagai indikator daya, status komunikasi, maupun penanda bahwa sistem sedang bekerja dengan normal.
3. Landasan Teori dan grafik respon sensor [Kembali]
1. Sensor Jarak Laser VL53L0X
Sensor VL53L0X merupakan sensor pengukur jarak berbasis teknologi Time of Flight (ToF) yang dikembangkan oleh STMicroelectronics. Sensor ini bekerja dengan memancarkan sinar laser inframerah kemudian menghitung waktu yang diperlukan cahaya untuk kembali setelah dipantulkan oleh objek. Metode ini menghasilkan pengukuran yang lebih akurat dibandingkan sensor ultrasonik karena tidak dipengaruhi oleh suhu udara maupun kebisingan lingkungan. Pada sistem deteksi galodo, sensor VL53L0X digunakan untuk memantau perubahan ketinggian permukaan air sungai secara real-time sebagai indikator potensi banjir bandang.
Hubungan antara ketinggian air dan jarak yang terbaca sensor bersifat berbanding terbalik. Ketika permukaan air naik mendekati sensor, nilai jarak yang terbaca akan semakin kecil.
Grafik Respon Sensor VL53L0X
2. Sensor Getar SW-420
Sensor SW-420 merupakan sensor getaran yang menggunakan mekanisme pegas dan kontak logam di dalam tabung sensor. Ketika terjadi getaran atau guncangan, kontak internal akan berubah posisi sehingga menghasilkan sinyal digital yang dapat dibaca oleh mikrokontroler. Sensor ini sering digunakan untuk mendeteksi aktivitas seismik sederhana, benturan, atau getaran mekanik.
Pada sistem deteksi galodo, sensor SW-420 digunakan sebagai indikator adanya pergerakan material, longsoran kecil, atau getaran yang mungkin terjadi akibat aliran material dari hulu sungai.
Grafik Respon Sensor SW-420
3. Sensor Hujan MH-RD
Sensor hujan MH-RD bekerja berdasarkan prinsip perubahan resistansi pada jalur konduktif yang terdapat pada papan sensor. Saat permukaan sensor terkena tetesan air, hambatan listrik akan berubah sehingga menghasilkan perubahan tegangan keluaran. Semakin banyak air yang mengenai permukaan sensor, semakin besar perubahan sinyal yang dihasilkan.
Pada sistem deteksi galodo, sensor hujan digunakan sebagai parameter pendukung karena curah hujan yang tinggi merupakan salah satu faktor utama penyebab banjir bandang dan aliran material.
Grafik Respon Sensor MH-RD
4. Motor Servo SG90
Motor servo SG90 merupakan aktuator elektromekanik yang dapat mengontrol posisi sudut secara presisi berdasarkan sinyal PWM yang diberikan mikrokontroler. Servo memiliki sistem umpan balik internal berupa potensiometer yang digunakan untuk mengetahui posisi poros secara aktual. Dalam sistem deteksi galodo, servo digunakan untuk menggerakkan portal peringatan atau mekanisme penghalang otomatis saat kondisi bahaya terdeteksi.
Grafik Respon Servo SG90
5. Push Button Tactile 12×12 mm
6. Motor Servo TowerPro SG90
7. LCD 16×2 dengan Modul I2C PCF8574
8. Active Buzzer 5V
9. LED 5 mm Diffused
10. FTDI FT232RL USB to TTL
11. ST-Link V2
12. Sistem Peringatan Dini Galodo
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : FINAL GALODO DETECTION SYSTEM
* STM32F103C8T6 + LCD 4-bit Parallel + Servo
*
* PIN LCD (4-bit Parallel, RW ke GND):
* RS -> PB10
* EN -> PB11
* D4 -> PB12
* D5 -> PB13
* D6 -> PB14
* D7 -> PB15
*
* SENSOR:
* Vibration -> PA0 (DIGITAL GPIO - sensor SW-420 output digital)
* Rain -> PA1 (Digital)
* Servo -> PA2 (TIM2 CH3 PWM)
* Button -> PA3 (EXTI Falling, Pull-Up)
* Proximity -> PA4 (Digital)
*
* OUTPUT:
* Buzzer -> PB0
* LED -> PB1
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <string.h>
/* USER CODE END Includes */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/*
* LCD PIN DEFINE - semua di GPIOB
*/
#define LCD_RS_PIN GPIO_PIN_10
#define LCD_EN_PIN GPIO_PIN_11
#define LCD_D4_PIN GPIO_PIN_12
#define LCD_D5_PIN GPIO_PIN_13
#define LCD_D6_PIN GPIO_PIN_14
#define LCD_D7_PIN GPIO_PIN_15
#define LCD_GPIO_PORT GPIOB
/* USER CODE END PD */
/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim2;
/* USER CODE BEGIN PV */
/*
* Semua sensor dibaca DIGITAL
* Sensor vibration SW-420 output: HIGH = getar, LOW = diam
* Rain sensor output : HIGH = hujan
* Proximity sensor output : HIGH = ada objek
*/
uint8_t vibrationDetected = 0;
uint8_t rainDetected = 0;
uint8_t proximityDetected = 0;
uint8_t galodoDetected = 0;
uint8_t emergencyMode = 0;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
/* USER CODE BEGIN PFP */
void LCD_SendNibble(uint8_t nibble);
void LCD_SendByte(uint8_t data, uint8_t isCmd);
void LCD_Init(void);
void LCD_Clear(void);
void LCD_GotoXY(uint8_t col, uint8_t row);
void LCD_PutChar(char c);
void LCD_PutStr(char *str);
void LCD_Show(char *line1, char *line2);
void Servo_SetAngle(uint8_t angle);
void Siren_Alarm(void);
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
/* ============================================================
* LCD 4-BIT PARALLEL DRIVER
* ============================================================ */
void LCD_SendNibble(uint8_t nibble)
{
HAL_GPIO_WritePin(LCD_GPIO_PORT, LCD_D4_PIN,
(nibble & 0x01) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_GPIO_PORT, LCD_D5_PIN,
(nibble & 0x02) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_GPIO_PORT, LCD_D6_PIN,
(nibble & 0x04) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_GPIO_PORT, LCD_D7_PIN,
(nibble & 0x08) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_GPIO_PORT, LCD_EN_PIN, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(LCD_GPIO_PORT, LCD_EN_PIN, GPIO_PIN_RESET);
HAL_Delay(1);
}
void LCD_SendByte(uint8_t data, uint8_t isCmd)
{
if(isCmd)
HAL_GPIO_WritePin(LCD_GPIO_PORT, LCD_RS_PIN, GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(LCD_GPIO_PORT, LCD_RS_PIN, GPIO_PIN_SET);
LCD_SendNibble(data >> 4);
LCD_SendNibble(data & 0x0F);
HAL_Delay(2);
}
void LCD_Init(void)
{
HAL_Delay(50);
HAL_GPIO_WritePin(LCD_GPIO_PORT,
LCD_RS_PIN | LCD_EN_PIN,
GPIO_PIN_RESET);
LCD_SendNibble(0x03); HAL_Delay(5);
LCD_SendNibble(0x03); HAL_Delay(1);
LCD_SendNibble(0x03); HAL_Delay(1);
LCD_SendNibble(0x02); HAL_Delay(1);
LCD_SendByte(0x28, 1);
LCD_SendByte(0x0C, 1);
LCD_SendByte(0x01, 1);
HAL_Delay(2);
LCD_SendByte(0x06, 1);
HAL_Delay(10);
}
void LCD_Clear(void)
{
LCD_SendByte(0x01, 1);
HAL_Delay(2);
}
void LCD_GotoXY(uint8_t col, uint8_t row)
{
uint8_t address;
if(row == 0)
address = 0x00 + col;
else
address = 0x40 + col;
LCD_SendByte(0x80 | address, 1);
}
void LCD_PutChar(char c)
{
LCD_SendByte((uint8_t)c, 0);
}
void LCD_PutStr(char *str)
{
while(*str)
LCD_PutChar(*str++);
}
void LCD_Show(char *line1, char *line2)
{
LCD_Clear();
LCD_GotoXY(0, 0);
LCD_PutStr(line1);
LCD_GotoXY(0, 1);
LCD_PutStr(line2);
}
/* ============================================================
* SERVO - TIM2 CH3 -> PA2
* 0 deg = 500 us
* 90 deg = 1500 us
* 180 deg = 2500 us
* ============================================================ */
void Servo_SetAngle(uint8_t angle)
{
uint16_t pulse = 500 + ((uint32_t)angle * 2000 / 180);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, pulse);
}
/* ============================================================
* SIREN - Buzzer PB0 + LED PB1
* ============================================================ */
void Siren_Alarm(void)
{
HAL_GPIO_WritePin(buzzer_GPIO_Port, buzzer_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(buzzer_GPIO_Port, buzzer_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
HAL_Delay(100);
}
/* ============================================================
* EXTI INTERRUPT - Button PA3
* emergencyMode hanya aktif saat galodo
* ============================================================ */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == button_Pin)
{
if(galodoDetected == 1)
{
emergencyMode = 1;
}
}
}
/* USER CODE END 0 */
/**
* @brief Main program
*/
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
LCD_Init();
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
Servo_SetAngle(0);
/* Startup: Buzzer + LED 3x beep */
for(int i = 0; i < 3; i++)
{
HAL_GPIO_WritePin(buzzer_GPIO_Port, buzzer_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
HAL_Delay(200);
HAL_GPIO_WritePin(buzzer_GPIO_Port, buzzer_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
HAL_Delay(200);
}
LCD_Show("SISTEM GALODO", "STM32 READY");
HAL_Delay(3000);
/* USER CODE END 2 */
while(1)
{
/* ------------------------------------------------
* BACA SEMUA SENSOR - DIGITAL GPIO
* HIGH = aktif/terdeteksi
* ------------------------------------------------ */
vibrationDetected = HAL_GPIO_ReadPin(vibration_sensor_GPIO_Port,
vibration_sensor_Pin);
rainDetected = HAL_GPIO_ReadPin(rain_sensor_GPIO_Port,
rain_sensor_Pin);
proximityDetected = HAL_GPIO_ReadPin(Proximity_GPIO_Port,
Proximity_Pin);
/* ================================================
* KONDISI EMERGENCY
* Syarat: galodoDetected == 1 AND button ditekan
* Servo -> 180 derajat
* Dicek PERTAMA agar tidak tertimpa kondisi lain
* ================================================ */
if(galodoDetected == 1 &&
emergencyMode == 1)
{
LCD_Show("JALUR PUTUS",
"PUTAR BALIK");
Servo_SetAngle(180);
HAL_GPIO_WritePin(buzzer_GPIO_Port, buzzer_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(buzzer_GPIO_Port, buzzer_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
HAL_Delay(100);
}
/* ================================================
* KONDISI GALODO
* Syarat: rain=1 AND proximity=1 AND vibration=1
* Servo -> 90 derajat + siren
* ================================================ */
else if(rainDetected == 1 &&
proximityDetected == 1 &&
vibrationDetected == 1)
{
galodoDetected = 1;
emergencyMode = 0;
LCD_Show("GALODO !!!",
"IKUTI PANAH");
Servo_SetAngle(90);
Siren_Alarm();
}
/* ================================================
* KONDISI HUJAN
* Syarat: hanya rain aktif
* ================================================ */
else if(rainDetected == 1 &&
proximityDetected == 0 &&
vibrationDetected == 0)
{
LCD_Show("HATI HATI",
"HUJAN DERAS");
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_GPIO_WritePin(buzzer_GPIO_Port, buzzer_Pin, GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(buzzer_GPIO_Port, buzzer_Pin, GPIO_PIN_RESET);
HAL_Delay(300);
}
/* ================================================
* KONDISI AMAN
* Semua sensor tidak aktif
* Reset semua flag, servo -> 0 derajat
* ================================================ */
else
{
galodoDetected = 0;
emergencyMode = 0;
Servo_SetAngle(0);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(buzzer_GPIO_Port, buzzer_Pin, GPIO_PIN_RESET);
LCD_Show("JALUR AMAN",
"SEMUA NORMAL");
HAL_Delay(500);
}
HAL_Delay(100);
}
}
/* ============================================================
* SYSTEM CLOCK CONFIG - HSI 8MHz tanpa PLL
* ============================================================ */
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_HSICALIBRATION_DEFAULT;
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();
}
/* ============================================================
* TIM2 INIT - CH3 -> PA2 (Servo PWM)
* HSI 8MHz -> Prescaler 7 -> 1MHz -> Period 19999 -> 20ms
* ============================================================ */
static void MX_TIM2_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 7;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 19999;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
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 = 1500;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if(HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
Error_Handler();
HAL_TIM_MspPostInit(&htim2);
}
/* ============================================================
* GPIO INIT
*
* GPIOA:
* PA0 -> vibration_sensor_Pin - Input Digital
* PA1 -> rain_sensor_Pin - Input Digital
* PA2 -> Servo TIM2_CH3 - via MspPostInit
* PA3 -> button_Pin - EXTI Falling, Pull-Up
* PA4 -> Proximity_Pin - Input Digital
*
* GPIOB:
* PB0 -> buzzer_Pin - Output
* PB1 -> LED_Pin - Output
* PB10 -> LCD RS - Output
* PB11 -> LCD EN - Output
* PB12 -> LCD D4 - Output
* PB13 -> LCD D5 - Output
* PB14 -> LCD D6 - Output
* PB15 -> LCD D7 - Output
* ============================================================ */
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/* Reset semua output GPIOB ke LOW */
HAL_GPIO_WritePin(GPIOB,
buzzer_Pin | LED_Pin |
LCD_RS_PIN | LCD_EN_PIN |
LCD_D4_PIN | LCD_D5_PIN |
LCD_D6_PIN | LCD_D7_PIN,
GPIO_PIN_RESET);
/* --- VIBRATION PA0 - Input Digital --- */
GPIO_InitStruct.Pin = vibration_sensor_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(vibration_sensor_GPIO_Port, &GPIO_InitStruct);
/* --- RAIN PA1 - Input Digital --- */
GPIO_InitStruct.Pin = rain_sensor_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(rain_sensor_GPIO_Port, &GPIO_InitStruct);
/* --- PROXIMITY PA4 - Input Digital --- */
GPIO_InitStruct.Pin = Proximity_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(Proximity_GPIO_Port, &GPIO_InitStruct);
/* --- BUTTON PA3 - EXTI Falling, Pull-Up --- */
GPIO_InitStruct.Pin = button_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(button_GPIO_Port, &GPIO_InitStruct);
/* --- BUZZER PB0 + LED PB1 - Output --- */
GPIO_InitStruct.Pin = buzzer_Pin | LED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* --- LCD PB10-PB15 - Output --- */
GPIO_InitStruct.Pin = LCD_RS_PIN | LCD_EN_PIN |
LCD_D4_PIN | LCD_D5_PIN |
LCD_D6_PIN | LCD_D7_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LCD_GPIO_PORT, &GPIO_InitStruct);
/* --- EXTI3 NVIC untuk button PA3 --- */
HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
}
void Error_Handler(void)
{
__disable_irq();
while(1) {}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line) {}
#endif
Komentar
Posting Komentar