Sabtu, 25 April 2026

M2 : Tugas Pendahuluan 1

 

[KEMBALI KE MENU SEBELUMNYA] 



Tugas Pendahuluan 1
 Heart Rate Indikator

1. Prosedur 
[Kembali]

1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.
2. Buat program untuk mikrokontroler STM32F103C8 di software STM32 CubeIDE.
3. Compile program dalam format hex, lalu upload ke dalam mikrokontroler.
4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.
5. Selesai.


Hardware :

a) Mikrokontroler STM32F103C8
STM32F103C8 board – Microscale





2. Heartbeat Sensor






3. Push Button Sensor








4. Power Supply

 
5. LED



6. Buzzer


7. Resistor


8. Breadboard




Diagram Blok  :




Rangkaian Simulasi
 


Prinsip Kerja : 

Rangkaian heart rate indikator ini bekerja dengan memanfaatkan sensor detak jantung sebagai input analog yang terhubung ke pin ADC mikrokontroler STM32F103C8T6. Sensor akan menghasilkan perubahan tegangan setiap kali denyut nadi terdeteksi, kemudian sinyal tersebut dibaca oleh ADC dan diproses menggunakan metode moving average agar pembacaan lebih stabil serta mengurangi noise. Nilai hasil filter selanjutnya dibandingkan dengan nilai ambang adaptif (threshold) untuk menentukan apakah terjadi satu detakan jantung. Setiap detakan yang berhasil dideteksi akan dihitung selang waktunya menggunakan fungsi timer internal mikrokontroler sehingga diperoleh nilai BPM (Beat Per Minute). Pada saat yang sama, LED hijau akan menyala sesaat mengikuti pola detak jantung yang terbaca, sehingga visualisasi denyut dapat terlihat secara langsung sesuai ritme nadi pengguna.

Setelah nilai BPM diperoleh, mikrokontroler akan mengelompokkan kondisi detak jantung ke dalam beberapa kategori indikator. Jika BPM berada pada rentang 30–60 maka LED kuning menyala sebagai tanda detak lambat, sedangkan jika BPM berada pada rentang normal hingga 80 BPM maka buzzer tetap mati dan LED hijau hanya berkedip sesuai detakan sensor. Apabila BPM melebihi 80 BPM maka LED merah menyala sebagai indikator detak terlalu cepat dan buzzer akan aktif sebagai alarm peringatan. Selain itu, push button yang dipasang pada pin interrupt berfungsi untuk mematikan atau mengaktifkan buzzer secara manual ketika alarm berbunyi tanpa mengganggu proses pembacaan sensor. Dengan demikian, rangkaian ini tidak hanya mampu memonitor denyut jantung secara real-time, tetapi juga memberikan tampilan visual berupa kedipan LED hijau yang sinkron dengan detak jantung yang terukur.


Flowchart :



Listing Program :

#include "stm32f1xx_hal.h"

ADC_HandleTypeDef hadc1;

uint32_t adcValue = 0;
uint32_t filteredValue = 0;
uint8_t beatDetected = 0;
uint32_t BPM = 0;
uint32_t lastBeatTime = 0;
uint32_t interval = 0;
uint8_t buzzerOff = 0;

#define FILTER_SIZE 10
uint16_t buffer[FILTER_SIZE];
uint8_t indexBuf = 0;

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;
}

void LED_Hijau() {
 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
}

void LED_Kuning() {
 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
}

void LED_Merah() {
 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
}

void LED_Mati() {
 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10, GPIO_PIN_RESET);
}

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);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
 if(GPIO_Pin == GPIO_PIN_1)
 {
  buzzerOff = !buzzerOff;
 }
}

void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);

int main(void)
{
 HAL_Init();
 SystemClock_Config();
 MX_GPIO_Init();
 MX_ADC1_Init();

 uint32_t baseline = 0;
 uint32_t greenLedTime = 0;
 uint8_t greenLedPulse = 0;

 while (1)
 {
  HAL_ADC_Start(&hadc1);
  HAL_ADC_PollForConversion(&hadc1, 10);
  adcValue = HAL_ADC_GetValue(&hadc1);

  filteredValue = moving_average(adcValue);

  baseline = (baseline * 9 + filteredValue) / 10;
  uint32_t threshold = baseline + 50;

  if(filteredValue > threshold && beatDetected == 0)
  {
   beatDetected = 1;

   uint32_t now = HAL_GetTick();

   if(lastBeatTime != 0)
   {
    interval = now - lastBeatTime;
    BPM = 60000 / interval;
   }

   lastBeatTime = now;

   LED_Mati();
   LED_Hijau();
   greenLedTime = now;
   greenLedPulse = 1;
  }

  if(filteredValue < threshold)
  {
   beatDetected = 0;
  }

  if(greenLedPulse && HAL_GetTick() - greenLedTime >= 80)
  {
   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
   greenLedPulse = 0;
  }

  if(HAL_GetTick() - lastBeatTime > 2000)
  {
   BPM = 0;
  }

  if(BPM > 0)
  {
   if(BPM > 30 && BPM < 60)
   {
    LED_Kuning();
    Buzzer_Off();
    buzzerOff = 0;
   }
   else if(BPM <= 80)
   {
    Buzzer_Off();
    buzzerOff = 0;
   }
   else
   {
    LED_Merah();
    if(!buzzerOff)
     Buzzer_On();
    else
     Buzzer_Off();
   }
  }
  else
  {
   LED_Mati();
   Buzzer_Off();
  }

  HAL_Delay(5);
 }
}

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);
}

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.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);
}

void MX_GPIO_Init(void)
{
 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOB_CLK_ENABLE();

 GPIO_InitTypeDef GPIO_InitStruct = {0};

 GPIO_InitStruct.Pin = GPIO_PIN_0;
 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 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);

 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);
}


kondisi LED warna menyala hijau dengan pola yang sama dengan detak jantung






Download HTML [Download]
Download File Rangkaian [percobaan 1][Download]
Download Video Simulasi [Download]
Download Listing Program [Download]
Datasheet Mikrokontroler STM32F103C8 [Download]
Datasheet Sensor Heartbeat [Download]

Datasheet Sensor Push Button [Download]
Datasheet LED [Download]

Tidak ada komentar:

Posting Komentar

M2 : Tugas Pendahuluan 2

  [KEMBALI KE MENU SEBELUMNYA] DAFTAR ISI 1. Prosedur 2. Hardware dan Diagram Blok 3. Rangkaian Simulasi dan Prinsip Kerja 4. Flowchart ...