Laporan Akhir Percobaan 6

 




 1. Prosedur  [kembali]

  1. 1. Persiapan Alat dan Bahan
  • STM32F103C8T6

  • 1 buah Infra Red Sensor

  • 2 buah push button

  • 1 buah Buzzer

  • 1 buah LED RGB

  • 4 buah Resistor

  • Kabel jumper

  • Aplikasi Proteus 8.17


  1. 2. Perakitan Rangkaian

Inisialisasi Sistem:

  • Atur semua pin GPIO sesuai fungsinya:

    • PA0 dan PA1 sebagai input

    • PB0, PB1, PB10 sebagai output

Kondisi Awal:

  • Tidak ada objek terdeteksi → IR OUT = HIGH

  • Push button tidak ditekan → PA1 = HIGH (karena konfigurasi pull-up)

Pengujian Sensor IR:

  • Letakkan objek di depan sensor IR

  • Jika objek terdeteksi → IR OUT menjadi LOW

    • MCU membaca kondisi ini pada PA0

    • Aktifkan LED merah (PB0 = HIGH)

    • Aktifkan buzzer (PB10 = HIGH)

Pengujian Push Button:

  • Tekan tombol

  • Pin PA1 akan membaca LOW

    • MCU mendeteksi tombol ditekan

    • Aktifkan LED biru (PB1 = HIGH)

    • Aktifkan buzzer (PB10 = HIGH)

Kondisi Gabungan:

  • Jika keduanya aktif (sensor mendeteksi dan tombol ditekan)

    • LED merah dan biru bisa dinyalakan bersamaan (tergantung implementasi)

    • Buzzer tetap aktif

Jika tidak ada input:

  • Semua LED dan buzzer mati

2. Hardware dan Diagram Blok [kembali]


 2.1 Daftar Komponen

 
  • 1 × Mikrokontroler STM32F103C8T6

Otak utama sistem, memproses input dari sensor dan tombol lalu mengontrol output (LED dan buzzer).
Gambar STM32F103C8T6

Spesifikasi Mikrokontroler STM32F103C8T6

  • 1 × Buzzer (aktif atau pasif — rekomendasi: buzzer aktif 3.3V)

Gambar Buzzer


  • 1 × Sensor IR Obstacle

Mendeteksi objek di depan sensor, memberikan sinyal logika (LOW saat objek terdeteksi).
Gambar IR Sensor


  • 2 × Push button (tact switch)

Digunakan sebagai input manual dari pengguna.
Gambar Push Button (tact Switch)

  • LED RGB (Common Cathode) 

Menampilkan warna berdasarkan kondisi input.


  • Resistor (R1, R2, R3, R4)

Pembatas arus untuk LED dan tombol, mencegah kerusakan komponen.


  • Kabel Jumper

Gambar Kabel Jumper


2.2 Diagram Blok




3. Rangkaian Simulasi dan Prinsip Kerja [kembali]

3.1 Rangkaian Simulasi


Gambar Rangkaian Percobaan 6

3.2 Prinsip Kerja

Prinsip kerja rangkaian ini adalah sebagai sistem pendeteksi sederhana dengan dua input utama, yaitu sensor inframerah (IR Sensor) dan push button, serta dua output berupa LED RGB dan buzzer. Saat IR sensor mendeteksi adanya objek di depannya, sensor akan memberikan sinyal ke mikrokontroler STM32F103C8. Mikrokontroler kemudian memproses sinyal tersebut dan mengaktifkan LED RGB pada warna merah sekaligus menyalakan buzzer sebagai tanda alarm. Jika push button ditekan, mikrokontroler juga akan menerima sinyal input, lalu mengaktifkan LED RGB pada warna biru dan menyalakan buzzer. Apabila kedua input aktif secara bersamaan, maka LED RGB akan menampilkan kombinasi merah dan biru (ungu), serta buzzer tetap menyala. Dengan demikian, buzzer akan selalu aktif jika salah satu atau kedua input terpicu, sedangkan warna LED RGB menjadi indikator sumber input yang sedang aktif.



4. Flowchart dan Listing Program [kembali]
    
4.1 Flow Chart


4.2 Listing Program

Listing Program

