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

Buy Development board ARM STM STM32F103C8T6 (blue-pill) at the right ...

 

b)     HeartBeat Sensor

HEART RATE SENSOR-PULSE SENSOR - Chinahub.lk

 

c)     Push Button

Push Button Switch

 

d)     LED

Amazon.com: EBOOT 100 Pieces Clear LED Light Emitting Diodes Bulb LED ...

 

e)     Buzzer

Piezoelectric Buzzers: Creating Vibrations

 

 

f)      Resistor

TE Connectivity 10kΩ Carbon Film Carbon Film Resistor 1W ±5% CFR100J10K ...

 

 

g)     Breadboard

ABS 800 Pin Breadboard at Rs 80/piece in Vadodara | ID: 22340937912


B. Diagram Blok


3. Rangkaian Simulasi dan Prinsip Kerja [kembali]

Rangkaian Simulasi Percobaan 1 Kondisi 7

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

Popular posts from this blog