MODUL 4



MODUL 4

SMART LANDSLIDE WARNING SYSTEM PADA DAERAH RAWAN LONGSOR DI BATU BUSUAK UNTUK DETEKSI DINI LONGSOR PADA KONDISI CURAH HUJAN YANG TINGGI

1. Pendahuluan [kembali]

    Batu Busuak merupakan salah satu kawasan permukiman yang terletak di Kecamatan Kuranji, Kota Padang, Sumatera Barat, yang dikenal sebagai daerah dengan tingkat kerawanan tanah longsor yang sangat tinggi. Kondisi geografis kawasan ini ditandai oleh topografi berbukit dengan kemiringan lereng yang cukup curam, jenis tanah yang bersifat labil, serta curah hujan yang tinggi sepanjang tahun kombinasi faktor tersebut menjadikan Batu Busuak sebagai salah satu titik rawan bencana yang perlu mendapat perhatian serius. Kejadian longsor yang berulang di kawasan ini telah menimbulkan korban jiwa, kerusakan infrastruktur, dan kerugian materiil yang signifikan bagi masyarakat setempat. Oleh karena itu, diperlukan sebuah solusi teknologi yang mampu memantau kondisi lingkungan secara berkelanjutan dan memberikan peringatan dini sebelum bencana terjadi, guna meminimalkan dampak yang ditimbulkan.

    Perkembangan teknologi di bidang mikrokontroler dan sistem sensor membuka peluang besar dalam pengembangan sistem peringatan dini bencana tanah longsor yang efektif dan efisien. Faktor-faktor utama yang menjadi pemicu longsor, seperti intensitas curah hujan, tingkat kejenuhan air dalam tanah, dan pergerakan massa tanah, kini dapat dipantau menggunakan sensor-sensor yang terintegrasi dalam sebuah sistem tertanam. Rain sensor berperan mendeteksi curah hujan yang merupakan pemicu awal meningkatnya kandungan air di dalam tanah, soil moisture sensor mengukur tingkat kelembapan tanah secara langsung untuk memantau seberapa jauh kondisi tanah mendekati titik saturasi yang berbahaya, sedangkan vibration sensor mendeteksi pergerakan atau pergeseran massa tanah sebagai indikasi paling dini dari aktivitas pra-longsor. Kombinasi data dari ketiga sensor ini memberikan gambaran kondisi lereng yang komprehensif sehingga sistem dapat mengambil keputusan secara akurat mengenai tingkat risiko yang sedang terjadi.

    Berdasarkan latar belakang tersebut, dirancanglah sebuah sistem bernama Smart Landslide Warning System yang memanfaatkan integrasi rain sensor, soil moisture sensor, dan vibration sensor dengan mikrokontroler sebagai unit pemrosesan utama. Sistem ini dirancang untuk mengakuisisi data dari ketiga sensor, mengolahnya menggunakan algoritma klasifikasi risiko berbasis nilai ambang batas yang telah dikalibrasi sesuai kondisi lapangan di Batu Busuak, kemudian secara otomatis mengaktifkan mekanisme peringatan dini apabila parameter yang terdeteksi melampaui batas aman yang telah ditentukan. Peringatan tersebut disampaikan melalui alarm dan indikator visual. Dengan pendekatan multi-sensor yang terintegrasi ini, Smart Landslide Warning System diharapkan menjadi solusi teknologi yang andal dalam upaya pengurangan risiko bencana tanah longsor di kawasan Batu Busuak secara khususnya dan daerah rawan longsor di Indonesia pada umumnya.

2. Tujuan [kembali]

Adapun tujuan dari pembuatan Smart Landslide Warning System ini adalah:

1. Mendeteksi potensi tanah longsor melalui sensor getaran (vibration sensor), sensor hujan (rain sensor), dan sensor kelembapan tanah (soil moisture sensor).
2. Memberikan peringatan dini kepada masyarakat melalui alarm (buzzer dan lampu rotator) ketika kondisi tanah terdeteksi berada pada tingkat risiko tertentu.
3. Menampilkan status kondisi tingkat bahaya longsor menggunakan indikator visual seperti OLED dan lampu rotator sebagai informasi yang mudah dipahami pengguna.
4. Membangun sistem logika berbasis mikrokontroler yang mampu mengolah dan mengklasifikasikan data dari berbagai sensor untuk menentukan tingkat risiko longsor.
5. Meningkatkan keselamatan masyarakat dan mengurangi risiko kerugian akibat bencana longsor melalui sistem deteksi dan peringatan dini yang cepat, akurat, dan otomatis.

3. Alat dan Komponen [kembali]

1. PCB Bolong



2. STM32F103C8

3. ST-Link V2

4. Rain Sensor

5. Soil Moisture Sensor

6. Vibration Sensor


7. LCD I2C



8. Adaptor 5V



9. Buzzer 



10. Mini Rotator 


11. Kabel AWG 24

12. Power Jack Male

13. Transistor BC547

14. Resistor 1k


15. Module
16. Voltage Down Regulator


