Percobaan 1 Kondisi 9

 

Tugas Pendahuluan 1

 [KEMBALI KE MENU SEBELUMNYA]



PERCOBAAN 1 KONDISI 9

1. Prosedur[Kembali]

  • Buatlah rangkaian seperti pada percobaan pada Proteus 
  • Buat program untuk STM32F103C8 pada STM32CUBEIDE, dan sesuaikan konfigurasinya
  • Masukkan Program tersebut kedalam STM32F103C8
  • Simulasikan rangkaian

2. Hardware dan Diagram Blok[Kembali]

1. STM32F103C8 (Bluepill)


2. LED

3. Resistor



4. PushButton



5. Touch Sensor 


6. Sensor PIR
7. Buzzer
 

3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]

Rangkaian Simulasi: 



Prinsip Kerja:

Rangkaian bekerja dengan mengintegrasikan sensor PIR dan touch sensor sebagai pengendali utama lampu lorong (LED) dan buzzer. Pada mode otomatis, sensor PIR akan mendeteksi radiasi inframerah dari gerakan manusia di area lorong; jika terdeteksi gerakan, mikrokontroler akan mengaktifkan LED dan buzzer secara otomatis. Namun, sistem ini memiliki fitur override melalui touch sensor yang berfungsi sebagai sakelar mode. Ketika touch sensor disentuh, sistem akan berpindah ke mode manual di mana LED dan buzzer dipaksa menyala terus-menerus tanpa memedulikan sensor PIR. Untuk mengembalikan ke mode otomatis, pengguna cukup menyentuh kembali touch sensor tersebut, sehingga buzzer berhenti berbunyi dan sistem kembali bergantung pada deteksi gerakan dari sensor PIR.

4. Flowchart dan Listing Program[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);

        if (touch_now == GPIO_PIN_SET && touch_last == GPIO_PIN_RESET)
        {
            system_enable = !system_enable;
            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);
        }
        touch_last = touch_now;

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

        if (system_enable)
        {
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
        }
    }
}

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.

6. Video Simulasi[Kembali]




7. Download File[Kembali]

Rangkaian Proteus [download]
Video Demo [download]
Video simulasi [download]
Datasheet STM32F103C8 [Download]
Datasheet TouchSensor [Download]
Datasheet Resistor [Download]
Datasheet LED [Download]












Komentar

Postingan populer dari blog ini

Tugas Besar

12-3

12-4