M4

"Sistem Peringatan Dini (Early Warning System) Kebakaran Lahan di Perimeter Fasilitas PLTS Berbasis STM32"

1. Pendahuluan

    Sistem ini merupakan Early Warning System (EWS) yang dirancang untuk memantau dan memitigasi potensi bahaya kebakaran pada area perimeter Pembangkit Listrik Tenaga Surya (PLTS), seperti ruang inverter atau panel hubung dan area disekitar PLTS. Sistem ini menggunakan mikrokontroler arsitektur 32-bit (STM32) untuk memproses multivariabel fisik secara real-time. Tujuan utama sistem ini adalah mendeteksi anomali pada fase sangat awal seperti kenaikan suhu (indikasi overload/thermal runaway) dan kemunculan gas/asap pembakaran atau indikasi kebakaran serta memberikan respons interupsi perangkat keras yang absolut ketika lidah api terdeteksi.

    Sistem beroperasi berdasarkan hierarki pengawasan dengan metode pemindaian berurutan (Polling) untuk pembacaan parameter transien lambat, dan metode interupsi (External Interrupt/EXTI) untuk pemicu kondisi kritis absolut. Kondisi operasional dibagi menjadi tiga tingkat:

1. Kondisi AMAN (Normal State)

Pemicu: Sensor Suhu mendeteksi < 45°C, Sensor Asap mendeteksi nilai ADC < 2000, dan tidak ada sinyal dari Flame Sensor.

Aksi: Semua aktuator (Kipas, LED Strobo, Buzzer) dalam keadaan MATI. LCD I2C menampilkan metrik suhu aktual dan status "AMAN".

2. Kondisi WASPADA (Preventive State)

Pemicu: Terdapat pemanasan komponen (Suhu > 45°C) ATAU akumulasi gas pembakaran (Asap > 2000) menggunakan logika fungsi OR.

Aksi: Mikrokontroler mengaktifkan sistem sirkulasi. Kipas (FAN) menyala untuk membuang akumulasi gas panas, LED Strobo berkedip (toggle), dan Buzzer menyala dengan intensitas sedang (PWM Duty Cycle menengah). Layar LCD memperbarui status menjadi "WASPADA!".

3. Kondisi DARURAT (Absolute Mitigation State)

Pemicu: Lidah api terdeteksi oleh Flame Sensor (Logika 1)

Aksi: Memicu External Interrupt (EXTI) yang seketika mengambil alih program (hardware level override). Mikrokontroler mengabaikan delay dari sensor lain. Kipas dieksekusi penuh sebagai smoke extractor, Buzzer berbunyi maksimal, dan LED Strobo menyala konstan. Sistem akan terkunci (system halt) dalam kondisi peringatan evakuasi hingga teknisi melakukan reset.

2. Tujuan

1. Bertujuan untuk mendeteksi adanya kebakaran atau potensi kebakaran di sekitar lahan PLTS
2. Melindungi sistem PLTS Batu Busuk dari potensi kebakaran tanpa kontak fisik
3. 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

1. STM32 Blue Pill

2. ST-Link V2
3. MQ-2 Sensor

4. DS18B20

5. Flame Sensor

6. LED

7. Buzzer
8. Fan DC

9. LCD I2C

10. Baterai

11. Buck Converter

12. Transistor

13. Dioda

14. Resistor

15. Breadboard

4. Landasan Teori


1. Mikrokontroler STM32F103C8T6 (Bluepill)

                                                                        Gambar 1. STM32 Bluepill

 

Spesifikasi: Arsitektur ARM Cortex-M3 32-bit, Clock hingga 72 MHz, Resolusi ADC 12-bit (0-4095).

Cara Kerja: Bertindak sebagai Unit Pemroses Sentral (CPU). Membaca sinyal tegangan dari sensor MQ-2 melalui pin Analog to Digital Converter (ADC), membaca data suhu digital, serta mengendalikan aktuator menggunakan Pulse Width Modulation (PWM) untuk mengatur intensitas suara Buzzer.



2. MQ-2 Sensor