4. Dasar Teori dan Grafik Respon Sensor [kembali]

4.1 Sensor Rain

Modul sensor hujan adalah alat yang praktis untuk mendeteksi hujan. Modul ini dapat digunakan sebagai saklar saat tetesan hujan jatuh melalui papan penampung hujan, serta untuk mengukur intensitas curah hujan. Modul ini dilengkapi dengan papan penampung hujan dan papan kontrol yang terpisah untuk kenyamanan yang lebih baik, lampu LED indikator daya, serta sensitivitas yang dapat disesuaikan melalui potensiometer.

                                                        

Spesifikasi:
- Menggunakan bahan dua sisi RF-04 berkualitas tinggi.
- Ukuran: 5 cm x 4 cm dengan lapisan nikel di salah satu sisi,
- Tahan oksidasi, anti-konduktivitas, dan tahan lama;
- Sinyal keluaran komparator memiliki bentuk gelombang yang bersih dan baik, dengan kemampuan penggerak lebih dari 15 mA;
- Potensiometer untuk mengatur sensitivitas;
- Tegangan kerja 5V;
- Format keluaran: Keluaran saklar digital (0 dan 1) dan keluaran tegangan analog AO;
- Dilengkapi lubang baut untuk pemasangan yang mudah;
- Ukuran papan PCB kecil: 3,2 cm x 1,4 cm;
- Menggunakan komparator LM393 dengan rentang tegangan luas

Cara kerja:

    Rain sensor bekerja berdasarkan prinsip perubahan nilai resistansi pada permukaan papan deteksi (sensing pad) yang terbuat dari jalur-jalur konduktor tembaga. Ketika tidak ada air hujan, resistansi antara jalur-jalur konduktor tersebut sangat tinggi sehingga arus listrik tidak dapat mengalir secara signifikan. Namun, saat tetesan air hujan jatuh dan membasahi permukaan sensing pad, air bersifat sebagai konduktor yang menjembatani jalur-jalur tembaga tersebut, sehingga resistansi menurun dan arus listrik mulai mengalir. Perubahan resistansi ini dideteksi oleh modul LM393 yang kemudian mengubahnya menjadi tegangan keluaran analog maupun digital. Keluaran analog merepresentasikan intensitas hujan secara proporsional semakin deras hujan dan semakin banyak air yang menutupi permukaan sensor, semakin rendah nilai tegangan analognya. Sementara itu, keluaran digital akan memberikan logika LOW atau HIGH berdasarkan nilai ambang batas (threshold) yang telah diatur melalui potensiometer pada modul. Mikrokontroler kemudian membaca nilai keluaran ini untuk menentukan kondisi curah hujan sebagai salah satu parameter risiko longsor.

Grafik Respon Rain Sensor:


4.2 Vibration Sensor

    Modul sensor getaran yang menggunakan sensor getaran SW-420 dan LM393 ini digunakan untuk mendeteksi getaran. Nilai ambang batasnya dapat disesuaikan menggunakan potensiometer yang terpasang pada modul. Saat tidak ada getaran, sensor menghasilkan sinyal Logic Low, dan ketika getaran terdeteksi, sensor menghasilkan sinyal Logic High.

Spesifikasi:

- Tegangan Operasi: 3,3 V hingga 5 V DC
- Arus Operasi: 15 mA
- Menggunakan sensor getaran tipe SW-420 (normally closed)
- LED penunjuk output dan daya
- Desain berbasis LM393
- Mudah digunakan dengan mikrokontroler atau bahkan dengan IC digital/analog biasa
- Dilengkapi lubang baut untuk pemasangan yang mudah
- Ukuran kecil, harga terjangkau, dan mudah didapatkan

Cara kerja:
    Vibration sensor bekerja dengan mendeteksi getaran atau guncangan fisik yang terjadi pada media tempat sensor dipasang. Jenis yang umum digunakan adalah sensor berbasis pegas (spring-type) atau piezoelektrik. Pada sensor tipe pegas, di dalam komponen terdapat sebuah pegas logam dan elemen konduktif yang dalam kondisi diam tidak saling bersentuhan. Ketika terjadi getaran atau pergerakan tanah, gaya mekanis menyebabkan pegas bergetar dan sesaat menyentuh elemen konduktif tersebut, sehingga rangkaian listrik tertutup sejenak dan menghasilkan pulsa sinyal. Pada sensor piezoelektrik, getaran mekanis yang mengenai material piezoelektrik akan menghasilkan tegangan listrik secara langsung akibat efek piezoelektrik semakin besar amplitudo getaran, semakin besar tegangan yang dihasilkan. Sinyal keluaran dari sensor ini kemudian diproses oleh modul pengkondisi sinyal dan diteruskan ke mikrokontroler sebagai sinyal digital atau analog. Dalam konteks sistem peringatan longsor, sensor ini digunakan untuk mendeteksi pergerakan atau pergeseran massa tanah di lereng yang mengindikasikan adanya aktivitas pra-longsor.

Grafik respon vibration sensor:

