Percobaan 1 Kondisi 9

 



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 logic state berlogika 1.

  • Salah satu sensor ketika berlogika 1, maka akan diteruskan ke STM32F103C8 sebagai input PA0 (PIR) dan PA1 (Touch).

  • Setelah itu keluarannya dari PB0 dan PB1 akan mengontrol status LED dan Buzzer berdasarkan mode yang sedang aktif.

  • Pada Touch sensor, mode sistem akan berganti setiap menerima berlogika 1. Ketika disentuh kembali setelah mode manual aktif, maka sistem kembali ke mode otomatis, keluaran buzzer berhenti berbunyi, dan sensor PIR kembali aktif mendeteksi gerakan.

  • Pada PIR sensor (saat mode otomatis), output LED akan ON dan OFF setiap pergantian logika 1 dengan 0, sedangkan output Buzzer hanya akan ON sesaat pada deteksi gerakan pertama.


4. Flowchart [Kembali]

  • Flowchart

  • Listing Program
#include "stm32f1xx_hal.h"

uint8_t system_enable = 0;
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);

        // --- LOGIKA SENSOR TOUCH ---
        if (touch_now == GPIO_PIN_SET && touch_last == GPIO_PIN_RESET)
        {
            system_enable = !system_enable;
            if (system_enable)
            {
                // Masuk Mode Manual
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
                HAL_Delay(100);
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
            }
            else 
            {
                // [MODIFIKASI] Kembali ke Mode Otomatis
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // Buzzer dipastikan berhenti berbunyi
                pir_first_trigger = 1; // Sensor PIR disiapkan kembali
            }
            HAL_Delay(200);
        }
        touch_last = touch_now;

        // --- LOGIKA SENSOR PIR (Hanya aktif jika tidak di Mode Manual) ---
        if (!system_enable) 
        {
            if (pir_now == GPIO_PIN_SET)
            {
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // Lampu menyala karena gerakan
                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
            {
                pir_first_trigger = 1;
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // Lampu mati jika tidak ada gerakan
            }
        }

        // --- LOGIKA MODE MANUAL ---
        if(system_enable)
        {
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // Lampu dipaksa menyala terus
        }
    }
}

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]

M1 P1 K9: 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.

7. Video Simulasi [Kembali]






8. Download File [Kembali]

Rangkaian Simulasi [Klik]

Video Simulasi [Klik]


Kembali ke Halaman Atas







Komentar

Postingan populer dari blog ini