Laporan Akhir 1

 [KEMBALI KE MENU SEBELUMNYA]



1. Prosedur [Kembali]

  • Siapkan seluruh komponen yang dibutuhkan seperti STM32F103C8 (Bluepill), ST-LINK, PIR sensor, touch sensor, buzzer, LED, resistor 220Ω, serta kabel jumper.
  • Rangkai komponen sesuai dengan gambar yang ada di modul
  • Pastikan semua koneksi sudah sesuai, tidak ada kabel yang longgar atau terbalik.
  • Hubungkan board STM32 ke komputer menggunakan ST-LINK, lalu lakukan pemrograman sesuai dengan flowchart yang telah dibuat.
  • Setelah program berhasil di-upload, silahkan run untuk memastikan logika dan rangkaian sudah benar.


  • 2. Hardware dan Diagram Blok [Kembali]

    STM32F103C8


    Touch Sensor


    PIR Sensor

    LED

    Buzzer

    Resistor


    Diagram Blok




    3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]



    Sistem ini terdiri dari sensor PIR sebagai pendeteksi gerakan, sensor touch sebagai input manual, mikrokontroler STM32 sebagai pengendali utama, serta LED yang berfungsi sebagai lampu lorong dan buzzer sebagai indikator tambahan. Ketika sensor PIR mendeteksi adanya gerakan, output-nya akan berubah menjadi HIGH (ditandai warna merah), kemudian sinyal tersebut dibaca oleh mikrokontroler untuk menyalakan LED. Bersamaan dengan itu, mikrokontroler juga mengaktifkan mekanisme waktu tunda (delay timer) yang berfungsi untuk mempertahankan kondisi lampu tetap menyala selama beberapa waktu meskipun tidak ada gerakan lanjutan.

    Pada kondisi yang diberikan, yaitu ketika sensor PIR mendeteksi gerakan secara berulang sebelum waktu tunda habis dan sensor touch tidak disentuh, maka setiap kali PIR mendeteksi gerakan (output HIGH), mikrokontroler akan terus mengulang atau mereset waktu tunda ke awal. Hal ini menyebabkan proses perhitungan waktu tidak pernah mencapai batas akhir untuk mematikan lampu. Karena sensor touch berada pada kondisi LOW (tidak disentuh), maka tidak ada pengaruh tambahan terhadap sistem, sehingga seluruh kendali hanya bergantung pada sensor PIR. Akibatnya, LED akan tetap berada dalam kondisi menyala karena sistem selalu menganggap masih ada aktivitas atau pergerakan di area tersebut. Dengan demikian, prinsip kerja rangkaian ini memastikan bahwa lampu lorong tetap aktif selama masih terdeteksi adanya gerakan, dan hanya akan mati jika tidak ada gerakan sama sekali hingga waktu tunda benar-benar habis.



    4. Flowchart dan Listing Program [Kembali]


    #include "stm32f1xx_hal.h"


    /* Private variables ---------------------------------------------------------*/

    uint8_t system_enable = 1; // default aktif

    uint8_t touch_last = 0;

    uint8_t pir_first_trigger = 1;


    uint32_t pir_timer = 0;

    #define PIR_DELAY 5000 // 5 detik


    /* Function prototypes -------------------------------------------------------*/

    void SystemClock_Config(void);

    static void MX_GPIO_Init(void);

    void Error_Handler(void);


    /* Main program --------------------------------------------------------------*/

    int main(void)

    {

    HAL_Init();

    SystemClock_Config();

    MX_GPIO_Init();


    while (1)

    {

    // Baca input

    uint8_t pir_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2); // PIR di PA2

    uint8_t touch_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1); // Touch di PA1


    // =============================

    // TOUCH (TOGGLE SYSTEM)

    // =============================

    if (touch_now == GPIO_PIN_SET && touch_last == GPIO_PIN_RESET)

    {

    system_enable = !system_enable;


    // Buzzer indikator saat ON

    if (system_enable)

    {

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);

    HAL_Delay(100);

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);

    }


    HAL_Delay(200); // anti bouncing

    }

    touch_last = touch_now;


    // =============================

    // LOGIKA SISTEM

    // =============================

    if (system_enable)

    {

    // ===== PIR DETEKSI =====

    if (pir_now == GPIO_PIN_SET)

    {

    // Reset timer setiap ada gerakan

    pir_timer = HAL_GetTick();


    // Nyalakan LED

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);


    // Buzzer hanya sekali saat trigger awal

    if (pir_first_trigger)

    {

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);

    HAL_Delay(100);

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);

    pir_first_trigger = 0;

    }

    }

    else

    {

    // ===== TIDAK ADA GERAKAN =====

    if ((HAL_GetTick() - pir_timer) < PIR_DELAY)

    {

    // Masih dalam waktu tunda → LED tetap nyala

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);

    }

    else

    {

    // Waktu habis → LED mati

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);

    pir_first_trigger = 1;

    }

    }

    }

    else

    {

    // ===== SISTEM OFF =====

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);

    }

    }

    }


    /* System Clock Configuration -----------------------------------------------*/

    void SystemClock_Config(void)

    {

    RCC_OscInitTypeDef RCC_OscInitStruct = {0};

    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};


    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

    RCC_OscInitStruct.HSIState = RCC_HSI_ON;

    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;


    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

    Error_Handler();


    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |

    RCC_CLOCKTYPE_SYSCLK |

    RCC_CLOCKTYPE_PCLK1;


    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;


    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

    Error_Handler();

    }


    /* GPIO Initialization -------------------------------------------------------*/

    static void MX_GPIO_Init(void)

    {

    GPIO_InitTypeDef GPIO_InitStruct = {0};


    __HAL_RCC_GPIOA_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();


    // ===== INPUT =====

    // PA1 = Touch, PA2 = PIR

    GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2;

    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


    // ===== OUTPUT =====

    // PB0 = LED, PB1 = Buzzer

    GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    // Kondisi awal OFF

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);

    }


    /* Error Handler -------------------------------------------------------------*/

    void Error_Handler(void)

    {

    __disable_irq();

    while (1)

    {

    }

    }


    #ifdef USE_FULL_ASSERT

    void assert_failed(uint8_t *file, uint32_t line)

    {

    }

    #endif



    5. Video Demo [Kembali]




    6. Analisa [Kembali]










    7. Download File [Kembali]


    Komentar

    Postingan populer dari blog ini

    Elektro