4.3 Sensor Soil Moisture

Soil moisture sensor adalah sensor kelembaban yang dapat mendeteksi kelembaban dalam tanah. Sensor ini sangat sederhana, tetapi ideal untuk memantau taman kota, atau tingkat air pada tanaman pekarangan. Sensor ini terdiri dua probe untuk melewatkan arus melalui tanah, kemudian membaca resistansinya untuk mendapatkan nilai tingkat kelembaban. Semakin banyak air membuat tanah lebih mudah menghantarkan listrik (resistansi kecil), sedangkan tanah yang kering sangat sulit menghantarkan listrik (resistansi besar). Sensor ini sangat membantu untuk mengingatkan tingkat kelembaban pada tanaman atau memantau kelembaban tanah.

 Soil moisture sensor FC-28 memiliki spesifikasi :
- Memiliki value range ADC sebesar 1024 bit mulai dari 0 – 1023 bit.
- Tegangan Operasi: 3.3V hingga 5V DC
- Operasi Saat Ini: 15mA
- Output Digital - 0V hingga 5V, Level pemicu yang dapat disesuaikan dari preset
- Output Analog - 0V hingga 5V berdasarkan radiasi infra merah dari nyala api yang jatuh pada sensor
- LED menunjukkan keluaran dan daya
- Ukuran PCB: 3,2 cm x 1,4 cm
- Desain berbasis LM393
- Mudah digunakan dengan Mikrokontroler atau bahkan dengan IC Digital / Analog normal
- Kecil, murah, dan mudah didapat

Cara kerja:

Soil moisture sensor bekerja berdasarkan prinsip pengukuran konduktivitas listrik atau resistansi tanah yang berbanding lurus dengan kandungan air di dalamnya. Sensor ini memiliki dua probe logam yang ditancapkan langsung ke dalam tanah dan dialiri tegangan listrik. Ketika kandungan air dalam tanah rendah (tanah kering), resistansi tanah di antara kedua probe sangat tinggi sehingga arus yang mengalir sangat kecil. Sebaliknya, saat tanah dalam kondisi basah atau jenuh air, ion-ion mineral yang terlarut dalam air tanah meningkatkan konduktivitas, sehingga arus yang mengalir di antara probe menjadi lebih besar dan nilai resistansinya menurun. Perubahan arus atau resistansi ini dikonversi oleh modul sensor menjadi tegangan keluaran analog yang nilainya berbanding terbalik dengan kadar air tanah semakin basah tanah, semakin rendah tegangan keluarannya. Modul juga menyediakan keluaran digital yang aktif saat kelembaban melampaui nilai threshold tertentu. Mikrokontroler membaca data kelembaban tanah ini sebagai parameter krusial, karena tanah yang telah mencapai kondisi jenuh air (saturasi) merupakan salah satu pemicu utama terjadinya longsor di kawasan seperti Batu Busuak.

Grafik respon sensor soil moisture :

4.4 STM32F103C8

    Keluarga produk STM32F103xx dengan kepadatan menengah dan performa tinggi dilengkapi dengan inti RISC 32-bit Arm Cortex -M3 berperforma tinggi yang beroperasi pada frekuensi 72 MHz, memori tertanam berkecepatan tinggi (memori Flash hingga 128 Kbyte dan SRAM hingga 20 Kbyte), serta beragam antarmuka I/O dan periferal yang ditingkatkan yang terhubung ke dua bus APB. Semua perangkat dilengkapi dengan dua ADC 12-bit, tiga timer 16-bit serbaguna ditambah satu timer PWM, serta antarmuka komunikasi standar dan lanjutan: hingga dua I2C dan SPI, tiga USART, satu USB, dan satu CAN.
    Perangkat ini beroperasi pada tegangan suplai 2,0 hingga 3,6 V. Perangkat ini tersedia dalam rentang suhu –40 hingga +85°C dan rentang suhu diperluas –40 hingga +105 °C. Serangkaian mode hemat daya yang komprehensif memungkinkan desain aplikasi berdaya rendah.
    Keluarga mikrokontroler STM32F103xx dengan kinerja kepadatan menengah mencakup perangkat dalam enam jenis kemasan yang berbeda: dari 36 pin hingga 100 pin. Tergantung pada perangkat yang dipilih, set periferal yang berbeda disertakan; deskripsi di bawah ini memberikan gambaran umum tentang jangkauan lengkap periferal yang ditawarkan dalam keluarga ini.
    Fitur-fitur ini menjadikan keluarga mikrokontroler STM32F103xx dengan kinerja kepadatan menengah cocok untuk berbagai aplikasi seperti penggerak motor, kontrol aplikasi, peralatan medis dan genggam, periferal PC dan game, platform GPS, aplikasi industri, PLC, inverter, printer, pemindai, sistem alarm, interkom video, dan HVAC.


Fitur:

