Laporan Akhir 1



DAFTAR ISI
1. Prosedur
2. Hardware dan diagram blok
3. Rangkaian Simulasi dan prinsip kerja
4. Flowchart dan Listing Program
5. Video demo
6. Kondisi
7. Video Simulasi
8. Download File
  • 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 dan Diagram Blok[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]


    • Saat sistem menyala, mode awal adalah mode otomatis.
    • Sistem terus membaca touch sensor dan PIR sensor.
    • Jika touch sensor disentuh, sistem berpindah mode:
      • Dari otomatis → mode manual
      • Dari manual → kembali ke mode otomatis.
    • Pada mode manual:
      • Lampu menyala terus.
      • Buzzer berbunyi.
    • Pada mode otomatis:
      • Jika PIR mendeteksi gerakan, lampu menyala dan buzzer berbunyi sebentar (hanya saat deteksi pertama).
      • Jika tidak ada gerakan, lampu mati.
    • Jika touch sensor disentuh lagi saat mode manual, sistem kembali ke mode otomatis dan buzzer berhenti.
    • 4. Flowchart dan Listing Program[Kembali]
    • Flowchart



    • Listing Program
    #include "stm32f1xx_hal.h"

    uint8_t manual_mode = 0;       // 0 = otomatis, 1 = manual
    uint8_t touch_last = 0;
    uint8_t pir_first_trigger = 1;

    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    void Error_Handler(void);

    int main(void)
    {
        HAL_Init();
        SystemClock_Config();
        MX_GPIO_Init();

        while (1)
        {
            uint8_t pir_now   = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
            uint8_t touch_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);

            // DETEKSI SENTUH TOUCH SENSOR
            if (touch_now == GPIO_PIN_SET && touch_last == GPIO_PIN_RESET)
            {
                manual_mode = !manual_mode;   // toggle mode

                if (manual_mode) // MASUK MODE MANUAL
                {
                    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // lampu ON
                    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // buzzer bunyi
                }
                else // KEMBALI KE MODE OTOMATIS
                {
                    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // buzzer mati
                    pir_first_trigger = 1; // reset PIR
                }

                HAL_Delay(200); // debounce
            }

            touch_last = touch_now;

            // MODE OTOMATIS
            if (!manual_mode)
            {
                if (pir_now == GPIO_PIN_SET)
                {
                    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);

                    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
                {
                    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
                    pir_first_trigger = 1;
                }
            }

            // MODE MANUAL
            if (manual_mode)
            {
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // lampu tetap ON
            }
        }
    }

    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();
    }

    static void MX_GPIO_Init(void)
    {
        GPIO_InitTypeDef GPIO_InitStruct = {0};

        __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();

        GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        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);

        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);
    }

    void Error_Handler(void)
    {
        __disable_irq();
        while(1)
        {
        }
    }

    5. Video Demo[Kembali]

    6. Kondisi[Kembali]

    Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi ketika sensor touch disentuh kembali setelah mode manual aktif, maka sistem kembali ke mode otomatis, buzzer berhenti berbunyi, dan sensor PIR kembali aktif mendeteksi gerakan.

    8. Download File[Kembali]

    Rangkaian Simulasi [Klik]

Komentar

Postingan populer dari blog ini