Tugas Pendahuluan Modul 2 Percobaan 1 kondisi 4
Tugas Pendahuluan Modul 2 Percobaan 1 kondisi 4
1. Prosedur (kembali)
2. Hardware (kembali)
● ST-LINK
ST-LINK adalah alat programmer dan debugger yang digunakan untuk menghubungkan komputer dengan mikrokontroler seri STM32. ST-LINK berfungsi untuk mengunggah program, melakukan debugging, serta memantau jalannya sistem pada STM32 melalui antarmuka seperti SWD (Serial Wire Debug) atau JTAG. Dengan bantuan software seperti STM32CubeIDE, pengguna dapat mengembangkan, menguji, dan memperbaiki program secara langsung pada board STM32 dengan lebih mudah dan efisien.
● STM32F103C8
STM32F103C8T6 adalah mikrokontroler berbasis ARM Cortex-M3 yang sering digunakan dalam sistem embedded, robotika, IoT, dan kontrol elektronik. Board ini memiliki kecepatan hingga 72 MHz, memori Flash 64 KB, serta berbagai pin input/output yang mendukung komunikasi seperti UART, SPI, I2C, PWM, dan ADC. STM32F103C8T6 banyak dipilih karena performanya cukup tinggi, hemat daya, serta mudah diprogram menggunakan software seperti STM32CubeIDE dengan bantuan ST-LINK sebagai alat upload program dan debugging.
●Push Button
● HeartBeat Sensor
● Breadboard
● Diagram Blok
3. Rangkaian Simulasi dan Prinsip Kerja (kembali)
Percobaan 1 pada modul ini berfokus pada pembuatan sistem Heart Rate Indikator menggunakan mikrokontroler STM32F103C8, di mana sistem membaca sinyal analog dari sensor detak jantung melalui pin ADC untuk kemudian diolah menggunakan metode moving average filter agar data lebih stabil. Hasil pembacaan tersebut diklasifikasikan ke dalam tiga kondisi (Normal, Waspada, dan Bahaya) yang ditandai dengan nyala LED RGB—menggantikan tiga LED tunggal—di mana kombinasi warna atau intensitas cahaya tertentu diatur melalui logika program, sementara Buzzer akan aktif sebagai peringatan suara pada kondisi tertentu. Selain itu, sistem ini menerapkan fitur Interrupt pada komponen tombol (Push Button) yang berfungsi sebagai kendali darurat untuk mematikan seluruh indikator secara instan tanpa mengganggu proses pembacaan sensor utama.
4. Flowchart dan Listing Program (kembali)
Kode STM32-IDE:
#include "main.h"
/* ================= HANDLE ================= */
ADC_HandleTypeDef hadc1;
/* ================= VARIABLE ================= */
uint32_t adcValue = 0;
uint32_t filteredValue = 0;
uint32_t baseline = 0;
uint8_t beatDetected = 0;
uint32_t BPM = 0;
uint32_t lastBeatTime = 0;
uint32_t interval = 0;
/* ================= FILTER ================= */
#define FILTER_SIZE 10
uint16_t buffer[FILTER_SIZE];
uint8_t indexBuf = 0;
/* ================= FUNCTION ================= */
uint16_t moving_average(uint16_t val)
{
buffer[indexBuf++] = val;
if(indexBuf >= FILTER_SIZE) indexBuf = 0;
uint32_t sum = 0;
for(int i=0;i<FILTER_SIZE;i++) sum += buffer[i];
return sum / FILTER_SIZE;
}
/* ================= RGB LED ================= */
void LED_Mati() {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10, GPIO_PIN_RESET);
}
void LED_Biru() {
LED_Mati();
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
}
void LED_Hijau() {
LED_Mati();
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
}
void LED_Merah() {
LED_Mati();
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
}
/* ================= BUZZER ================= */
void Buzzer_On() {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET);
}
void Buzzer_Off() {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET);
}
/* ================= PROTOTYPE ================= */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
/* ================= MAIN ================= */
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
while (1)
{
/* ==== BACA ADC ==== */
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
adcValue = HAL_ADC_GetValue(&hadc1);
/* ==== FILTER ==== */
filteredValue = moving_average(adcValue);
/* ==== BASELINE ==== */
baseline = (baseline * 9 + filteredValue) / 10;
uint32_t threshold = baseline + 50;
/* ==== DETEKSI DETAK ==== */
if(filteredValue > threshold && beatDetected == 0)
{
beatDetected = 1;
uint32_t now = HAL_GetTick();
if(lastBeatTime != 0)
{
interval = now - lastBeatTime;
BPM = 60000 / interval;
}
lastBeatTime = now;
}
if(filteredValue < threshold)
{
beatDetected = 0;
}
/* ==== TIMEOUT ==== */
if(HAL_GetTick() - lastBeatTime > 2000)
{
BPM = 0;
}
/* ==== OUTPUT RGB ==== */
if(BPM > 0)
{
if(BPM < 60)
{
LED_Biru();
Buzzer_Off();
}
else if(BPM <= 100)
{
LED_Hijau();
Buzzer_Off();
}
else
{
LED_Merah();
Buzzer_On();
}
}
else
{
LED_Mati();
Buzzer_Off();
}
HAL_Delay(5);
}
}
/* ================= CLOCK ================= */
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
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;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
}
/* ================= ADC ================= */
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
__HAL_RCC_ADC1_CLK_ENABLE();
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc1);
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
/* ================= GPIO ================= */
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/* OUTPUT RGB + BUZZER */
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 | GPIO_PIN_11;
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_10 | GPIO_PIN_11, GPIO_PIN_RESET);
}
/* ================= ERROR ================= */
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
5. Video Demo (kembali)
6. Kondisi (kembali)
7. Video Simulasi (kembali)
8. Download File (kembali)



Komentar
Posting Komentar