- CPU Arm 32-bit Cortex-M3 core
- Frekuensi maksimum 72 MHz, 1,25 DMIPS/MHz
- Memori Flash 64 atau 128 Kbyte
- SRAM 20 Kbyte
- Tegangan supply aplikasi 2,0 hingga 3,6 V
- Osilator kristal 4 hingga 16 MHz
- Dua konverter A/D 12-bit, 1 µs (hingga 16 saluran)
- Pengontrol DMA 7 saluran
- Memiliki port hingga 80 fast port I/O
- Komunikasi interface mencapai 9 (I2C, USART, SPI, CAN, USB)

4.5  LCD I2C

    LCD 16x2 (Liquid Crystal Display) merupakan modul penampil data yang menggunakan kristal cair sebagai media untuk menampilkan informasi berupa teks maupun karakter. LCD ini banyak digunakan dalam berbagai perangkat elektronik sehari-hari, seperti kalkulator, game portabel, televisi, sistem kontrol, dan berbagai aplikasi berbasis mikrokontroler karena kemampuannya menampilkan data secara sederhana dan efisien.


    LCD 16x2 memiliki konfigurasi tampilan yang terdiri dari 16 kolom dan 2 baris, sehingga mampu menampilkan hingga 32 karakter dalam satu layar. Modul ini telah dilengkapi dengan fitur backlight yang memudahkan pengguna membaca tampilan pada kondisi pencahayaan yang kurang. Selain itu, LCD 16x2 memiliki memori karakter yang mampu menyimpan hingga 192 karakter, sehingga dapat menampilkan berbagai simbol dan karakter khusus.

    Dalam pengoperasiannya, LCD 16x2 dapat diakses menggunakan mode komunikasi 4-bit maupun 8-bit, sehingga memberikan fleksibilitas dalam penggunaan jumlah pin mikrokontroler. Modul ini juga dilengkapi dengan character generator terprogram yang memungkinkan pengguna membuat dan menampilkan karakter khusus sesuai kebutuhan aplikasi. Dengan berbagai keunggulan tersebut, LCD 16x2 menjadi salah satu perangkat display yang paling banyak digunakan dalam sistem elektronika dan mikrokontroler.


4.6  Buzzer
Buzzer adalah komponen elektronik yang digunakan untuk menghasilkan suara atau bip. Ini adalah perangkat output yang mengubah sinyal listrik menjadi suara. Buzzer sering digunakan dalam perangkat rumah tangga, jam alarm, komputer, dan banyak perangkat elektronik lainnya sebagai cara untuk memberikan indikasi audio kepada pengguna.
Fitur utama buzzer adalah:

- Mekanisme Penghasil Suara: Buzzer umumnya bekerja dengan menggunakan elektromagnet, piezoelektrik, atau mekanisme mekanis. Buzzer piezoelektrik, misalnya, menggunakan disk piezoelektrik yang bergetar ketika tegangan listrik diterapkan, menghasilkan suara.
- Frekuensi Suara: Buzzer menghasilkan suara dengan frekuensi tertentu, yang biasanya dinyatakan dalam Hertz (Hz). Frekuensi ini menentukan nada suara yang dihasilkan.
- Volume: Intensitas suara yang dihasilkan buzzer biasanya dinyatakan dalam desibel (dB). Volume ini bisa bergantung pada tegangan yang diterapkan dan konstruksi buzzer.
- Tipe Aktuasi: Beberapa buzzer diaktifkan secara langsung oleh tegangan (buzzer aktif), sedangkan yang lain memerlukan sirkuit pembangkit sinyal eksternal untuk menghasilkan suara (buzzer pasif). 

5. Flowchart [kembali]


    Flowchart Smart Landslide Warning System dimulai dengan proses pembacaan data dari tiga sensor, yaitu sensor intensitas hujan (H), sensor kelembapan tanah (T), dan sensor getaran (G). Setelah data diperoleh, sistem akan memeriksa apakah nilai intensitas hujan kurang dari 60% dan kelembapan tanah kurang dari 55%. Jika kedua kondisi tersebut terpenuhi, maka area dinyatakan dalam kondisi AMAN. Namun, jika salah satu atau kedua parameter melebihi batas yang ditentukan, sistem akan melanjutkan proses pemeriksaan berikutnya.

    Pada tahap selanjutnya, sistem mengevaluasi apakah intensitas hujan telah mencapai atau melebihi 60% dan kelembapan tanah telah mencapai atau melebihi 55%. Jika kondisi ini terpenuhi, sistem kemudian memantau jumlah getaran yang terdeteksi dalam interval waktu 5 detik. Apabila jumlah getaran mencapai atau melebihi 10 kali, maka sistem menetapkan status BAHAYA, mengaktifkan lampu rotator dan buzzer sebagai peringatan dini bahwa potensi longsor sangat tinggi. Sebaliknya, jika intensitas hujan dan kelembapan tanah sudah berada pada tingkat tinggi tetapi jumlah getaran masih kurang dari 10 kali dalam 5 detik, maka sistem menetapkan status WASPADA sebagai indikasi bahwa kondisi lereng mulai tidak stabil dan perlu dipantau lebih lanjut. Setelah status ditentukan dan indikator yang sesuai diaktifkan, sistem kembali melakukan pembacaan sensor secara berulang (loop) untuk memastikan pemantauan kondisi lingkungan berlangsung dan berkelanjutan.