Spesifikasi: Deteksi H2, LPG, CH4, CO, Asap. Tegangan operasi 5V. Sinyal output analog.

Cara Kerja (Chemiresistor): Menggunakan material semikonduktor Timah Dioksida (SnO2) yang dipanaskan. Saat udara bersih, oksigen menahan elektron bebas sehingga resistansi tinggi. Saat gas/asap pembakaran bereaksi dengan material, elektron dilepaskan sehingga konduktivitas naik. Perubahan resistansi ini diubah menjadi perubahan tegangan (voltage divider) yang masuk ke pin ADC STM32.

3. Sensor Suhu


Spesifikasi: Rentang pengukuran -55°C hingga +125°C. Akurasi ±0.5°C. Protokol komunikasi 1-Wire. Resolusi internal 9 hingga 12-bit.

Cara Kerja (Bandgap Temperature Sensor): Mengukur selisih tegangan maju (forward voltage drop) antara dua p-n junction di dalam IC yang sangat linier terhadap suhu. Sinyal analog ini langsung dikonversi menjadi data digital di dalam chip DS18B20 itu sendiri, sehingga data yang dikirim ke mikrokontroler sangat kebal terhadap noise elektromagnetik dari sirkuit tegangan tinggi.

4. Flame Sensor 5 Arah

Spesifikasi: Fotodiode inframerah, sensitivitas spektrum 760 nm - 1100 nm, sudut deteksi 60 derajat.

Cara Kerja: Menggunakan photodiode (LED hitam) yang hanya sensitif terhadap radiasi gelombang inframerah yang dipancarkan oleh reaksi pembakaran/lidah api. Tabrakan foton inframerah melepaskan pasangan elektron-hole, menciptakan arus bocor yang kemudian dikuatkan oleh IC Komparator menjadi sinyal digital murni (HIGH/LOW) untuk memicu EXTI STM32.


5. Transistor NPN



Spesifikasi: Transistor Bipolar Junction (BJT) NPN, Arus kolektor maksimal ~600mA - 800mA.Cara Kerja: Bertindak sebagai saklar elektronik (switching). Pin mikrokontroler hanya mengeluarkan arus < 20mA (3.3V). Arus kecil ini masuk ke basis (B) transistor untuk "membuka gerbang", memungkinkan arus besar dari Power Supply 5V mengalir melalui Kolektor (C) menuju Emitor (E) ke Ground untuk menggerakkan beban berat (Kipas DC dan LED Strobo).

6. Buzzer



Spesifikasi: Tegangan operasi 3.3V–5V, frekuensi kerja sekitar 2–4 kHz, konsumsi arus ±20–35 mA.

Cara Kerja: Buzzer berfungsi sebagai perangkat peringatan audio. Mikrokontroler STM32 mengendalikan buzzer menggunakan sinyal digital atau Pulse Width Modulation (PWM). Pada kondisi WASPADA, buzzer diaktifkan dengan duty cycle menengah sehingga menghasilkan bunyi peringatan berkala dengan intensitas sedang. Pada kondisi DARURAT, STM32 meningkatkan duty cycle menjadi maksimum sehingga buzzer menghasilkan suara alarm yang lebih keras dan kontinu untuk memperingatkan operator agar segera melakukan tindakan mitigasi.

7. LCD 16x2 dengan Modul I2C (PCF8574)


Spesifikasi: Layar karakter 16 kolom × 2 baris, tegangan operasi 5V, antarmuka komunikasi I2C, alamat umum 0x27 atau 0x3F.

Cara Kerja: LCD digunakan sebagai Human Machine Interface (HMI) untuk menampilkan informasi kondisi sistem secara real-time. Modul PCF8574 berfungsi sebagai I/O Expander yang mengubah komunikasi serial I2C menjadi sinyal paralel yang dibutuhkan oleh kontroler LCD. Mikrokontroler STM32 mengirimkan data suhu, nilai sensor, dan status sistem (AMAN, WASPADA, atau DARURAT) melalui jalur SDA dan SCL. Penggunaan I2C menghemat jumlah pin mikrokontroler karena hanya memerlukan dua jalur komunikasi.

