LA 1 M2



1. Prosedur [kembali]

  1. Menyiapkan alat dan bahan.
  2. Merangkai komponen pada breadboard sesuai dengan gambar rangkaian percobaan.
  3. Menghubungkan masing masing pin input output.
  4. Mengunggah program menggunakan ST-LINK ke mikrokontroler.
  5. Jalankan Rangkaian

2. Hardware dan Diagram Blok [kembali]

  • STM32F103C8T6 
  • HeartBeat Sensor 
  • Push Button 
  • LED 
  • Buzzer  
  • Resistor 
  • Breadboard 

3. Rangkaian Simulasi dan Prinsip Kerja [kembali]




Rangkaian pada gambar tersebut berfungsi sebagai alat pendeteksi detak jantung yang memanfaatkan sensor heartbeat, mikrokontroler STM32, LED, dan buzzer sebagai indikator keluaran. Cara kerja sistem diawali ketika sensor heartbeat mendeteksi perubahan aliran darah pada ujung jari pengguna. Sensor bekerja menggunakan metode photoplethysmography, yaitu teknik pembacaan perubahan intensitas cahaya yang dipengaruhi oleh perubahan volume darah saat jantung berdetak. Hasil pembacaan tersebut kemudian diubah menjadi sinyal tegangan analog oleh sensor.

Sinyal analog yang dihasilkan sensor selanjutnya diteruskan ke rangkaian yang dilengkapi potensiometer (RV1). Potensiometer ini berfungsi untuk mengatur tingkat sensitivitas pembacaan agar sinyal yang diterima menjadi lebih stabil dan mudah diproses. Setelah melewati tahap pengaturan sensitivitas, sinyal analog masuk ke pin ADC pada mikrokontroler STM32. ADC pada mikrokontroler bertugas mengonversi sinyal analog menjadi data digital sehingga dapat diproses oleh sistem.

Mikrokontroler kemudian mengolah data tersebut untuk mengenali pola denyut jantung. Saat sistem mendeteksi adanya detakan, mikrokontroler akan menghasilkan sinyal logika HIGH atau LOW pada pin output tertentu. Sinyal keluaran ini digunakan untuk mengendalikan LED dan buzzer sebagai indikator.

LED yang terhubung melalui resistor R1, R2, dan R3 digunakan sebagai indikator visual detak jantung. Resistor pada rangkaian berfungsi membatasi arus agar LED tetap aman dan tidak mengalami kerusakan. Pada kondisi kerja yang diinginkan, LED hijau akan berkedip mengikuti irama denyut jantung yang terbaca oleh sensor. Selain itu, buzzer juga akan menghasilkan bunyi sesuai pola detak yang terdeteksi, sehingga pengguna dapat mengetahui denyut jantung melalui indikator suara maupun cahaya.


4. Flowchart dan Listing Program [kembali]




#include "stm32f1xx_hal.h"

/* ======================= HANDLE ADC ======================= */
ADC_HandleTypeDef hadc1;

/* ======================= VARIABEL GLOBAL ======================= */
uint32_t nilai_adc = 0;
uint32_t data_stabil = 0;
uint32_t bpm_hasil = 0;

uint32_t waktu_lama = 0;
uint32_t selisih_waktu = 0;
uint32_t referensi = 0;

uint8_t status_pulse = 0;
uint8_t status_mute = 0;

/* ======================= FILTER MOVING AVERAGE ======================= */
#define TOTAL_DATA 10

uint16_t buffer_adc[TOTAL_DATA];
uint8_t posisi_buffer = 0;

uint16_t Filter_ADC(uint16_t data_masuk)
{
buffer_adc[posisi_buffer] = data_masuk;

posisi_buffer++;

if(posisi_buffer >= TOTAL_DATA)
{
posisi_buffer = 0;
}

uint32_t jumlah = 0;

for(uint8_t i = 0; i < TOTAL_DATA; i++)
{
jumlah += buffer_adc[i];
}

return jumlah / TOTAL_DATA;
}

/* ======================= FUNGSI LED ======================= */
void Reset_LED(void)
{
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_0 |
GPIO_PIN_1 |
GPIO_PIN_10,
GPIO_PIN_RESET);
}

void Kontrol_Buzzer(uint8_t kondisi)
{
if(kondisi == 1)
{
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_11,
GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_11,
GPIO_PIN_RESET);
}
}