6. Listing Program [kembali]

main.c:

#include "main.h"

#include "lcd16x2.h"

#include <stdio.h>


/* ================== HANDLE ADC ================== */

ADC_HandleTypeDef hadc1;


/* ================== PROTOTYPE ================== */

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);


/* ================== PIN CONFIG ================== */

#define ALARM_PORT GPIOB

#define ALARM_PIN GPIO_PIN_1


#define LAMP_PORT GPIOB

#define LAMP_PIN GPIO_PIN_2


#define SHAKE_PORT GPIOB

#define SHAKE_PIN GPIO_PIN_0


/* ================== ADC CHANNEL ================== */

#define ADC_RAIN_CH ADC_CHANNEL_6

#define ADC_SOIL_CH ADC_CHANNEL_7


/* ================== BATAS SENSOR (DISESUAIKAN TABEL) ================== */

#define LIMIT_RAIN 60 // H >= 60%

#define LIMIT_SOIL 55 // T >= 55% (Sebelumnya 65)


/* ================== KONFIGURASI GETARAN (DISESUAIKAN TABEL) ================== */

#define SHAKE_TARGET_COUNT 10 // 10 getaran (Sebelumnya 2)

#define SHAKE_CHECK_TIME 5000 // Dalam rentang waktu 5 detik (5000 ms)

#define SHAKE_ACTIVE_TIME 5000 // Status BAHAYA ditahan 5 detik agar terbaca (Sebelumnya 1000)


/* ================== INTERVAL SISTEM ================== */

#define TIME_READ_SENSOR 50

#define TIME_REFRESH_LCD 300


/* ================== STATUS SISTEM ================== */

typedef enum

{

KONDISI_AMAN = 0,

KONDISI_WASPADA,

KONDISI_BAHAYA

} StatusSistem;


/* ================== VARIABEL SENSOR ================== */

uint32_t adcHujan = 0;

uint32_t adcTanah = 0;


int persenHujan = 0;

int persenTanah = 0;

int flagGetaran = 0;


/* ================== VARIABEL STATUS ================== */

StatusSistem kondisiSekarang = KONDISI_AMAN;


/* ================== VARIABEL GETARAN ================== */

uint8_t jumlahGetaran = 0;

uint8_t kondisiGetarSebelumnya = 0;


uint32_t waktuGetaranPertama = 0;

uint32_t waktuBahayaGetaran = 0;


/* ================== TIMER NON-BLOCKING ================== */

uint32_t timerSensor = 0;

uint32_t timerLCD = 0;



/* =========================================================

Fungsi baca ADC berdasarkan channel yang dipilih

========================================================= */

uint32_t Ambil_Data_ADC(uint32_t channel)

{

ADC_ChannelConfTypeDef configADC = {0};

uint32_t hasilADC = 0;


configADC.Channel = channel;

configADC.Rank = ADC_REGULAR_RANK_1;

configADC.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;


HAL_ADC_ConfigChannel(&hadc1, &configADC);


HAL_ADC_Start(&hadc1);

HAL_ADC_PollForConversion(&hadc1, 10);

hasilADC = HAL_ADC_GetValue(&hadc1);

HAL_ADC_Stop(&hadc1);


return hasilADC;

}


/* =========================================================

Konversi nilai ADC 12-bit menjadi persen 0-100%

========================================================= */

int Ubah_ADC_Ke_Persen(uint32_t nilaiADC)

{

int hasilPersen = (nilaiADC * 100) / 4095;


if (hasilPersen > 100) hasilPersen = 100;

else if (hasilPersen < 0) hasilPersen = 0;


return hasilPersen;

}


/* =========================================================

Deteksi getaran: Mencari 10 getaran dalam 5 detik

========================================================= */

void Proses_Getaran(void)

{

uint32_t waktuSekarang = HAL_GetTick();

uint8_t kondisiGetar = HAL_GPIO_ReadPin(SHAKE_PORT, SHAKE_PIN);


/* Deteksi rising edge (transisi dari LOW ke HIGH) */

if ((kondisiGetar == GPIO_PIN_SET) && (kondisiGetarSebelumnya == GPIO_PIN_RESET))

{

if (jumlahGetaran == 0)

{

waktuGetaranPertama = waktuSekarang;

}

jumlahGetaran++;

}


kondisiGetarSebelumnya = kondisiGetar;


/* Cek rentang waktu batas deteksi getaran */

if (jumlahGetaran > 0)

{

if ((waktuSekarang - waktuGetaranPertama) <= SHAKE_CHECK_TIME)

{

if (jumlahGetaran >= SHAKE_TARGET_COUNT)

{

flagGetaran = 1;

waktuBahayaGetaran = waktuSekarang;

jumlahGetaran = 0; // Reset counter setelah target terpenuhi

}

}

else

{

jumlahGetaran = 0; // Reset jika sudah lewat 5 detik tapi tidak mencapai target

}

}


/* Menahan flagGetaran agar sistem sempat merespon */

if (flagGetaran == 1)

{

if ((waktuSekarang - waktuBahayaGetaran) >= SHAKE_ACTIVE_TIME)

{

flagGetaran = 0;

}

}

}


