MODUL 4
Rancang Bangun Prototype Sistem Peringan Dini Longsor Berbasi STM32 Sebagai Media Edukasi Kebencanaan di Kawasan Batu Busuk, Padang
1. Pendahuluan [kembali]
Tanah longsor merupakan salah satu bencana alam yang sering terjadi di Indonesia, terutama pada daerah dengan topografi perbukitan dan curah hujan yang tinggi. Bencana ini dapat mengakibatkan kerusakan infrastruktur, kerugian ekonomi, hingga korban jiwa. Salah satu wilayah yang memiliki potensi terjadinya tanah longsor adalah kawasan Batu Busuk, Kota Padang, yang memiliki kontur tanah berbukit serta sering mengalami hujan dengan intensitas tinggi.
Salah satu faktor utama penyebab tanah longsor adalah meningkatnya kadar air dalam tanah akibat hujan, perubahan kemiringan lereng, dan getaran yang dapat menyebabkan ketidakstabilan struktur tanah. Oleh karena itu, diperlukan suatu sistem yang mampu memberikan informasi dan peringatan dini sebelum terjadinya longsor sehingga masyarakat dapat melakukan tindakan pencegahan dan evakuasi lebih awal.
Perkembangan teknologi mikrokontroler memungkinkan pengembangan sistem peringatan dini yang sederhana, murah, dan mudah diterapkan. Dalam proyek ini digunakan mikrokontroler STM32F103C8T6 sebagai pusat pengolahan data yang terintegrasi dengan sensor getaran (SW-420), sensor hujan (FC-37), dan sensor kemiringan (Tilt Sensor). Data dari ketiga sensor tersebut diproses untuk menentukan tingkat kondisi bahaya yang kemudian ditampilkan melalui LCD serta diberikan peringatan menggunakan LED dan buzzer.
Selain berfungsi sebagai simulasi sistem peringatan dini, prototipe ini juga dirancang sebagai media edukasi kebencanaan. Melalui prototipe ini, pengguna dapat memahami bagaimana parameter lingkungan seperti getaran, hujan, dan kemiringan lereng dapat digunakan untuk mendeteksi potensi longsor secara dini. Dengan demikian, proyek ini diharapkan dapat meningkatkan pemahaman masyarakat mengenai pentingnya teknologi dalam mitigasi bencana tanah longsor.
2. Tujuan [kembali]
Tujuan dari pembuatan prototipe ini adalah:
1. Merancang dan membangun prototipe sistem peringatan
dini bencana tanah longsor yang mampu mendeteksi parameter getaran tanah, curah
hujan, dan perubahan kemiringan lereng secara real-time.
2. Mengimplementasikan mikrokontroler STM32F103C8T6
menggunakan STM32CubeIDE sebagai unit pemroses utama yang mengintegrasikan
berbagai sensor dan aktuator pada sistem peringatan dini.
3. Menghasilkan output peringatan berupa sinyal visual
(LED tiga warna) dan sinyal audio (buzzer) serta informasi pada display LCD
16x2 sebagai antarmuka pengguna.
4. Menyediakan media edukasi kebencanaan yang interaktif
bagi masyarakat dan pelajar di kawasan Batu Busuk, Padang mengenai deteksi dini
bencana longsor.
5.Mengembangkan sistem klasifikasi tingkat bahaya longsor
ke dalam tiga level: AMAN, WASPADA, dan BAHAYA berdasarkan pembacaan sensor
secara simultan.
3. Alat dan Komponen [kembali]
Hardware
a) Mikrokontroler STM32F103C8T6
4. Landasan Teori [kembali]
Tanah longsor (landslide) adalah gerakan massa tanah, batuan, atau kombinasi keduanya yang bergerak turun secara gravitasional. Faktor pemicu utama tanah longsor meliputi: curah hujan intensitas tinggi, getaran akibat gempa, kemiringan lereng yang kritis, dan saturasi air tanah yang berlebihan. Di Indonesia, tanah longsor termasuk dalam bencana hidrometeorologi yang paling sering terjadi, terutama di wilayah dengan topografi berbukit seperti Sumatera Barat.
Sistem Peringatan Dini (Early Warning System / EWS) adalah serangkaian prosedur dan mekanisme teknis yang dirancang untuk mendeteksi tanda-tanda awal bencana dan menyebarkan peringatan kepada masyarakat sebelum bencana terjadi. Komponen utama EWS meliputi: (1) sensor/instrumen monitoring, (2) unit pemrosesan data, (3) sistem komunikasi, dan (4) protokol respons masyarakat.
4.2 Mikrokontroler STM32F103C8T6
STM32F103C8T6 (Blue Pill) adalah mikrokontroler berbasis arsitektur ARM Cortex-M3 32-bit yang diproduksi oleh STMicroelectronics. Spesifikasi utamanya adalah:
• Kecepatan clock maksimum: 72 MHz
• Memori Flash: 64 KB untuk penyimpanan program
• Memori SRAM: 20 KB untuk data runtime
• Jumlah pin GPIO: 37 pin yang dapat dikonfigurasi
• ADC 12-bit: 10 channel untuk pembacaan sensor analog
• Komunikasi: UART, SPI, I2C, USB, CAN
• Tegangan operasi: 2.0V - 3.6V
• Package: LQFP48
STM32CubeIDE merupakan Integrated Development Environment (IDE) resmi dari STMicroelectronics yang mengintegrasikan STM32CubeMX untuk konfigurasi hardware dan Eclipse IDE untuk pengembangan kode. Pemrograman dilakukan menggunakan bahasa C dengan dukungan HAL (Hardware Abstraction Layer) library.
4.3 Sensor Vibration (SW-420)
Sensor SW-420 merupakan modul sensor getaran yang memanfaatkan komponen pegas logam (spring) yang terhubung ke elektroda. Ketika terjadi getaran atau guncangan, pegas bergerak dan menyentuh elektroda kontak, menghasilkan sinyal listrik. Modul ini dilengkapi komparator LM393 dan potensiometer untuk mengatur threshold sensitivitas. Output yang dihasilkan adalah sinyal digital: HIGH (logika 1) saat getaran terdeteksi di atas threshold, dan LOW (logika 0) saat tidak ada getaran.
Pada sistem ini, sensor getaran dihubungkan ke pin PA0 STM32 yang dikonfigurasi sebagai input digital dengan pull-down resistor internal. Kondisi HIGH pada PA0 memiliki PRIORITAS TERTINGGI (Prioritas 1) dalam logika sistem, langsung memicu status BAHAYA dengan mengaktifkan LED merah, buzzer, dan menampilkan pesan "BAHAYA! / Getaran Kuat" pada LCD.
Tabel 3.1 Karakteristik Respon Sensor Getaran SW-420
Kondisi Tanah
Intensitas Getaran
Output Digital
Respon Sistem
Diam / Tenang
Tidak ada (0 mm/s)
LOW (0)
Normal — LED Hijau
Getaran Ringan
< Threshold SW-420
LOW (0)
Normal — tidak ada respons
Getaran Sedang
Mendekati threshold
LOW (0)
Normal — belum terpicu
Getaran Kuat
> Threshold (diset)
HIGH (1)
BAHAYA — LED Merah + Buzzer ON
Getaran Ekstrem
Jauh di atas threshold
HIGH (1)
BAHAYA — Prioritas 1 aktif
Grafik perbandingan frekuensi dengan sensitivitas sensor getaran :
4.4 Sensor Hujan (Rain Sensor FC-37)
Sensor hujan FC-37 bekerja berdasarkan prinsip perubahan konduktivitas listrik pada permukaan pelat bergalur (PCB sensing pad) saat terkena air hujan. Semakin banyak air yang menempel pada pelat, semakin rendah nilai resistansinya dan semakin tinggi arus yang mengalir. Modul ini menghasilkan dua jenis output: output analog (tegangan 0–3,3 V, berbanding terbalik dengan intensitas hujan) dan output digital (HIGH saat hujan melampaui threshold yang diset melalui potensiometer).
Dalam sistem ini digunakan output digital yang dihubungkan ke pin PA1 STM32. Kondisi HIGH pada PA1 memiliki PRIORITAS KEDUA dalam logika sistem, memicu status BAHAYA dengan pesan "BAHAYA! / Hujan Deras" pada LCD beserta aktivasi LED merah dan buzzer.
Tabel 3.2 Karakteristik Respon Sensor Hujan FC-37
Kondisi Hujan
Tegangan Analog
Output Digital
Respon Sistem
Tidak hujan (kering)
~3,3 V
LOW (0)
Normal — sistem lanjut ke sensor kemiringan
Gerimis ringan
~2,5–3,0 V
LOW (0)
Normal — di bawah threshold
Hujan sedang
~1,2–2,5 V
LOW/HIGH
Tergantung setting threshold
Hujan deras
< 0,8 V (threshold)
HIGH (1)
BAHAYA — LED Merah + Buzzer ON + LCD
Grafik respon rain sensor:
4.5 Sensor Kemiringan (Tilt Sensor SW-200D)
Kemiringan lereng pada prototipe ini direpresentasikan menggunakan potensiometer 10 kΩ (atau tilt sensor analog) yang menghasilkan tegangan analog proporsional terhadap sudut kemiringan. Tegangan ini dibaca oleh ADC 12-bit pada channel 2 (pin PA2) STM32, menghasilkan nilai digital antara 0 hingga 4095. Nilai ADC kemudian dikonversi menjadi sudut kemiringan dalam satuan derajat menggunakan formula yang telah disebutkan sebelumnya.
Sistem mendefinisikan tiga zona kemiringan dengan respon berbeda:
Tabel 3.3 Zona Kemiringan dan Respon Sistem
Zona
Rentang Sudut
Nilai ADC
Status
Respon Output
Normal
0° – 10°
0 – 455
AMAN
LED Hijau ON, Buzzer OFF, LCD: "Normal"
Waspada
10° – 30°
456 – 1365
SIAGA
LED Kuning ON, Buzzer intermiten, LCD: "Waspada"
Bahaya
> 30°
> 1365
KRITIS
LED Merah ON, Buzzer ON, LCD: "BAHAYA! / LONGSOR"
4.6 LCD 16x2 dengan Interface I2C (PCF8574)
LCD (Liquid Crystal Display) 16x2 mampu menampilkan 16 karakter dalam 2 baris teks. Module I2C PCF8574 yang terintegrasi memungkinkan komunikasi hanya menggunakan 2 pin (SDA dan SCL), menghemat penggunaan GPIO STM32. Alamat I2C default adalah 0x27 atau 0x3F tergantung posisi jumper. Pada sistem ini, LCD digunakan untuk menampilkan nilai sensor secara real-time dan status level peringatan.
4.7 Sistem Prioritas dan Logika Deteksi
Sistem menggunakan logika if-else bertingkat (cascaded if-else) untuk memproses pembacaan sensor sesuai urutan prioritas bahaya. Jika beberapa sensor aktif secara bersamaan, sistem akan menampilkan status berdasarkan sensor dengan prioritas tertinggi.
Tabel 3.4 Tabel Kebenaran Sistem Monitoring Lengkap
Getaran
Hujan
Sudut Tilt
LED
Buzzer
Prioritas
Tampilan LCD
HIGH
ANY
ANY
Merah
ON
P1
"BAHAYA! / Getaran Kuat"
LOW
HIGH
ANY
Merah
ON
P2
"BAHAYA! / Hujan Deras"
LOW
LOW
> 30°
Merah
ON
P3
"BAHAYA! / LONGSOR"
LOW
LOW
10°–30°
Kuning
Intermiten
P3
"Kemiringan / Waspada"
LOW
LOW
0°–10°
Hijau
OFF
P3
"Kemiringan / Normal"
ANY
ANY
ANY
Merah
ON
INTERRUPT
"EMERGENCY / WARNING"
5. Flowchart dan Listing Program [kembali]
- Flowchart
- Listing Program
a. main.c
/* USER CODE BEGIN Header */
#include <string.h>
#include <stdio.h>
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @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 */
/* 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;
/* USER CODE BEGIN PV */
volatile uint8_t emergencyFlag = 0;
uint32_t adcValue;
float sudut;
uint32_t buzzerTick = 0;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void LCD_EnablePulse(void)
{
HAL_GPIO_WritePin(LCD_EN_GPIO_Port, LCD_EN_Pin, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(LCD_EN_GPIO_Port, LCD_EN_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
}
void LCD_Send4Bit(uint8_t data)
{
HAL_GPIO_WritePin(LCD_D4_GPIO_Port, LCD_D4_Pin, (data & 0x01));
HAL_GPIO_WritePin(LCD_D5_GPIO_Port, LCD_D5_Pin, (data & 0x02));
HAL_GPIO_WritePin(LCD_D6_GPIO_Port, LCD_D6_Pin, (data & 0x04));
HAL_GPIO_WritePin(LCD_D7_GPIO_Port, LCD_D7_Pin, (data & 0x08));
LCD_EnablePulse();
}
void LCD_Send_Command(uint8_t cmd)
{
HAL_GPIO_WritePin(LCD_RS_GPIO_Port, LCD_RS_Pin, GPIO_PIN_RESET);
LCD_Send4Bit(cmd >> 4);
LCD_Send4Bit(cmd & 0x0F);
HAL_Delay(2);
}
void LCD_Send_Data(uint8_t data)
{
HAL_GPIO_WritePin(LCD_RS_GPIO_Port, LCD_RS_Pin, GPIO_PIN_SET);
LCD_Send4Bit(data >> 4);
LCD_Send4Bit(data & 0x0F);
HAL_Delay(1);
}
void LCD_Clear(void)
{
LCD_Send_Command(0x01);
HAL_Delay(2);
}
void LCD_Set_Cursor(uint8_t row, uint8_t col)
{
uint8_t addr;
if(row == 0)
addr = 0x80 + col;
else
addr = 0xC0 + col;
LCD_Send_Command(addr);
}
void LCD_Print(char *str)
{
while(*str)
{
LCD_Send_Data(*str++);
}
}
void LCD_Init(void)
{
HAL_Delay(50);
HAL_GPIO_WritePin(LCD_RS_GPIO_Port, LCD_RS_Pin, GPIO_PIN_RESET);
LCD_Send4Bit(0x03);
HAL_Delay(5);
LCD_Send4Bit(0x03);
HAL_Delay(5);
LCD_Send4Bit(0x03);
HAL_Delay(5);
LCD_Send4Bit(0x02);
LCD_Send_Command(0x28);
LCD_Send_Command(0x0C);
LCD_Send_Command(0x06);
LCD_Send_Command(0x01);
HAL_Delay(5);
}
uint32_t Read_ADC(void)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,100);
return HAL_ADC_GetValue(&hadc1);
}
void LED_OFF_ALL(void)
{
HAL_GPIO_WritePin(LED_RED_GPIO_Port,LED_RED_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_YELLOW_GPIO_Port,LED_YELLOW_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_RESET);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == PUSH_BUTTON_Pin)
{
emergencyFlag = 1;
}
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
/* USER CODE BEGIN 2 */
LCD_Init();
LCD_Clear();
LCD_Set_Cursor(0, 0);
LCD_Print("Sistem Ready");
HAL_Delay(1000);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// PRIORITAS TERTINGGI: EMERGENCY BUTTON
if(emergencyFlag == 1)
{
LED_OFF_ALL();
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
LCD_Clear();
LCD_Set_Cursor(0, 0);
LCD_Print("EMERGENCY");
LCD_Set_Cursor(1, 0);
LCD_Print("WARNING");
HAL_Delay(200);
continue;
}
// PRIORITAS 1 : GETARAN (PA0)
if(HAL_GPIO_ReadPin(VIBRATION_SENSOR_GPIO_Port, VIBRATION_SENSOR_Pin) == GPIO_PIN_SET)
{
LED_OFF_ALL();
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
LCD_Clear();
LCD_Set_Cursor(0, 0);
LCD_Print("BAHAYA!");
LCD_Set_Cursor(1, 0);
LCD_Print("Getaran Kuat");
HAL_Delay(200);
continue;
}
// PRIORITAS 2 : HUJAN (PA1)
if(HAL_GPIO_ReadPin(RAIN_SENSOR_GPIO_Port, RAIN_SENSOR_Pin) == GPIO_PIN_SET)
{
LED_OFF_ALL();
HAL_GPIO_WritePin(LED_YELLOW_GPIO_Port, LED_YELLOW_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
LCD_Clear();
LCD_Set_Cursor(0, 0);
LCD_Print("BAHAYA!");
LCD_Set_Cursor(1, 0);
LCD_Print("Hujan Deras");
HAL_Delay(200);
continue;
}
// PRIORITAS 3 : TILT SENSOR (PA2) via ADC
adcValue = Read_ADC();
sudut = ((float)adcValue * 45.0f) / 4095.0f;
// NORMAL: 0° - 10°
if(sudut <= 10)
{
LED_OFF_ALL();
HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);
LCD_Clear();
LCD_Set_Cursor(0, 0);
LCD_Print("Kemiringan Normal");
LCD_Set_Cursor(1, 0);
LCD_Print("Aman");
}
// WASPADA: 10° - 30°
else if(sudut <= 30)
{
LED_OFF_ALL();
HAL_GPIO_WritePin(LED_YELLOW_GPIO_Port, LED_YELLOW_Pin, GPIO_PIN_SET);
// Buzzer intermiten (kedip 500ms)
if(HAL_GetTick() - buzzerTick > 500)
{
HAL_GPIO_TogglePin(BUZZER_GPIO_Port, BUZZER_Pin);
buzzerTick = HAL_GetTick();
}
LCD_Clear();
LCD_Set_Cursor(0, 0);
LCD_Print("Kemiringan");
LCD_Set_Cursor(1, 0);
LCD_Print("Waspada");
}
// LONGSOR: > 30°
else
{
LED_OFF_ALL();
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
LCD_Clear();
LCD_Set_Cursor(0, 0);
LCD_Print("BAHAYA!");
LCD_Set_Cursor(1, 0);
LCD_Print("LONGSOR");
}
HAL_Delay(100);
}
/* 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};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
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();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
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
* @param None
* @retval None
*/
static void MX_ADC1_Init(void)
{
/* USER CODE BEGIN ADC1_Init 0 */
/* USER CODE END ADC1_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC1_Init 1 */
/* USER CODE END ADC1_Init 1 */
/** Common config
*/
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_2;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 */
/* USER CODE END ADC1_Init 2 */
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, LED_RED_Pin|LED_YELLOW_Pin|LED_GREEN_Pin|BUZZER_Pin
|LCD_RS_Pin|LCD_EN_Pin|LCD_D4_Pin|LCD_D5_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, LCD_D6_Pin|LCD_D7_Pin, GPIO_PIN_RESET);
/*Configure GPIO pins : VIBRATION_SENSOR_Pin RAIN_SENSOR_Pin */
GPIO_InitStruct.Pin = VIBRATION_SENSOR_Pin|RAIN_SENSOR_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PUSH_BUTTON_Pin */
GPIO_InitStruct.Pin = PUSH_BUTTON_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(PUSH_BUTTON_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : LED_RED_Pin LED_YELLOW_Pin LED_GREEN_Pin BUZZER_Pin
LCD_RS_Pin LCD_EN_Pin LCD_D4_Pin LCD_D5_Pin */
GPIO_InitStruct.Pin = LED_RED_Pin|LED_YELLOW_Pin|LED_GREEN_Pin|BUZZER_Pin
|LCD_RS_Pin|LCD_EN_Pin|LCD_D4_Pin|LCD_D5_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);
/*Configure GPIO pins : LCD_D6_Pin LCD_D7_Pin */
GPIO_InitStruct.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(GPIOA, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
// Jika terjadi error, matikan semua LED dan buzzer
LED_OFF_ALL();
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);
// Tampilkan pesan error di LCD
LCD_Clear();
LCD_Set_Cursor(0, 0);
LCD_Print("SISTEM ERROR!");
LCD_Set_Cursor(1, 0);
LCD_Print("Restart Sistem");
HAL_Delay(1000);
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
b. main.h
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.h
* @brief : Header for main.c file.
* This file contains the common defines of the application.
******************************************************************************
* @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 */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
#define __MAIN_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx_hal.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */
/* USER CODE END ET */
/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */
/* USER CODE END EC */
/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */
/* USER CODE END EM */
/* Exported functions prototypes ---------------------------------------------*/
void Error_Handler(void);
/* USER CODE BEGIN EFP */
/* USER CODE END EFP */
/* Private defines -----------------------------------------------------------*/
#define VIBRATION_SENSOR_Pin GPIO_PIN_0
#define VIBRATION_SENSOR_GPIO_Port GPIOA
#define RAIN_SENSOR_Pin GPIO_PIN_1
#define RAIN_SENSOR_GPIO_Port GPIOA
#define TILT_SENSOR_Pin GPIO_PIN_2
#define TILT_SENSOR_GPIO_Port GPIOA
#define PUSH_BUTTON_Pin GPIO_PIN_3
#define PUSH_BUTTON_GPIO_Port GPIOA
#define PUSH_BUTTON_EXTI_IRQn EXTI3_IRQn
#define LED_RED_Pin GPIO_PIN_0
#define LED_RED_GPIO_Port GPIOB
#define LED_YELLOW_Pin GPIO_PIN_1
#define LED_YELLOW_GPIO_Port GPIOB
#define LED_GREEN_Pin GPIO_PIN_10
#define LED_GREEN_GPIO_Port GPIOB
#define BUZZER_Pin GPIO_PIN_11
#define BUZZER_GPIO_Port GPIOB
#define LCD_RS_Pin GPIO_PIN_12
#define LCD_RS_GPIO_Port GPIOB
#define LCD_EN_Pin GPIO_PIN_13
#define LCD_EN_GPIO_Port GPIOB
#define LCD_D4_Pin GPIO_PIN_14
#define LCD_D4_GPIO_Port GPIOB
#define LCD_D5_Pin GPIO_PIN_15
#define LCD_D5_GPIO_Port GPIOB
#define LCD_D6_Pin GPIO_PIN_8
#define LCD_D6_GPIO_Port GPIOA
#define LCD_D7_Pin GPIO_PIN_9
#define LCD_D7_GPIO_Port GPIOA
/* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */
#ifdef __cplusplus
}
#endif
#endif /* __MAIN_H */
Prinsip kerja rangkaian prototipe sistem peringatan dini longsor berbasis STM32 ini dimulai dengan mikrokontroler STM32 yang secara terus-menerus melakukan pembacaan data dari tiga sensor, yaitu sensor getaran (vibration sensor), sensor hujan (rain sensor), dan sensor kemiringan lereng (tilt sensor yang disimulasikan menggunakan potensiometer). Sistem menerapkan metode prioritas dalam proses deteksinya, di mana sensor getaran memiliki prioritas tertinggi, diikuti sensor hujan, dan terakhir sensor kemiringan. Ketika sensor getaran yang terhubung pada pin PA0 mendeteksi getaran kuat, STM32 langsung mengidentifikasinya sebagai kondisi bahaya, kemudian mengaktifkan LED merah pada pin PB0 dan buzzer pada pin PB11 sebagai alarm peringatan. Selain itu, LCD 16×2 akan menampilkan pesan "BAHAYA!" dan "Getaran Kuat" untuk memberikan informasi kepada pengguna mengenai kondisi yang terjadi.Apabila sensor getaran tidak mendeteksi adanya getaran berbahaya, sistem akan melanjutkan pembacaan sensor hujan yang terhubung pada pin PA1. Ketika sensor hujan mendeteksi curah hujan tinggi atau permukaan sensor terkena air sehingga menghasilkan logika HIGH, STM32 menganggap kondisi tersebut berpotensi memicu longsor. Dalam kondisi ini LED merah dan buzzer akan diaktifkan, sedangkan LCD menampilkan pesan "BAHAYA!" dan "Hujan Deras". Dengan demikian, sistem dapat memberikan peringatan dini ketika terjadi faktor lingkungan yang berpotensi menyebabkan ketidakstabilan lereng.Jika sensor getaran dan sensor hujan berada dalam kondisi tidak aktif, maka sistem akan membaca nilai kemiringan lereng melalui sensor tilt pada pin PA2 menggunakan fasilitas Analog-to-Digital Converter (ADC) STM32. Nilai ADC yang diperoleh kemudian dikonversi menjadi nilai sudut kemiringan. Berdasarkan hasil konversi tersebut, sistem mengelompokkan kondisi lereng ke dalam tiga kategori, yaitu normal pada rentang 0°–10°, waspada pada rentang 10°–30°, dan bahaya longsor untuk kemiringan lebih dari 30°. Pada kondisi normal, LED hijau menyala dan buzzer tidak aktif. Pada kondisi waspada, LED kuning menyala serta buzzer berbunyi secara intermiten sebagai tanda peringatan awal. Sementara itu, jika kemiringan melebihi 30°, sistem mengaktifkan LED merah dan buzzer serta menampilkan pesan "BAHAYA!" dan "LONGSOR" pada LCD sebagai indikasi kondisi kritis.Selain fungsi pemantauan otomatis, sistem juga dilengkapi dengan tombol darurat (Emergency Button) yang terhubung pada pin PA3 dan memanfaatkan fitur interrupt eksternal (EXTI3). Ketika tombol ditekan, STM32 segera menghentikan proses pemantauan normal dan langsung menjalankan prosedur darurat dengan mengaktifkan LED merah, buzzer, serta menampilkan pesan "EMERGENCY" dan "WARNING" pada LCD. Penggunaan interrupt memungkinkan respons sistem terjadi secara cepat tanpa harus menunggu siklus pembacaan sensor berikutnya. Seluruh proses pembacaan sensor, pengolahan data, dan pengendalian indikator dilakukan secara berulang (real-time monitoring) sehingga kondisi lingkungan dapat dipantau secara terus-menerus dan informasi peringatan dapat diberikan sesegera mungkin ketika terdeteksi potensi longsor.
Berdasarkan perancangan, pembuatan, dan pengujian prototipe Sistem Peringatan Dini Longsor Berbasis STM32 di kawasan Batu Busuk, Padang, dapat disimpulkan hal-hal sebagai berikut:
1. Prototipe sistem peringatan dini longsor berbasis STM32F103C8T6 berhasil dirancang dan diimplementasikan dengan mengintegrasikan tiga sensor (getaran, hujan, dan kemiringan) secara real-time dalam satu sistem monitoring terpadu menggunakan STM32CubeIDE.
2. Sistem berhasil mengimplementasikan logika prioritas deteksi bertingkat: sensor getaran (P1) → sensor hujan (P2) → sensor kemiringan ADC (P3), sehingga kondisi paling kritis selalu diproses terlebih dahulu dan ditampilkan dengan benar pada output.
3. LCD 16×2 berhasil menampilkan status kondisi secara real-time dalam tiga kategori - Normal, Waspada, dan Bahaya - beserta sumber pemicunya, memberikan informasi yang jelas bagi pengguna.
4. Mekanisme interrupt perangkat keras EXTI3 pada tombol darurat (PA3) bekerja dengan baik: mampu menginterupsi main loop kapan saja dan segera mengaktifkan peringatan maksimal tanpa menunggu siklus polling sensor.
5. Prototipe ini terbukti layak sebagai media edukasi kebencanaan yang interaktif untuk meningkatkan pemahaman dan kesadaran masyarakat kawasan Batu Busuk, Padang, tentang risiko longsor serta teknologi sistem peringatan dini berbasis mikrokontroler.
8.2 Saran
Untuk pengembangan lebih lanjut dari sistem ini, disarankan beberapa hal berikut:
1. Menambahkan penyimpanan data historis menggunakan modul SD Card dan Real-Time Clock (RTC DS3231) untuk merekam data log sensor dengan cap waktu, memungkinkan analisis pola kejadian dan prediksi risiko longsor.
2. Menerapkan catu daya cadangan menggunakan baterai
lithium ion dan panel surya kecil agar sistem tetap berfungsi saat terjadi
pemadaman listrik, mengingat bencana longsor sering disertai gangguan jaringan
listrik.
9. Download File [kembali]
- Download File Rangkaian (klik disini)
- Download Video Demo (klik disini)
- Datasheet Mikrokontroler STM32 NUCLEO (klik disini)
- Download Datasheet Resistor (klik disini)
- Download Datasheet LED (klik disini)
- Datasheet Sensor Vibration (klik disini)
- Datasheet Sensor Rain (klik disini)
- Datasheet LED (klik disini)
- Datasheet Buzzer (klik disini)
- Datasheet resistor (klik disini)

.jpg)
.jpg)
.png)
Tidak ada komentar:
Posting Komentar