Langkah-langkah percobaan :
a. Tentukan percobaan dan kondisi yang akan dilakukan (Kondisi 6)
b. Siapakan alat dan bahan yang akan digunakan
c.
Rangkai Rangkaian pada Board sesuai gambar percobaan kondisi 6 dengan komponen 1 input push button, 1 sensor infrared STM32F103C8, 3 Resistor 220 Ohm, 1 Output LED-RGB dam 1 Buzzer hubungkan menggunakan jumper.
d. Buatlah program pada software STM32Cube IDE dengan konfigurasi Pin Input dan Output berdasarkan
pada Pin GPIO STM32 yang telah dirangkai sebelumnya.
e. Kemudian, buatlah program untuk menghasilkan Output LED-RGB dan Buzzer sesuai kondisi yang telah ditentukan.
f. Hubungkan Laptop dengan STM32F103C8 dengan STlink
g. Run Program, dan lihat output yang dihasilkan ketika push button ditekan
A. Hardware 1. STM32F103C8
2. Push Button
3. LED-RGB
6. Laptop
B. Software
1. STM32Cube IDE
C. Blok Diagram
3. Rangkaian Simulasi dan Prinsip Kerja [kembali] A. Rangkaian Simulasi
B. Rangkaian Percobaan

C. Prinsip Kerja
Rangkaian ini terdiri dari beberapa komponen, yakni mikrokontroler STM32F103C8, sensor infrared, buzzer, led-rgb, jumper, push button dan resistor 220 ohm. Pada rangkaian, yang menjadi inputan berupa sensor infrared dan push button sementara buzzer dan led-rgb menjadi outputnya. Pada rangkaian sensor infrared yang memiliki 3 kaki yang perlu terhubung dengan dengan sumber daya (3,3V), ground dan output data berupa apakah terdeteksi objek (logika 1) atau tidak. Lalu inputan kedua berupa push button yang ketika ditekan memberi logika 1. Lalu dari inputan yang terhubung oleh jumper dihubungkan dengan mikrokontroler dengan memperhatikan port berapa saja yang terhubung agar dapat di deklarasikan oleh program nantinya. Sesuai kondisi yang diinginkan, output yang diharapkan yakni:
- Jika Infrared aktif (mendeteksi objek), maka led akan berwarna hijau diiringi dengan buzzer berbunyi.
- Jika Button ditekan (logika 1), maka led akan berwarna merah diiringi dengan bunyi buzzer.
- Jika kedua inpuitan dalam kondisi aktif, maka led-rgb akan berwarna jingga/kuning dengan iringan bunyi buzzer.
Rangkaian dihubungkan pada board, setelah itu lanjut ke Program. Dimana program ini dibuat pada software STM32Cube IDE. Program ini menggunakan bahasa Python sebagai berikut:
-
Inisialisasi Sistem:
-
HAL_Init();
→ Inisialisasi hardware abstraction layer.
-
SystemClock_Config();
→ Konfigurasi clock sistem menggunakan HSI (High-Speed Internal).
-
MX_GPIO_Init();
→ Inisialisasi GPIO.
-
Loop utama (while (1)
):
-
Membaca status tombol dan sensor IR:
uint8_t button_status = HAL_GPIO_ReadPin(GPIOB, BUTTON_Pin);
uint8_t ir_status = HAL_GPIO_ReadPin(GPIOB, IR_Pin);
-
Reset output GPIO (LED & Buzzer):
HAL_GPIO_WritePin(GPIOA, GREEN_Pin | RED_Pin | BUZZER_Pin, GPIO_PIN_RESET);
-
Jika tombol ditekan (BUTTON_Pin
bernilai GPIO_PIN_SET
):
if (button_status == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
}
→ LED merah menyala dan buzzer berbunyi.
-
Jika sensor IR mendeteksi sesuatu (IR_Pin
bernilai 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);
}
→ LED hijau menyala dan buzzer berbunyi.
-
Delay 100ms untuk debounce tombol/sensor.
-
Konfigurasi Clock (SystemClock_Config()
):
-
Menggunakan HSI (High-Speed Internal) 16MHz sebagai sumber clock.
-
Tidak menggunakan PLL.
-
Mengatur pembagian clock untuk AHB, APB1, dan APB2.
-
Inisialisasi GPIO (MX_GPIO_Init()
):
-
Error Handler (Error_Handler()
):
Peningkatan & Perbaikan yang Bisa Dilakukan
-
Tambahkan debounce
untuk tombol
if (button_status == GPIO_PIN_SET)
{
HAL_Delay(50); // Delay debounce
if (HAL_GPIO_ReadPin(GPIOB, BUTTON_Pin) == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
}
}
-
Gunakan else if
untuk menghindari kondisi tumpang tindih
if (button_status == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
}
else if (ir_status == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOA, GREEN_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
}
-
Matikan buzzer jika tidak ada input
else
{
HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_RESET);
}
Setelah program selesai dibuat, hubungkan Laptop dengan STM32F103C8, Lanjut ke simulasi, dimana:
- STM32F103C8 terhubung dengan 1 LED-RGB, Buzzer, push button dan sensor infrared.
- Saat sebuah tombol ditekan, LED yang sesuai menyala.
- Saat tombol dilepas, LED akan mati kembali.
- Output pada terminal menunjukkan tombol mana yang ditekan.
A. Flowchart
B. 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)
{
}