/* =========================================================

Membaca seluruh sensor analog

========================================================= */

void Baca_Semua_Sensor(void)

{

adcHujan = Ambil_Data_ADC(ADC_RAIN_CH);

adcTanah = Ambil_Data_ADC(ADC_SOIL_CH);


persenHujan = Ubah_ADC_Ke_Persen(adcHujan);

persenTanah = Ubah_ADC_Ke_Persen(adcTanah);

}


/* =========================================================

Menentukan status sistem berdasarkan kondisi sensor

========================================================= */

void Tentukan_Status(void)

{

// BAHAYA: Hujan >= 60% DAN Tanah >= 55% DAN Getaran aktif

if ((flagGetaran == 1) && (persenHujan >= LIMIT_RAIN) && (persenTanah >= LIMIT_SOIL))

{

kondisiSekarang = KONDISI_BAHAYA;

}

// WASPADA: Hujan >= 60% DAN Tanah >= 55%

else if ((persenHujan >= LIMIT_RAIN) && (persenTanah >= LIMIT_SOIL) && (flagGetaran == 0))

{

kondisiSekarang = KONDISI_WASPADA;

}

// AMAN: Jika kondisi di atas tidak terpenuhi

else

{

kondisiSekarang = KONDISI_AMAN;

}

}


/* =========================================================

Mengatur buzzer dan rotator berdasarkan status terakhir

========================================================= */

void Atur_Output(void)

{

switch (kondisiSekarang)

{

case KONDISI_AMAN:

HAL_GPIO_WritePin(ALARM_PORT, ALARM_PIN, GPIO_PIN_RESET);

HAL_GPIO_WritePin(LAMP_PORT, LAMP_PIN, GPIO_PIN_RESET);

break;


case KONDISI_WASPADA:

HAL_GPIO_WritePin(LAMP_PORT, LAMP_PIN, GPIO_PIN_SET);

HAL_GPIO_WritePin(ALARM_PORT, ALARM_PIN, GPIO_PIN_RESET);

break;


case KONDISI_BAHAYA:

HAL_GPIO_WritePin(LAMP_PORT, LAMP_PIN, GPIO_PIN_SET);

HAL_GPIO_WritePin(ALARM_PORT, ALARM_PIN, GPIO_PIN_SET);

break;


default:

HAL_GPIO_WritePin(ALARM_PORT, ALARM_PIN, GPIO_PIN_RESET);

HAL_GPIO_WritePin(LAMP_PORT, LAMP_PIN, GPIO_PIN_RESET);

break;

}

}


/* =========================================================

Menampilkan data sensor dan status ke LCD

========================================================= */

void Tampil_LCD(void)

{

char barisAtas[17];

char barisBawah[17];


snprintf(barisAtas, sizeof(barisAtas), "H:%3d T:%3d G:%d", persenHujan, persenTanah, flagGetaran);


switch (kondisiSekarang)

{

case KONDISI_AMAN:

snprintf(barisBawah, sizeof(barisBawah), "KONDISI: AMAN ");

break;

case KONDISI_WASPADA:

snprintf(barisBawah, sizeof(barisBawah), "KONDISI:WASPADA ");

break;

case KONDISI_BAHAYA:

snprintf(barisBawah, sizeof(barisBawah), "KONDISI:BAHAYA ");

break;

default:

snprintf(barisBawah, sizeof(barisBawah), "KONDISI:ERROR ");

break;

}


LCD_SetCursor(0, 0);

LCD_Print(barisAtas);


LCD_SetCursor(1, 0);

LCD_Print(barisBawah);

}


/* =========================================================

PROGRAM UTAMA

========================================================= */

int main(void)

{

HAL_Init();

SystemClock_Config();


MX_GPIO_Init();

MX_ADC1_Init();


LCD_Init();

LCD_Clear();


LCD_SetCursor(0, 0);

LCD_Print("SMART LANDSLIDE");

LCD_SetCursor(1, 0);

LCD_Print(" BATU BUSUAK ");


uint32_t waktuAwal = HAL_GetTick();

uint8_t tampilanAwalSelesai = 0;


while (1)

{

uint32_t waktuSekarang = HAL_GetTick();


// Fungsi getaran dipanggil terus-menerus tanpa delay blocker agar tidak melewatkan pulsa cepat

Proses_Getaran();


if ((waktuSekarang - timerSensor) >= TIME_READ_SENSOR)

{

timerSensor = waktuSekarang;

Baca_Semua_Sensor();

Tentukan_Status();

}


Atur_Output();


if (tampilanAwalSelesai == 0)

{

if ((waktuSekarang - waktuAwal) >= 2000)

{

tampilanAwalSelesai = 1;

LCD_Clear();

}

}

else

{

if ((waktuSekarang - timerLCD) >= TIME_REFRESH_LCD)

{

timerLCD = waktuSekarang;

Tampil_LCD();

}

}

}

}


