/* USER CODE BEGIN Header */
// Header awal
/**
---
* @file : main.c
* @brief : Main program body
---
*/
// Header akhir
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h" // Library utama
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void); // Konfigurasi clock
static void MX_GPIO_Init(void); // Inisialisasi GPIO
int main(void)
{
HAL_Init(); // Inisialisasi HAL
SystemClock_Config(); // Set clock
MX_GPIO_Init(); // Inisialisasi GPIO
while (1) // Loop utama
{
static uint32_t lastTime = 0;
// Menyimpan waktu terakhir trigger
static uint8_t lastState = 0;
// Menyimpan kondisi sebelumnya
static uint8_t emergency = 0;
// Status mode darurat
uint8_t currentState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
// Membaca sensor infrared di PA0
// Deteksi perubahan LOW -> HIGH
if (lastState == 0 && currentState == 1)
{
uint32_t now = HAL_GetTick();
// Ambil waktu sekarang (ms)
// Jika perubahan terjadi cepat (<500ms)
if ((now - lastTime) < 500)
{
emergency = 1;
// Aktifkan mode darurat
}
lastTime = now;
// Simpan waktu terakhir
}
lastState = currentState;
// Update kondisi sebelumnya
// Jika mode darurat aktif
if (emergency)
{
// LED merah & biru berkedip cepat
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
// LED merah
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
// LED biru
HAL_Delay(50);
// Delay cepat (kedip cepat)
// Buzzer nada tinggi (frekuensi tinggi)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
// ON
HAL_Delay(1);
// Delay sangat kecil
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
// OFF
HAL_Delay(1);
// Delay sangat kecil → menghasilkan nada tinggi
}
}
}
/**
* @brief System Clock Configuration
*/
// Fungsi konfigurasi clock
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
// Struktur oscillator
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// Struktur clock
__HAL_FLASH_SET_LATENCY(FLASH_LATENCY_1);
// Set latency flash
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
// Pakai oscillator internal
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
// Aktifkan HSI
RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
// Divider
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
// Kalibrasi default
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
// Jika gagal
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;
// Jenis clock
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
// Sumber clock
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
// Divider
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;
// Divider AHB
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
// Divider APB1
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief GPIO Initialization
*/
// Inisialisasi GPIO
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// Struktur GPIO
__HAL_RCC_GPIOA_CLK_ENABLE();
// Aktifkan GPIOA
__HAL_RCC_GPIOB_CLK_ENABLE();
// Aktifkan GPIOB
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
// Set awal LOW
// PA0 sebagai input (sensor)
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// PB1, PB2, PB3 sebagai output (LED & buzzer)
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
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 Error Handler
*/
// Fungsi error
void Error_Handler(void)
{
__disable_irq();
// Matikan interrupt
while (1)
{
// Loop terus jika error
}
}
Komentar
Posting Komentar