Laporan Akhir



MODUL 4

Rancang Bangun Prototype Sistem Peringan Dini Longsor Berbasi STM32 Sebagai Media Edukasi Kebencanaan di Kawasan Batu Busuk, Padang


1. Tujuan Rancangan [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.


2. Alat dan Bahan [kembali]

  • Hardware 

        a) Mikrokontroler STM32F103C8T6




         b) Vibration Sensor



         c) Rain Sensor


         d) Tilt Sensor

        e) LCD 16 X 2

       f) Buzzer

        g) LED Merah, Kuning dan Hijau


        h) Breadboard 

         i) Jamper
      j) Resistor


    k) Adaptor


        

3. Landasan Teori dan Grafik Respon Sensor [kembali]

    3.1 Tanah Longsor dan Sistem Peringatan Dini

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. 

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

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

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

   

3.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"

   

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

3.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"


4. 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 */


5. Rangkaian Simulasi [kembali]



6. Rangkaian Prototype [kembali]

7. Video Penjelasan Prinsip Kerja [kembali]


8. Kesimpulan dan Saran [kembali]

   8.1  Kesimpulan

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.


7. Download File [kembali]



Komentar

Postingan populer dari blog ini