Tugas Pendahuluan 1



 Kontrol Lampu Lorong 


a. 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

b. Hardware dan Diagram Blok [Kembali]

  • Hardwere
1. STM32F103C8





2. Touch Sensor



3. PIR Sensor



4. LED



5. Buzzer



6. Resistor 


  • Diagram Blog


c. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

  • Rangkaian Simulasi


  • Prinsip Kerja

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.

Pada kondisi yang diberikan, yaitu PIR mendeteksi gerakan berulang sebelum waktu tunda habis, maka setiap deteksi baru dari PIR akan meng-reset atau memperpanjang waktu tunda. Dengan kata lain, timer di dalam mikrokontroler tidak pernah mencapai kondisi habis karena terus diperbarui oleh sinyal dari PIR. Akibatnya, LED akan tetap menyala secara terus-menerus selama masih ada gerakan yang terdeteksi berulang. Sementara itu, karena sensor touch tidak disentuh, maka tidak ada perubahan logika dari sensor tersebut (tetap LOW), sehingga tidak mempengaruhi kondisi sistem. Artinya, kontrol utama sepenuhnya berasal dari sensor PIR.



d. Flowchart dan Listing Program [Kembali]

  • Flowchart


  • Listing Program

#include "stm32f1xx_hal.h"   // Library utama HAL untuk STM32F1

/* ================= 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


e. Video Demo [Kembali]


f. Kondisi [Kembali]

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

g. Video Simulasi [Kembali]



h. Download File [Kembali]

File TP [Klik disini]



Kembali ke Halaman Atas

 

 

Komentar

Postingan populer dari blog ini