1. Kondisi Awal
Saat rangkaian dinyalakan, STM32 melakukan inisialisasi HAL, konfigurasi clock HSI, dan inisialisasi GPIO. Pin Touch dan PIR dikonfigurasi sebagai input, sedangkan pin LED dan Buzzer dikonfigurasi sebagai output.
2. Pembacaan Sensor (Loop Utama)
STM32 terus-menerus membaca status kedua sensor secara bersamaan di dalam while(1):
3. Logika Kondisi
Sistem hanya akan mengaktifkan LED jika kedua kondisi terpenuhi secara bersamaan:
Jika salah satu sensor tidak aktif, LED tetap mati.
4. Output: LED Berkedip
Ketika Touch aktif DAN PIR mendeteksi gerakan, STM32 menjalankan urutan berikut secara berulang:
... (berkedip terus selama kondisi terpenuhi)
Resistor R2 berfungsi membatasi arus yang masuk ke LED agar tidak rusak.
5. Kondisi Tidak Terpenuhi
Jika Touch tidak aktif atau PIR tidak mendeteksi gerakan, STM32 langsung mematikan LED (GPIO_PIN_RESET) dan kembali membaca sensor dari awal.
/* USER CODE BEGIN Header */
/**
* @file : main.c
* @brief : Main program body
*
* File utama program STM32 menggunakan HAL
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h" // Header utama HAL STM32
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void); // Deklarasi fungsi konfigurasi clock
static void MX_GPIO_Init(void); // Deklarasi fungsi inisialisasi GPIO
/**
* @brief The application entry point (fungsi utama)
*/
int main(void)
{
/* Reset semua peripheral, inisialisasi Flash & Systick */
HAL_Init(); // Inisialisasi HAL (wajib di awal)
/* Konfigurasi clock sistem */
SystemClock_Config();
/* Inisialisasi GPIO (input & output) */
MX_GPIO_Init();
/* Infinite loop (program berjalan terus) */
while (1)
{
// ===================== INPUT =====================
// Membaca sensor PIR (deteksi gerakan)
GPIO_PinState PIR = HAL_GPIO_ReadPin(PIR_GPIO_Port, PIR_Pin);
// Membaca sensor touch (sentuhan)
GPIO_PinState Touch = HAL_GPIO_ReadPin(Touch_GPIO_Port, Touch_Pin);
// ===================== PROSES =====================
// Jika Touch aktif (1) DAN PIR aktif (1)
if (Touch == GPIO_PIN_SET && PIR == GPIO_PIN_SET)
{
// ===================== OUTPUT =====================
// LED merah menyala
HAL_GPIO_WritePin(RED_GPIO_Port, RED_Pin, GPIO_PIN_SET);
HAL_Delay(200); // Delay 200 ms (LED ON)
// LED merah mati
HAL_GPIO_WritePin(RED_GPIO_Port, RED_Pin, GPIO_PIN_RESET);
HAL_Delay(200); // Delay 200 ms (LED OFF)
// Hasil: LED berkedip (blinking)
}
else
{
// Jika kondisi tidak terpenuhi → LED mati
HAL_GPIO_WritePin(RED_GPIO_Port, RED_Pin, GPIO_PIN_RESET);
}
}
}
/**
* @brief System Clock Configuration
* Fungsi untuk mengatur clock mikrokontroler
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Struktur oscillator
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // Struktur clock
// Menggunakan HSI (internal clock)
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON; // Aktifkan HSI
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
// Tidak menggunakan PLL
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
// Jika konfigurasi oscillator gagal
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
// Konfigurasi clock CPU, AHB, APB
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |
RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_PCLK1 |
RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // Sumber clock dari HSI
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // Tidak dibagi
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; // Tidak dibagi
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // Tidak dibagi
// Jika konfigurasi clock gagal
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief GPIO Initialization Function
* Mengatur pin input dan output
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; // Struktur konfigurasi GPIO
// Aktifkan clock untuk port GPIO
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// Set kondisi awal LED = mati
HAL_GPIO_WritePin(RED_GPIO_Port, RED_Pin, GPIO_PIN_RESET);
// ===================== INPUT =====================
// Konfigurasi pin PIR & Touch sebagai input
GPIO_InitStruct.Pin = PIR_Pin | Touch_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // Mode input
GPIO_InitStruct.Pull = GPIO_NOPULL; // Tanpa pull-up/pull-down
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// ===================== OUTPUT =====================
// Konfigurasi pin LED merah sebagai output
GPIO_InitStruct.Pin = RED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Output push-pull
GPIO_InitStruct.Pull = GPIO_NOPULL; // Tanpa resistor internal
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;// Kecepatan rendah
HAL_GPIO_Init(RED_GPIO_Port, &GPIO_InitStruct);
}
/**
* @brief Fungsi jika terjadi error
*/
void Error_Handler(void)
{
__disable_irq(); // Nonaktifkan interrupt
while (1)
{
// Program berhenti di sini jika error
}
}
#ifdef USE_FULL_ASSERT
/**
* @brief Menampilkan lokasi error (debugging)
*/
void assert_failed(uint8_t *file, uint32_t line)
{
// Bisa ditambahkan printf untuk debugging
}
#endif
Komentar
Posting Komentar