Percobaan 1 Kondisi 2



1. Prosedur [Kembali]

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

2. Hardware [Kembali]

  • Hardware
1. STM32F103C8





2. Touch Sensor



3. PIR Sensor



4. LED



5. Buzzer



6. Resistor 

  • Diagram Blog

3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]


  • Sensor mendeteksi, maka logicstate berlogika 1
  • Salah satu sensor ketika berlogika 1, maka akan diteruskan ke STM32F103C8 sebagai input PA0 dan PA1
  • Setelah itu keluarannya dari PB0 dan PB1 akan menghidupkan LED dan Buzzer secara bersamaan
  • Pada Touch sensor, outputnya akan ON dan OFF setiap berlogika 1 secara bergantian.
  • Pada PIR sensor, outputnya akan ON dan OFF setiap pergantian logika 1 dengan 0

4. Flowchart [Kembali]

  • Flowchart

  • Listing Program
#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
    }
}

5. Video Demo [Kembali]


6. Kondisi [Kembali]

M1 P1 K2: Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi ketika PIR tidak mendeteksi gerakan dan sensor Touch tidak mendeteksi sentuhan, maka LED akan mati

7. Video Simulasi [Kembali]



8. Download File [Kembali]

Rangkaian Simulasi [Klik]

Video Simulasi [Klik]


Kembali ke Halaman Atas



Komentar