/**

* @brief System Clock Configuration

* @retval None

*/

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};


RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.HSICalibrationValue = RCC_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();

}

}



/**

* @brief ADC1 Initialization Function

* @param None

* @retval None

*/

static void MX_ADC1_Init(void)

{

ADC_ChannelConfTypeDef sConfig = {0};


hadc1.Instance = ADC1;

hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;

hadc1.Init.ContinuousConvMode = DISABLE;

hadc1.Init.DiscontinuousConvMode = DISABLE;

hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;

hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;

hadc1.Init.NbrOfConversion = 1;


if (HAL_ADC_Init(&hadc1) != HAL_OK)

{

Error_Handler();

}


sConfig.Channel = ADC_CHANNEL_6;

sConfig.Rank = ADC_REGULAR_RANK_1;

sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;


if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)

{

Error_Handler();

}

}



/**

* @brief GPIO Initialization Function

* @param None

* @retval None

*/

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};


/* GPIO Ports Clock Enable */

__HAL_RCC_GPIOD_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();


/* Kondisi awal output */

HAL_GPIO_WritePin(GPIOA,

GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 |

GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5,

GPIO_PIN_RESET);


HAL_GPIO_WritePin(GPIOB,

GPIO_PIN_1 | GPIO_PIN_2,

GPIO_PIN_RESET);


/* Konfigurasi pin PA0 - PA5 sebagai output LCD */

GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 |

GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5;


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);


/* Konfigurasi pin sensor getaran PB0 */

GPIO_InitStruct.Pin = GPIO_PIN_0;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_PULLDOWN;


HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


/* Konfigurasi buzzer PB1 dan rotator PB2 */

GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2;

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);

}



/**

* @brief This function is executed in case of error occurrence.

* @retval None

*/

void Error_Handler(void)

{

__disable_irq();


while (1)

{

}

}



#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)

{

}

#endif

lcd16x2.h:

#ifndef LCD16X2_H

#define LCD16X2_H


#include "stm32f1xx_hal.h"


void LCD_Init(void);

void LCD_Clear(void);

void LCD_SetCursor(uint8_t row, uint8_t col);

void LCD_Print(char *str);

void LCD_SendCommand(uint8_t cmd);

void LCD_SendData(uint8_t data);


#endif

lcd16x2.c:

#include "lcd16x2.h"


#define LCD_RS_PORT GPIOA

#define LCD_RS_PIN GPIO_PIN_0


#define LCD_E_PORT GPIOA

#define LCD_E_PIN GPIO_PIN_1


#define LCD_D4_PORT GPIOA

#define LCD_D4_PIN GPIO_PIN_2


#define LCD_D5_PORT GPIOA

#define LCD_D5_PIN GPIO_PIN_3


#define LCD_D6_PORT GPIOA

#define LCD_D6_PIN GPIO_PIN_4


#define LCD_D7_PORT GPIOA

#define LCD_D7_PIN GPIO_PIN_5


static void LCD_Enable(void)

{

HAL_GPIO_WritePin(LCD_E_PORT, LCD_E_PIN, GPIO_PIN_SET);

HAL_Delay(1);

HAL_GPIO_WritePin(LCD_E_PORT, LCD_E_PIN, GPIO_PIN_RESET);

HAL_Delay(1);

}


static void LCD_Send4Bit(uint8_t data)

{

HAL_GPIO_WritePin(LCD_D4_PORT, LCD_D4_PIN, (data & 0x01) ? GPIO_PIN_SET : GPIO_PIN_RESET);

HAL_GPIO_WritePin(LCD_D5_PORT, LCD_D5_PIN, (data & 0x02) ? GPIO_PIN_SET : GPIO_PIN_RESET);

HAL_GPIO_WritePin(LCD_D6_PORT, LCD_D6_PIN, (data & 0x04) ? GPIO_PIN_SET : GPIO_PIN_RESET);

HAL_GPIO_WritePin(LCD_D7_PORT, LCD_D7_PIN, (data & 0x08) ? GPIO_PIN_SET : GPIO_PIN_RESET);


LCD_Enable();

}


void LCD_SendCommand(uint8_t cmd)

{

HAL_GPIO_WritePin(LCD_RS_PORT, LCD_RS_PIN, GPIO_PIN_RESET);


LCD_Send4Bit(cmd >> 4);

LCD_Send4Bit(cmd & 0x0F);


HAL_Delay(2);

}


void LCD_SendData(uint8_t data)

{

HAL_GPIO_WritePin(LCD_RS_PORT, LCD_RS_PIN, GPIO_PIN_SET);


LCD_Send4Bit(data >> 4);

LCD_Send4Bit(data & 0x0F);


HAL_Delay(1);

}


void LCD_Init(void)