#include "main.h" 
 void SystemClock_Config(void); 
 static void MX_GPIO_Init(void); 

 int main(void) 
 { 
 HAL_Init(); 
 SystemClock_Config(); 
 MX_GPIO_Init(); 
 while (1) 
{
uint8_t button_status = HAL_GPIO_ReadPin(GPIOB, BUTTON_Pin); 
 uint8_t ir_status = HAL_GPIO_ReadPin(GPIOB, IR_Pin); 

 HAL_GPIO_WritePin(GPIOA, GREEN_Pin | RED_Pin | BUZZER_Pin, GPIO_PIN_RESET); 

 if (button_status == GPIO_PIN_SET) 
 { 
 HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_SET); 
 HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET); 
 } 
 if (ir_status == GPIO_PIN_SET) 
 { 
 HAL_GPIO_WritePin(GPIOA, GREEN_Pin, GPIO_PIN_SET); 
 HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET); 
 } 
 HAL_Delay(100); 
 } 
 }
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_CLOCKTYPE_PCLK2; 
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; 
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; 
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; 
RCC_ClkInitStruct.APB2CLKDivider = 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_GPIOD_CLK_ENABLE(); 
  HAL_RCC_GPIOA_CLK_ENABLE(); 
  HAL_RCC_GPIOB_CLK_ENABLE(); 
 
HAL_GPIO_WritePin(GPIOA, RED_Pin|GREEN_Pin|BUZZER_Pin, GPIO_PIN_RESET); 
HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, GPIO_PIN_RESET); 
 
GPIO_InitStruct.Pin = RED_Pin|GREEN_Pin|BUZZER_Pin; 
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 
GPIO_InitStruct.Pull = GPIO_NOPULL; 
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; 
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 

GPIO_InitStruct.Pin = BLUE_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(BLUE_GPIO_Port, &GPIO_InitStruct); GPIO_InitStruct.Pin = BUTTON_Pin|IR_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); 
 } 
 void Error_Handler(void) 
 { disable_irq(); 
 while (1) 
 { 
 }
 #ifdef USE_FULL_ASSERT 
 void assert_failed(uint8_t *file, uint32_t line) 
 { 
 } 
 #endif 


Penjelasan listing program:

#include "main.h" 
  • Meng-include file main.h yang berisi deklarasi pin (RED_Pin, GREEN_Pin, BUTTON_Pin, dll), fungsi, dan konfigurasi project dari CubeMX.


void SystemClock_Config(void); 
static void MX_GPIO_Init(void); 
  • Deklarasi fungsi SystemClock_Config() untuk mengatur clock sistem.
  • Deklarasi fungsi MX_GPIO_Init() untuk inisialisasi pin GPIO.

int main(void) 
    HAL_Init(); 
  • Inisialisasi library HAL (Hardware Abstraction Layer). Ini mengatur SysTick timer, NVIC, dan hal dasar lain.
 
   SystemClock_Config(); 
  • Memanggil fungsi konfigurasi clock agar mikrokontroler menggunakan sumber clock yang ditentukan (HSI = internal oscillator 8 MHz).

    MX_GPIO_Init(); 
  • Memanggil fungsi inisialisasi GPIO (mengatur pin input/output sesuai kebutuhan).

    while (1) 
    {
  • Program utama berjalan dalam loop tak terbatas (while(1)).

        uint8_t button_status = HAL_GPIO_ReadPin(GPIOB, BUTTON_Pin); 
        uint8_t ir_status = HAL_GPIO_ReadPin(GPIOB, IR_Pin); 
  • Membaca status tombol (BUTTON_Pin) dan sensor IR (IR_Pin) pada port GPIOB.
  • Hasil pembacaan berupa GPIO_PIN_RESET (0) atau GPIO_PIN_SET (1).

        HAL_GPIO_WritePin(GPIOA, GREEN_Pin | RED_Pin | BUZZER_Pin, GPIO_PIN_RESET); 
  • Mematikan (reset/low) semua output: LED hijau, LED merah, dan buzzer setiap kali loop dimulai.
  • Fungsinya agar hanya kondisi yang aktif ditampilkan sesuai input.

        if (button_status == GPIO_PIN_SET) 
        { 
            HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_SET); 
            HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET); 
        } 
  • Jika tombol ditekan (high), maka LED merah dan buzzer dinyalakan.

        if (ir_status == GPIO_PIN_SET) 
        { 
            HAL_GPIO_WritePin(GPIOA, GREEN_Pin, GPIO_PIN_SET); 
            HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET); 
        } 
  • Jika sensor IR aktif (high), maka LED hijau dan buzzer dinyalakan.

        HAL_Delay(100); 
    } 
  • Delay 100 ms tiap loop untuk stabilisasi pembacaan input dan mengurangi konsumsi CPU.

