1. Buka software proteus lalu rangkai komponen sesuai dengan gambar yang ada di modul
2. Buka software STM32CubeIDE lalu lakukan konfigurasi pin pada STM untuk menentukan GPIO input dan GPIO output
3. Masukan Program ke dalam software STM32CubeIDE lalu build untuk mendapatkan file .hex
4. Masukan file .hex ke dalam file library STM32F103C8 pada proteus
5. Simulasikan rangkaian
1. STM32F103C8
2. Touch Sensor
3. PIR Sensor
4. LED
5. Buzzer
6. Resistor
Pada rangkaian tersebut, sensor PIR berfungsi sebagai pendeteksi gerakan, sedangkan sensor touch berfungsi sebagai input tambahan untuk kontrol sistem. Output dari kedua sensor ini diproses oleh mikrokontroler (STM32) untuk mengendalikan LED dan buzzer. Ketika sistem aktif, sensor PIR akan mendeteksi adanya gerakan di sekitarnya. Saat gerakan pertama terdeteksi, PIR mengirimkan sinyal logika HIGH ke mikrokontroler sehingga LED menyala dan buzzer dapat aktif sesuai program. Selain itu, mikrokontroler akan memulai waktu tunda (delay) sebagai durasi LED tetap menyala.
/* ================= VARIABEL ================= */
// Variabel untuk menyimpan waktu terakhir PIR aktif
uint32_t pir_timer;
// Delay waktu LED tetap menyala setelah ada gerakan (5000 ms = 5 detik)
#define PIR_DELAY 5000
// Deklarasi fungsi
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void Error_Handler(void);
/* ================= MAIN ================= */
int main(void)
{
HAL_Init(); // Inisialisasi HAL (hardware abstraction layer)
SystemClock_Config(); // Konfigurasi clock sistem
MX_GPIO_Init(); // Inisialisasi GPIO (input/output)
// Supaya LED tidak langsung nyala saat awal program
pir_timer = HAL_GetTick(); // Ambil waktu awal (ms sejak start)
while (1) // Loop utama (jalan terus)
{
// Membaca kondisi sensor PIR di PA2
uint8_t pir_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2);
// Membaca kondisi sensor Touch di PA1
uint8_t touch_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
/* ===== PIR LOGIC ===== */
if (pir_now == GPIO_PIN_SET) // Jika PIR mendeteksi gerakan
{
pir_timer = HAL_GetTick(); // Reset timer ke waktu sekarang
}
/* ===== LED DARI PIR ===== */
// Jika waktu sekarang - waktu terakhir PIR < 5 detik
if ((HAL_GetTick() - pir_timer) < PIR_DELAY)
{
// Nyalakan LED (PB0)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
}
else
{
// Matikan LED jika sudah lebih dari 5 detik tanpa gerakan
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
}
/* ===== TOUCH ===== */
if (touch_now == GPIO_PIN_SET) // Jika sensor touch disentuh
{
// Nyalakan LED
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
// Nyalakan buzzer
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
}
else
{
// Matikan buzzer jika tidak disentuh
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
}
}
}
/* ================= CLOCK ================= */
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Struktur konfigurasi oscillator
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // Struktur konfigurasi clock
// Menggunakan HSI (internal clock)
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Tidak pakai PLL
// Terapkan konfigurasi oscillator
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
Error_Handler(); // Jika gagal, masuk error
// Konfigurasi jenis clock
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |
RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_PCLK1;
// Sumber clock sistem dari HSI
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
// Pembagi clock
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
// Terapkan konfigurasi clock
if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
Error_Handler();
}
/* ================= GPIO ================= */
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; // Struktur konfigurasi GPIO
// Aktifkan clock untuk GPIOA dan GPIOB
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/* INPUT: PA1 (Touch), PA2 (PIR) */
GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2; // Pin PA1 & PA2
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // Mode input
GPIO_InitStruct.Pull = GPIO_PULLDOWN; // Pull-down resistor
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Terapkan ke GPIOA
/* OUTPUT: PB0 (LED), PB1 (Buzzer) */
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; // Pin PB0 & PB1
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 ke GPIOB
// Set kondisi awal LED dan buzzer mati
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);
}
/* ================= ERROR ================= */
void Error_Handler(void)
{
__disable_irq(); // Nonaktifkan semua interrupt
while(1) {} // Loop tak hingga (program berhenti di sini)
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
// Fungsi debug jika terjadi error parameter
}
#endif
Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi PIR mendeteksi gerakan berulang sebelum waktu tunda habis dan sensor Touch tidak disentuh, maka LED tetap menyala
Komentar
Posting Komentar