8. I2C (Inter-Integrated Circuit)

Penggunaan: Komunikasi antara mikrokontroler STM32 dengan Layar LCD 16x2.

Penjelasan: Menggunakan dua jalur kabel (Half-Duplex), yaitu SDA (Serial Data) dan SCL (Serial Clock). Sistem ini memanfaatkan modul expander PCF8574 (mengubah I2C serial menjadi data paralel untuk LCD). Komunikasi ini bertopologi Open-Drain, sehingga mutlak memerlukan penambahan komponen eksternal berupa Resistor Pull-Up (4.7k Ω) yang disambung paralel ke sumber tegangan untuk menarik sinyal logika secara default ke High (3.3V). Alamat slave perangkat keras ini disetel pada hexadecimal 0x27 (atau 0x4E setelah bit-shifting pada library HAL STM32)

9. 1-Wire Protocol

Penggunaan: Komunikasi tunggal antara sensor suhu DS18B20 dengan STM32.

Penjelasan: Protokol digital murni yang hanya membutuhkan satu pin data (kabel kuning) ditambah kabel daya dan ground. Data ditransmisikan dua arah bergantian (Half-Duplex) berdasarkan timing slots. Protokol ini memungkinkan pemasangan banyak sensor pada satu jalur kabel yang sama (daisy-chaining), karena setiap sensor DS18B20 memiliki alamat ROM 64-bit yang unik dari pabriknya. Sangat ideal untuk mengurangi penggunaan pin (I/O efficiency).



5. Flowchart dan Listing Program

1. Flowchart




2. Listing Program

/* USER CODE BEGIN Header */

/**

******************************************************************************

* @file : main.c

* @brief : Main program body - Sistem Peringatan Dini Kebakaran PLTS

******************************************************************************

*/

/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/

#include "main.h"


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include <stdio.h>

#include "liquidcrystal_i2c.h" // Library I2C LCD

#include "ds18b20.h" // Library Sensor Suhu DS18B20

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


I2C_HandleTypeDef hi2c1;


/* USER CODE BEGIN PV */

uint16_t adc_mq2_val = 0;

float suhu_val = 0.0;

volatile uint8_t flag_bahaya_api = 0; // Flag deteksi api via Interrupt

/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);

static void MX_I2C1_Init(void);

/* USER CODE BEGIN PFP */

// Prototipe Fungsi Mode (3 Tahapan FSM)

void Mode_Aman(void);

void Mode_Waspada(void);

void Mode_Darurat(void);

/* USER CODE END PFP */


/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */

// --- FUNGSI INTERRUPT HARDWARE (Dieksekusi Saat Ada Api) ---

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if(GPIO_Pin == GPIO_PIN_13) {

flag_bahaya_api = 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();

MX_I2C1_Init();

/* USER CODE BEGIN 2 */

// ========================================================

// INISIALISASI LCD

// ========================================================

HAL_Delay(100); // Jeda agar mikrokontroler menunggu LCD siap

HD44780_Init(2); // Inisialisasi layar 2 baris

HD44780_Clear(); // Bersihkan layar dari sisa memori

HD44780_SetCursor(0, 0); // Kursor di atas kiri

HD44780_PrintStr("SISTEM AKTIF!");

HAL_Delay(1000); // Tampilkan tulisan awal selama 1 detik

/* USER CODE END 2 */


/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

// ========================================================

// TAHAP 3: DARURAT (Mendeteksi Api - Mengabaikan Sensor Lain)

// ========================================================

if (flag_bahaya_api == 1) {

Mode_Darurat();


// Tahan alarm selama 2 detik agar aksi aktuator tuntas

HAL_Delay(2000);


// Cek fisik pin sensor api.

// Jika sensor masih mendeteksi api (pin PB13 masih terpicu), tahan flag-nya!

if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13) == GPIO_PIN_SET) {

flag_bahaya_api = 1;

} else {

flag_bahaya_api = 0; // Jika api benar-benar padam, baru reset

}

}