void SystemClock_Config(void) 
    RCC_OscInitTypeDef RCC_OscInitStruct = {0}; 
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; 
  • Membuat struktur konfigurasi oscillator dan clock.

    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; 
  • Menggunakan HSI (High Speed Internal) oscillator (8 MHz bawaan STM32).
  • Tidak memakai PLL (jadi clock tidak dimultiplikasi).

    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) 
    { 
        Error_Handler(); 
    } 
  • Jika konfigurasi oscillator gagal, masuk ke Error_Handler().

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK 
                                |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; 
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; 
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; 
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; 
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; 
  • Mengatur semua clock (HCLK, SYSCLK, PCLK1, PCLK2) menggunakan HSI langsung tanpa pembagi.

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) 
    { 
        Error_Handler(); 
    } 
  • Mengaktifkan konfigurasi clock. Jika gagal, masuk ke Error_Handler().


static void MX_GPIO_Init(void) 
    GPIO_InitTypeDef GPIO_InitStruct = {0}; 
  • Membuat struktur konfigurasi GPIO.

    HAL_RCC_GPIOD_CLK_ENABLE(); 
    HAL_RCC_GPIOA_CLK_ENABLE(); 
    HAL_RCC_GPIOB_CLK_ENABLE(); 
  • Mengaktifkan clock untuk port D, A, dan B.

    HAL_GPIO_WritePin(GPIOA, RED_Pin|GREEN_Pin|BUZZER_Pin, GPIO_PIN_RESET); 
    HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, GPIO_PIN_RESET); 
  • Menginisialisasi semua output awal (LED merah, hijau, biru, buzzer) dalam keadaan mati.

    GPIO_InitStruct.Pin = RED_Pin|GREEN_Pin|BUZZER_Pin; 
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 
    GPIO_InitStruct.Pull = GPIO_NOPULL; 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; 
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 
  • Mengatur pin RED, GREEN, BUZZER pada port A sebagai output push-pull, tanpa pull-up/pull-down, dengan kecepatan rendah.

    GPIO_InitStruct.Pin = BLUE_Pin; 
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 
    GPIO_InitStruct.Pull = GPIO_NOPULL; 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; 
    HAL_GPIO_Init(BLUE_GPIO_Port, &GPIO_InitStruct); 
  • Mengatur pin BLUE sebagai output juga.

    GPIO_InitStruct.Pin = BUTTON_Pin|IR_Pin; 
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT; 
    GPIO_InitStruct.Pull = GPIO_NOPULL; 
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); 
  • Mengatur BUTTON dan IR sebagai input, tanpa pull-up/pull-down.

void Error_Handler(void) 
    disable_irq(); 
    while (1) 
    { 
    } 
  • Jika terjadi error (misalnya konfigurasi clock gagal), sistem masuk ke infinite loop setelah mematikan interupsi.

#ifdef USE_FULL_ASSERT 
void assert_failed(uint8_t *file, uint32_t line) 
#endif 
  • Fungsi debug tambahan. Jika assert_param gagal, fungsi ini dipanggil. Biasanya dipakai hanya saat development.





5. Video Demo [kembali]





6. Kondisi [kembali]
    
Buatlah rangkaian seperti gambar pada percobaan 6 dimana jika IR Sensor mendeteksi, maka LED RGB akan menampilkan warna merah, dan jika push button ditekan LED RGB akan menampilkan warna biru. Jika salah satu input aktif atau keduanya aktif maka buzzer aktif.


7. Video Simulasi [kembali]   






8. Download File  [kembali]
   
   Download rangkaian simulasi [link]
    Download Video simulasi [link]
    Download Video Demo [link]
    Download datasheet STM32F103C8T6  [link]
    Download datasheet Buzzer [link]
    Download datasheet Push Button [link]
   

Comments

Popular posts from this blog