M4 UP UC



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




         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) ST Link

      

4. Landasan Teori [kembali]

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

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


6. Rangkaian Simulasi dan Prinsip Kerja [kembali]

  • Rangkaian Simulasi

  • Prinsip Kerja
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.

7. Video Simulasi [kembali]

  • Video Demo

  • Video Simulasi


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.


9. Download File [kembali]



Tidak ada komentar:

Posting Komentar

Habiburrahman 2310952014

BAHAN UNTUK PERKULIAHAN TEKNIK ELEKTRO   OLEH :  Habiburrahman 2310952014