M2 - Tugas Pendahuluan 1


PERCOBAAN 1 KONDISI 5

a) Prosedur

1. Buka software proteus lalu rangkai komponen sesuai dengan gambar yang ada di modul

2. Buka software STM32CubeIDE lalu lakukan konfigurasi pin pada STM untuk menentukan GPIO input, GPIO output, EXTI dan ADC_IN

3. Masukan Program ke dalam software STM32CubeIDE lalu build untuk mendapatkan file .hex

4. Masukan file .hex ke dalam file library STM32F103C8 pada proteus

5. Simulasikan rangkaian


b) Hardware

1. STM32F103C8


2. Heartbeat Sensor


3. Breadboard


4. LED

5. Buzzer

6. Resistor

7. Push Button


Diagram blok:


c) Rangkaian Simulasi dan Prinsip Kerja


Rangkaian Percobaan 1 Kondisi 5

Prinsip kerja:
Prinsip kerja rangkaian ini dimulai ketika sensor detak jantung Heart Beat Sensor mendeteksi perubahan aliran darah pada ujung jari pengguna. Sensor ini bekerja berdasarkan perubahan intensitas cahaya yang dipantulkan oleh pembuluh darah, kemudian menghasilkan sinyal analog berupa tegangan yang berubah mengikuti denyut jantung. Sinyal tersebut dikirim ke mikrokontroler STM32F103C8 melalui pin input analog (ADC). Di dalam mikrokontroler, sinyal dibaca, diproses, dan dihitung jumlah puncak denyutnya dalam satuan BPM (Beat Per Minute). Potensiometer RV1 berfungsi sebagai pengatur atau simulasi nilai tegangan referensi/threshold untuk membantu proses pengujian atau kalibrasi sinyal input.

Setelah data denyut jantung diproses, mikrokontroler akan memberikan keluaran ke tiga LED indikator dan buzzer sesuai kondisi BPM yang terdeteksi. Jika nilai detak jantung berada di bawah batas normal, LED merah dapat menyala sebagai indikator kondisi rendah. Jika berada pada rentang tertentu, LED kuning menyala sebagai tanda waspada, dan jika berada pada kondisi normal maka LED hijau menyala sebagai indikator aman. Selain itu, buzzer akan aktif apabila nilai BPM melewati batas yang telah diprogram, sehingga memberikan alarm suara. Resistor R1, R2, dan R3 digunakan untuk membatasi arus yang mengalir ke LED agar komponen tidak rusak. Secara keseluruhan, rangkaian ini bekerja sebagai sistem monitoring detak jantung yang membaca sinyal biologis, mengolahnya dengan mikrokontroler, lalu menampilkan status melalui indikator visual dan audio.

d) Flowchart



Listing Program:

#include "stm32f1xx_hal.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;


/* ================= STATUS SISTEM ================= */

/* 1 = ON, 0 = OFF */

volatile uint8_t systemOn = 1;


/* ================= FILTER ================= */

#define FILTER_SIZE 10


uint16_t buffer[FILTER_SIZE] = {0};

uint8_t indexBuf = 0;


/* ================= PROTOTYPE ================= */

void SystemClock_Config(void);

void MX_GPIO_Init(void);

void MX_ADC1_Init(void);


/* ================= FILTER ================= */

uint16_t moving_average(uint16_t val)

{

buffer[indexBuf] = val;


indexBuf++;


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;

}


/* ================= LED ================= */

void LED_Hijau(void)

{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOB,

GPIO_PIN_1 | GPIO_PIN_10,

GPIO_PIN_RESET);

}


void LED_Kuning(void)

{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOB,

GPIO_PIN_0 | GPIO_PIN_10,

GPIO_PIN_RESET);

}


void LED_Merah(void)

{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOB,

GPIO_PIN_0 | GPIO_PIN_1,

GPIO_PIN_RESET);

}


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

}


/* ================= INTERRUPT ================= */

/*

PA1 = Pushbutton ON/OFF sistem

Tekan sekali = OFF

Tekan lagi = ON

*/

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

static uint32_t debounceTime = 0;


if(GPIO_Pin == GPIO_PIN_1)

{

/* Debounce 200ms */

if(HAL_GetTick() - debounceTime < 200)

return;


debounceTime = HAL_GetTick();


/* Toggle sistem */

systemOn = !systemOn;


/* Jika sistem dimatikan */

if(systemOn == 0)

{

LED_Mati();

Buzzer_Off();


BPM = 0;

beatDetected = 0;

lastBeatTime = 0;

interval = 0;

baseline = 0;

}

}

}


/* ================= MAIN ================= */

int main(void)

{

HAL_Init();


SystemClock_Config();

MX_GPIO_Init();

MX_ADC1_Init();


while(1)

{

/* ================= SISTEM OFF ================= */

if(systemOn == 0)

{

LED_Mati();

Buzzer_Off();


HAL_Delay(50);

continue;

}


/* ================= 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;


if(interval > 0)

{

BPM = 60000 / interval;

}

}


lastBeatTime = now;

}


/* Reset detector */

if(filteredValue < threshold)

{

beatDetected = 0;

}


/* Timeout sensor */

if(HAL_GetTick() - lastBeatTime > 2000)

{

BPM = 0;

}


/* ================= OUTPUT ================= */

if(BPM > 0)

{

/* BPM abnormal */

if(BPM < 30 || BPM > 80)

{

LED_Merah();

Buzzer_On();

}


/* BPM 30-60 */

else if(BPM >= 30 && BPM <= 60)

{

LED_Kuning();

Buzzer_Off();

}


/* BPM 60-80 */

else if(BPM > 60 && BPM <= 80)

{

LED_Hijau();

Buzzer_Off();

}

}

else

{

LED_Mati();

Buzzer_Off();

}


HAL_Delay(2);

}

}


/* ================= 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.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 = Sensor ADC */

GPIO_InitStruct.Pin = GPIO_PIN_0;

GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;


HAL_GPIO_Init(GPIOA,

&GPIO_InitStruct);


/* PA1 = Pushbutton interrupt */

GPIO_InitStruct.Pin = GPIO_PIN_1;

GPIO_InitStruct.Mode =

GPIO_MODE_IT_FALLING;


GPIO_InitStruct.Pull =

GPIO_PULLUP;


HAL_GPIO_Init(GPIOA,

&GPIO_InitStruct);


/* Enable interrupt */

HAL_NVIC_SetPriority(EXTI1_IRQn,

0, 0);


HAL_NVIC_EnableIRQ(EXTI1_IRQn);


/* PB0, PB1, PB10, PB11 = output */

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

}

e) Video Demo


f) Kondisi

Buatlah rangkaian seperti pada gambar percobaan 1 namun interuptnya berubah fungsi menjadi kontak on/off seluruh sistem.

g) Video Simulasi

Video Penjelasan Rangkaian Modul 2 Percobaan 1 Kondisi 5

h) Download File







Comments

Popular posts from this blog