/* ======================= INTERRUPT PUSH BUTTON ======================= */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_1)
{
status_mute = !status_mute;
}
}

/* ======================= PROTOTYPE ======================= */
void SystemClock_Config(void);
void GPIO_Init_Custom(void);
void ADC1_Init_Custom(void);

/* ======================= MAIN PROGRAM ======================= */
int main(void)
{
HAL_Init();

SystemClock_Config();
GPIO_Init_Custom();
ADC1_Init_Custom();

while(1)
{
/* ===== MEMBACA SENSOR ===== */
HAL_ADC_Start(&hadc1);

if(HAL_ADC_PollForConversion(&hadc1, 20) == HAL_OK)
{
nilai_adc = HAL_ADC_GetValue(&hadc1);
}

HAL_ADC_Stop(&hadc1);

/* ===== FILTER SINYAL ===== */
data_stabil = Filter_ADC(nilai_adc);

/* ===== MENENTUKAN NILAI DASAR ===== */
referensi = (referensi * 8 + data_stabil) / 9;

uint32_t batas_deteksi = referensi + 30;

/* ===== DETEKSI DETAK ===== */
if(data_stabil >= batas_deteksi)
{
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_0,
GPIO_PIN_SET);

if(status_pulse == 0)
{
status_pulse = 1;

uint32_t waktu_sekarang =
HAL_GetTick();

if(waktu_lama != 0)
{
selisih_waktu =
waktu_sekarang - waktu_lama;

if(selisih_waktu > 250)
{
bpm_hasil =
60000 / selisih_waktu;
}
}

waktu_lama = waktu_sekarang;
}
}
else
{
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_0,
GPIO_PIN_RESET);

status_pulse = 0;
}

/* ===== SENSOR TIDAK TERDETEKSI ===== */
if((HAL_GetTick() - waktu_lama) > 2500)
{
bpm_hasil = 0;
}

/* ===== KONDISI BPM ===== */
if(bpm_hasil > 0)
{
/* DETAK LAMBAT */
if(bpm_hasil < 60)
{
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_1,
GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_10,
GPIO_PIN_RESET);

Kontrol_Buzzer(0);
}

/* DETAK NORMAL */
else if(bpm_hasil >= 60 &&
bpm_hasil <= 100)
{
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_1 |
GPIO_PIN_10,
GPIO_PIN_RESET);

Kontrol_Buzzer(0);
}

/* DETAK CEPAT */
else
{
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_10,
GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_1,
GPIO_PIN_RESET);

if(status_mute == 0)
{
Kontrol_Buzzer(1);
}
else
{
Kontrol_Buzzer(0);
}
}
}
else
{
Reset_LED();
Kontrol_Buzzer(0);
}

HAL_Delay(20);
}
}

/* ======================= 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 ADC1_Init_Custom(void)
{
ADC_ChannelConfTypeDef konfigurasi_adc = {0};

__HAL_RCC_ADC1_CLK_ENABLE();

hadc1.Instance = ADC1;

hadc1.Init.ScanConvMode =
ADC_SCAN_DISABLE;

hadc1.Init.ContinuousConvMode =
DISABLE;

hadc1.Init.ExternalTrigConv =
ADC_SOFTWARE_START;

hadc1.Init.DataAlign =
ADC_DATAALIGN_RIGHT;

hadc1.Init.NbrOfConversion = 1;

HAL_ADC_Init(&hadc1);

konfigurasi_adc.Channel =
ADC_CHANNEL_0;

konfigurasi_adc.Rank =
ADC_REGULAR_RANK_1;

konfigurasi_adc.SamplingTime =
ADC_SAMPLETIME_71CYCLES_5;

HAL_ADC_ConfigChannel(&hadc1,
&konfigurasi_adc);
}

/* ======================= GPIO ======================= */
void GPIO_Init_Custom(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();

GPIO_InitTypeDef GPIO_InitStruct = {0};

/* PUSH BUTTON */
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;

HAL_GPIO_Init(GPIOA,
&GPIO_InitStruct);

HAL_NVIC_SetPriority(EXTI1_IRQn,
0,
0);

HAL_NVIC_EnableIRQ(EXTI1_IRQn);

/* LED DAN 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);

5. Video Demo [kembali]




6. Kondisi [kembali]

  
Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi   LED warna menyala hijau dengan pola yang sama dengan detak jantung

7. Video Simulasi [kembali]






8. Download File [kembali]









Komentar

Postingan Populer