else {

// JIKA TIDAK ADA API, BACA SENSOR LAINNYA

// ========================================================

HAL_ADC_Start(&hadc1);

HAL_Delay(5); // Jeda agar ADC sempat membaca

if(HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK) {

adc_mq2_val = HAL_ADC_GetValue(&hadc1);

}

HAL_ADC_Stop(&hadc1);


// KOMENTAR SEMENTARA UNTUK TESTING LCD MANDIRI

// suhu_val = DS18B20_GetTemp();


// Suhu palsu untuk testing LCD.

// Ubah angka ini menjadi 46.0 jika ingin mengetes Mode Waspada

// suhu_val = 25.5;


// ========================================================

// TAHAP 2: WASPADA (Suhu >= 45 ATAU Asap >= 2000)

// ========================================================

if (suhu_val >= 45.0 || adc_mq2_val >= 2000) {

Mode_Waspada();

}

// ========================================================

// TAHAP 1: AMAN (Suhu < 45 DAN Asap < 2000)

// ========================================================

else {

Mode_Aman();

}

}


// Delay kosong pengaman siklus CPU (menghindari hang)

for(volatile uint32_t i = 0; i < 500000; i++) {

__NOP();

}


/* USER CODE END WHILE */


/* USER CODE BEGIN 3 */

}

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

RCC_OscInitStruct.HSEState = RCC_HSE_ON;

RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;

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

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;


if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

{

Error_Handler();

}

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;

PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;

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 = ENABLE;

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

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 I2C1 Initialization Function

* @param None

* @retval None

*/

static void MX_I2C1_Init(void)

{


/* USER CODE BEGIN I2C1_Init 0 */


/* USER CODE END I2C1_Init 0 */


/* USER CODE BEGIN I2C1_Init 1 */


/* USER CODE END I2C1_Init 1 */

hi2c1.Instance = I2C1;

hi2c1.Init.ClockSpeed = 100000;

hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;

hi2c1.Init.OwnAddress1 = 0;

hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;

hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;

hi2c1.Init.OwnAddress2 = 0;

hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;

hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

if (HAL_I2C_Init(&hi2c1) != HAL_OK)

{

Error_Handler();

}

/* USER CODE BEGIN I2C1_Init 2 */


/* USER CODE END I2C1_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_STROBO_Pin|FAN_Pin|DS18B20_Pin|BUZZER_Pin, GPIO_PIN_RESET);


/*Configure GPIO pins : LED_STROBO_Pin FAN_Pin BUZZER_Pin */

GPIO_InitStruct.Pin = LED_STROBO_Pin|FAN_Pin|BUZZER_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 pin : DS18B20_Pin */

GPIO_InitStruct.Pin = DS18B20_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(DS18B20_GPIO_Port, &GPIO_InitStruct);


/*Configure GPIO pin : PB13 */

GPIO_InitStruct.Pin = GPIO_PIN_13;

GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


/* EXTI interrupt init*/

HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);


/* USER CODE BEGIN MX_GPIO_Init_2 */


/* USER CODE END MX_GPIO_Init_2 */

}


/* USER CODE BEGIN 4 */


void Mode_Aman(void) {

// TAHAP 1: Semua Aktuator MATI

HAL_GPIO_WritePin(GPIOB, FAN_Pin, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, LED_STROBO_Pin, GPIO_PIN_RESET);

HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);


// LCD AMAN

char lcd_buffer[16];

HD44780_SetCursor(0, 0);

sprintf(lcd_buffer, "Temp: %.1f C ", suhu_val);

HD44780_PrintStr(lcd_buffer);


HD44780_SetCursor(0, 1);

HD44780_PrintStr("STATUS: AMAN ");

}


void Mode_Waspada(void) {

// TAHAP 2: Fan HIDUP, LED & Buzzer BERKEDIP

HAL_GPIO_WritePin(GPIOB, FAN_Pin, GPIO_PIN_SET);


static uint16_t hitung_kedip = 0;

hitung_kedip++;


if (hitung_kedip < 1) {

HAL_GPIO_WritePin(GPIOB, LED_STROBO_Pin, GPIO_PIN_SET);

HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);

}

