#include "stm32f1xx_hal.h" // Library HAL untuk STM32F1
uint8_t system_enable = 0; // Status sistem (0 = OFF, 1 = ON)
uint8_t touch_last = 0; // Menyimpan kondisi touch sebelumnya (untuk edge detection)
uint8_t pir_first_trigger = 1; // Penanda deteksi pertama PIR
void SystemClock_Config(void); // Deklarasi fungsi konfigurasi clock
static void MX_GPIO_Init(void);// Deklarasi fungsi inisialisasi GPIO
void Error_Handler(void); // Deklarasi fungsi error handler
int main(void)
{
HAL_Init(); // Inisialisasi HAL (reset peripheral, setup SysTick, dll)
SystemClock_Config(); // Konfigurasi clock sistem
MX_GPIO_Init(); // Inisialisasi GPIO (input/output)
while (1) // Loop utama (berjalan terus)
{
// Membaca kondisi input
uint8_t pir_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0); // Baca PIR di PA0
uint8_t touch_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1); // Baca touch di PA1
// ================= DETEKSI TOUCH =================
// Edge detection: hanya aktif saat perubahan dari 0 ke 1
if (touch_now == GPIO_PIN_SET && touch_last == GPIO_PIN_RESET)
{
system_enable = !system_enable; // Toggle sistem (ON/OFF)
if (system_enable) // Jika sistem ON
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // Nyalakan indikator (PB1)
HAL_Delay(100); // Delay 100 ms
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // Matikan indikator
}
HAL_Delay(200); // Delay untuk debounce tombol
}
touch_last = touch_now; // Simpan kondisi touch saat ini
// ================= DETEKSI PIR =================
if (pir_now == GPIO_PIN_SET) // Jika PIR mendeteksi gerakan
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // Nyalakan output utama (PB0)
if (pir_first_trigger) // Jika deteksi pertama
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // Nyalakan buzzer/indikator
HAL_Delay(100); // Delay 100 ms
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // Matikan buzzer
pir_first_trigger = 0; // Tandai bahwa sudah pernah trigger
}
}
else // Jika tidak ada gerakan
{
pir_first_trigger = 1; // Reset agar bisa trigger lagi nanti
if (!system_enable) // Jika sistem OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // Matikan output utama
}
// Jika sistem ON, output utama tetap hidup
if (system_enable)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
}
}
// ================= KONFIGURASI CLOCK =================
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Struktur konfigurasi oscillator
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // Struktur konfigurasi clock
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; // Gunakan HSI (internal clock)
RCC_OscInitStruct.HSIState = RCC_HSI_ON; // Aktifkan HSI
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; // Kalibrasi default
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Tidak pakai PLL
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
Error_Handler(); // Jika gagal, masuk error handler
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |
RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_PCLK1; // Konfigurasi jenis clock
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // Sumber clock dari HSI
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // Divider AHB = 1
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; // Divider APB1 = 1
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
Error_Handler(); // Jika gagal, masuk error handler
}
// ================= INISIALISASI GPIO =================
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; // Struktur konfigurasi GPIO
__HAL_RCC_GPIOA_CLK_ENABLE(); // Aktifkan clock GPIOA
__HAL_RCC_GPIOB_CLK_ENABLE(); // Aktifkan clock GPIOB
// -------- GPIOA sebagai INPUT --------
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; // PA0 (PIR), PA1 (Touch)
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // Mode input
GPIO_InitStruct.Pull = GPIO_NOPULL; // Tanpa pull-up/pull-down
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Terapkan konfigurasi
// -------- GPIOB sebagai OUTPUT --------
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; // PB0 (output utama), PB1 (indikator)
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Output push-pull
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Kecepatan rendah
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // Terapkan konfigurasi
// Set kondisi awal output = OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);
}
// ================= ERROR HANDLER =================
void Error_Handler(void)
{
__disable_irq(); // Nonaktifkan semua interrupt
while (1)
{
// Program berhenti di sini jika terjadi error
}
}
Komentar
Posting Komentar