{

HAL_Delay(50);


HAL_GPIO_WritePin(LCD_RS_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);

HAL_Delay(5);


LCD_SendCommand(0x28); // 4-bit, 2 line, 5x8 font

LCD_SendCommand(0x0C); // display ON, cursor OFF

LCD_SendCommand(0x06); // auto increment cursor

LCD_SendCommand(0x01); // clear display

HAL_Delay(2);

}


void LCD_Clear(void)

{

LCD_SendCommand(0x01);

HAL_Delay(2);

}


void LCD_SetCursor(uint8_t row, uint8_t col)

{

uint8_t address;


if (row == 0)

address = 0x80 + col;

else

address = 0xC0 + col;


LCD_SendCommand(address);

}


void LCD_Print(char *str)

{

while (*str)

{

LCD_SendData(*str++);

}

}


7. Rangkaian Simulasi [kembali]

Prinsip kerja:        

    Prinsip kerja alat Smart Landslide Warning System ini adalah membaca tiga parameter utama yang berhubungan dengan potensi longsor, yaitu intensitas hujan, kelembapan tanah, dan getaran tanah. Rain sensor YL-83 digunakan untuk membaca kondisi hujan, soil moisture sensor YL-69 digunakan untuk membaca kelembapan tanah, sedangkan vibration sensor SW-420 digunakan untuk mendeteksi adanya getaran atau pergerakan tanah. Data dari rain sensor dan soil sensor dibaca melalui ADC STM32F103C8T6, sedangkan sensor getaran dibaca sebagai sinyal digital HIGH atau LOW.

    Sistem menentukan kondisi berdasarkan nilai threshold yang sudah ditentukan. Jika nilai hujan kurang dari 60% dan kelembapan tanah kurang dari 55%, maka sistem berada pada kondisi AMAN. Jika hujan sudah mencapai 60% atau lebih dan kelembapan tanah mencapai 55% atau lebih, maka sistem masuk kondisi WASPADA karena tanah dianggap mulai jenuh akibat hujan. Pada kondisi ini, lampu rotator menyala sebagai peringatan visual, sedangkan buzzer masih mati.

    Kondisi BAHAYA terjadi ketika hujan mencapai 60% atau lebih, kelembapan tanah mencapai 55% atau lebih, dan sensor getaran mendeteksi getaran valid. Untuk alat nyata, getaran valid ditentukan sebagai 10 pulsa HIGH dalam waktu 5 detik. Jika kondisi ini terpenuhi, maka sistem mengaktifkan lampu rotator dan buzzer sebagai tanda peringatan bahaya longsor. Jadi, sistem tidak langsung menganggap hujan atau tanah basah saja sebagai bahaya, tetapi bahaya baru aktif jika hujan tinggi, tanah basah, dan ada indikasi getaran/pergerakan tanah.

8. Rangkaian Prototype [kembali]


9. Video Demo [kembali]


10. Kesimpulan dan Saran [kembali]

- Kesimpulan

    Berdasarkan proyek Smart Landslide Warning System pada daerah rawan longsor di Batu Busuak untuk deteksi longsor pada kondisi curah hujan yang tinggi, dapat disimpulkan bahwa sistem memanfaatkan rain sensor, soil moisture sensor, dan vibration sensor untuk mendeteksi kondisi lingkungan yang berpotensi menyebabkan tanah longsor. Data dari ketiga sensor diproses oleh mikrokontroler STM32F103C8 menggunakan metode klasifikasi berbasis nilai ambang batas sehingga mampu menentukan status kondisi menjadi AMAN, WASPADA, dan BAHAYA.

    Sistem bekerja dengan baik dalam melakukan pemantauan terhadap intensitas hujan, kelembapan tanah, dan getaran tanah. Ketika intensitas hujan mencapai ≥ 60% dan kelembapan tanah mencapai ≥ 55%, sistem memberikan status WASPADA melalui indikator visual. Apabila kondisi tersebut disertai adanya getaran yang memenuhi kriteria deteksi, sistem akan meningkatkan status menjadi BAHAYA dan mengaktifkan buzzer serta lampu rotator sebagai peringatan dini kepada masyarakat.Dengan adanya sistem ini, potensi longsor dapat dideteksi lebih awal sehingga dapat membantu meningkatkan kewaspadaan masyarakat serta mengurangi risiko korban jiwa dan kerugian material akibat bencana tanah longsor.

- Saran
Beberapa saran yang dapat dilakukan agar proyek ini berjalan dengan baik dan maksimal diantaranya:

1. Perlu dilakukan kalibrasi sensor secara berkala agar akurasi pembacaan data tetap terjaga sesuai dengan kondisi lingkungan sebenarnya.

2. Pengujian lebih lanjut di lapangan dengan berbagai kondisi cuaca dan karakteristik tanah perlu dilakukan untuk memperoleh parameter ambang batas yang lebih akurat dan sesuai dengan kondisi nyata di Batu Busuak.

11. Download File [kembali]






Komentar

Postingan populer dari blog ini

Figure 7.21

Figure 8.17

Figure 12.19