Percobaan 1 Kondisi 7
1. Prosedur [kembali]
1. Jalankan
software Proteus, kemudian susun rangkaian komponen sesuai dengan diagram yang
terdapat pada modul.
2. Buka
STM32CubeIDE, lalu lakukan pengaturan pin pada mikrokontroler untuk menentukan
fungsi sebagai GPIO input maupun GPIO output.
3. Masukkan
kode program ke dalam STM32CubeIDE, kemudian lakukan proses build untuk
menghasilkan file berekstensi .hex.
4. Impor
file .hex tersebut ke dalam library mikrokontroler STM32F103C8 yang
digunakan pada Proteus.
5. Jalankan
simulasi rangkaian untuk melihat hasil dari program yang telah dibuat.
2. Hardware dan Diagram Blok [kembali]
A. Hardware
a) STM32F103C8T6
b) HeartBeat Sensor
c) Push Button
d) LED
e) Buzzer
f) Resistor
g) Breadboard
B. Diagram Blok
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
Prinsip Kerja
Program ini dirancang agar ketika sensor heartbeat mendeteksi nilai BPM lebih dari 60, mikrokontroler STM32F103C8T6 akan memproses sinyal dari sensor melalui ADC dan melakukan penyaringan data menggunakan metode moving average agar pembacaan lebih stabil. Jika nilai pembacaan melebihi threshold yang telah ditentukan sebagai indikasi BPM >60, maka LED kuning akan menyala dan buzzer berbunyi sebagai tanda bahwa denyut jantung berada di atas 60 BPM.
4. Flowchart dan Listing Program [kembali]
Flowchart:
Listing Program:
#include
"stm32f1xx_hal.h"
/*
================= HANDLE ================= */
ADC_HandleTypeDef
hadc1;
/*
================= VARIABLE ================= */
uint32_t adcValue
= 0;
uint32_t
filteredValue = 0;
uint32_t
lastPulseTime = 0;
/*
================= FILTER ================= */
#define
FILTER_SIZE 10
uint16_t
buffer[FILTER_SIZE] = {0};
uint8_t indexBuf =
0;
/*
================= THRESHOLD ================= */
#define THRESHOLD
1000
/* WAKTU LED &
BUZZER MENYALA */
#define
PULSE_TIMEOUT 1000
/*
================= FILTER 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;
}
/*
================= PROTOTYPE ================= */
void
SystemClock_Config(void);
void
MX_GPIO_Init(void);
void
MX_ADC1_Init(void);
void
LED_Kuning(void);
void
LED_Mati(void);
void
Buzzer_On(void);
void
Buzzer_Off(void);
/*
================= LED ================= */
void
LED_Kuning(void)
{
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_0 | GPIO_PIN_1 |
GPIO_PIN_10,
GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_1,
GPIO_PIN_SET);
}
void
LED_Mati(void)
{
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_0 | GPIO_PIN_1 |
GPIO_PIN_10,
GPIO_PIN_RESET);
}
/*
================= BUZZER ================= */
void
Buzzer_On(void)
{
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_11,
GPIO_PIN_SET);
}
void
Buzzer_Off(void)
{
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_11,
GPIO_PIN_RESET);
}
/*
================= 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);
HAL_ADC_Stop(&hadc1);
/* ===== FILTER ADC ===== */
filteredValue = moving_average(adcValue);
if (filteredValue > THRESHOLD)
{
lastPulseTime = HAL_GetTick();
}
if ((HAL_GetTick() - lastPulseTime) <
PULSE_TIMEOUT)
{
LED_Kuning();
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_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);
}
/*
================= ADC ================= */
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_71CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1,
&sConfig);
}
/*
================= GPIO ================= */
void
MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* PA0 = ADC */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* PB0 PB1 PB10 PB11 */
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);
}
5. Video Demo [kembali]
Pada Laporan Akhir
6. Kondisi [kembali]
Percobaan 1 Kondisi 7
Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi sensor heartbeat membaca BPM >60 dan LED menyala warna kuning serta buzzer berbunyi
7. Video Simulasi [kembali]
8. Download File [kembali]
Rangkaian Proteus [Download]
Program [Download]
Vidio [Klik]
Datasheet STM32F103C8T6 [Download]
Datasheet HeartBeat Sensor [Download]
Datasheet Push Button [Download]
Datasheet LED [Download]
Datasheet Buzzer [Download]
Datasheet Resistor [Download]
Datasheet Breadboard [Download]
HTML [Download]
Comments
Post a Comment