else if (hitung_kedip < 2) {

HAL_GPIO_WritePin(GPIOB, LED_STROBO_Pin, GPIO_PIN_RESET);

HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);

}

else {

hitung_kedip = 0;

}


// LCD WASPADA

char lcd_buffer[16];

HD44780_SetCursor(0, 0);

sprintf(lcd_buffer, "Temp: %.1f C ", suhu_val);

HD44780_PrintStr(lcd_buffer);


HD44780_SetCursor(0, 1);

HD44780_PrintStr("STATUS: WASPADA!");

}


void Mode_Darurat(void) {

// TAHAP 3: Fan MATI (Isolasi Oksigen), LED & Buzzer HIDUP TERANG/KONSTAN

HAL_GPIO_WritePin(GPIOB, FAN_Pin, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, LED_STROBO_Pin, GPIO_PIN_SET);

HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);


// LCD DARURAT

HD44780_Clear();

HD44780_SetCursor(0, 0);

HD44780_PrintStr("!!! BAHAYA !!!");


HD44780_SetCursor(0, 1);

HD44780_PrintStr("STATUS: DARURAT ");

}

/* USER CODE END 4 */


/**

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

* @retval None

*/

void Error_Handler(void)

{

/* USER CODE BEGIN Error_Handler_Debug */

__disable_irq();

while (1)

{

}

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

/* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */


6. Rangkaian Simulasi dan Prinsip Kerja

1. Rangkaian Simulasi

2. Video Penjelasan




7. Kesimpulan dan Saran

Berdasarkan perancangan, simulasi, dan implementasi sistem yang telah dilakukan, dapat disimpulkan bahwa sistem peringatan dini kebakaran lahan berbasis STM32F103C8T6 dapat dirancang untuk mendeteksi indikasi kebakaran pada area perimeter fasilitas Pembangkit Listrik Tenaga Surya (PLTS) secara real-time. Sistem memanfaatkan kombinasi tiga sensor, yaitu sensor suhu DS18B20, sensor asap MQ-2, dan flame sensor sebagai parameter utama dalam mendeteksi kondisi lingkungan sekitar.

Sistem yang dirancang mampu mengklasifikasikan kondisi menjadi tiga tingkatan, yaitu NORMAL, WASPADA, dan DARURAT. Pada kondisi normal, sistem melakukan pemantauan suhu, asap, dan keberadaan api secara terus-menerus serta menampilkan informasi monitoring pada LCD. Pada kondisi waspada, sistem memberikan peringatan dini berupa bunyi buzzer secara periodik dan kedipan LED strobo sebagai indikasi adanya kenaikan suhu atau terdeteksinya asap di sekitar perimeter PLTS. Sementara itu, pada kondisi darurat ketika flame sensor mendeteksi nyala api secara langsung, sistem mampu mengaktifkan alarm secara terus-menerus, menyalakan LED strobo dengan frekuensi kedip yang lebih cepat, serta mengaktifkan exhaust fan untuk menjaga kondisi box kontrol.

Hasil simulasi menggunakan Proteus menunjukkan bahwa seluruh fungsi sistem dapat bekerja sesuai dengan logika yang telah dirancang. Meskipun terdapat keterlambatan respons pada simulasi akibat keterbatasan proses simulasi Proteus, secara teoritis sistem dapat bekerja lebih responsif ketika diimplementasikan pada perangkat keras sebenarnya. Dengan biaya perancangan yang relatif rendah, sistem ini memiliki potensi sebagai lapisan proteksi awal untuk meningkatkan keamanan fasilitas PLTS dari ancaman kebakaran lahan yang berasal dari area sekitar perimeter.

8. Download File

Rangkaian Simulasi [Klik]
Download Datasheet STM32 BLUEPILL [Klik]

Link Video Penjelasan Prototype [Klik]

Komentar

Postingan populer dari blog ini