TUGAS PENDAHULUAN 1

[KEMBALI KE MENU SEBELUMNYA]

MODUL 2 PERCOBAAN 1 KONDISI 10

1. Prosedure [Kembali]

  1. Pahami terlebih dahulu kondisi yang akan digunakan
  2. Buka software Proteus 8.17
  3. Persiapkan alat dan bahan
  4. Buat rangkaian sesuai dengan kondisi dan modul
  5. Buka software STM32Cube IDE
  6. Setelah membuka software, pilih perangkat STM32F103C8T6
  7. Sesuaikan konfigurasi pin sesuai dengan rangkaian proteus
  8. Buat kode program untuk mengoperasikan rangkaian tersebut sesuai dengan kondisi
  9. Konfigurasi kan program dengan software Proteus
  10. Jalankan simulasi rangkain
  11. Proses selesai

2. Hardware dan Diagram Blok [Kembali]

    Hardware


STM32F103C8


Heartbeat Sensor

Potensiometer


Push Botton


LED


Buzzer


Resistor

    Diagram Blok



3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

    Rangkaian Simulasi


    Prinsip Kerja

Rangkaian ini bekerja dengan memanfaatkan sensor heartbeat sebagai input utama untuk mendeteksi detak jantung dalam bentuk sinyal analog. Sensor tersebut menghasilkan tegangan yang berubah-ubah mengikuti denyut jantung, kemudian sinyal analog ini dibaca oleh mikrokontroler STM32 melalui pin ADC (PA0) dan dikonversi menjadi data digital dengan resolusi 12-bit (0–4095). Untuk meningkatkan kestabilan pembacaan dan mengurangi noise, data ADC diproses menggunakan metode moving average filter sehingga menghasilkan nilai yang lebih halus dan representatif terhadap kondisi sebenarnya.

Nilai hasil pembacaan ADC yang telah difilter kemudian dibandingkan dengan nilai ambang batas tertentu yang telah ditentukan sebelumnya. Dalam percobaan ini, ambang batas diatur sekitar 60% dari nilai maksimum ADC, yang diasumsikan merepresentasikan kondisi detak jantung sekitar 60 BPM. Ketika nilai ADC melebihi threshold tersebut, mikrokontroler akan mengaktifkan output berupa LED hijau (pada pin PB0) dan buzzer (pada pin PB11). Sebaliknya, LED lain akan dimatikan untuk menunjukkan bahwa kondisi berada pada kategori tertentu sesuai logika program.

LED berfungsi sebagai indikator visual untuk menunjukkan kondisi detak jantung, di mana warna hijau menandakan kondisi normal (sekitar 60 BPM), sedangkan buzzer berfungsi sebagai indikator audio yang memberikan notifikasi tambahan bahwa detak jantung telah terdeteksi sesuai kondisi yang diinginkan. Jika nilai ADC berada di bawah threshold, maka semua output dimatikan sebagai indikasi bahwa kondisi belum memenuhi kriteria.

Secara keseluruhan, sistem ini bekerja dengan konsep akuisisi sinyal analog (sensor heartbeat), pengolahan data digital (ADC dan filtering), serta pengendalian output (LED dan buzzer) berdasarkan logika perbandingan nilai ambang. Sistem berjalan secara terus-menerus (real-time) dalam loop utama sehingga mampu merespons perubahan detak jantung secara langsung.


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;

uint8_t beatDetected = 0;

uint32_t BPM = 0;

uint32_t lastBeatTime = 0;

uint32_t interval = 0;

uint8_t buzzerOff = 0;


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

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

}


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

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

}


/* ================= BUZZER ================= */

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

}


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

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if(GPIO_Pin == GPIO_PIN_1) // Tombol PA1 untuk mute buzzer

{

buzzerOff = !buzzerOff;

}

}


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

void SystemClock_Config(void);

void MX_GPIO_Init(void);

void MX_ADC1_Init(void);


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

int main(void)

{

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_ADC1_Init();


uint32_t baseline = 0;


while (1)

{

/* ==== BACA ADC ==== */

HAL_ADC_Start(&hadc1);

HAL_ADC_PollForConversion(&hadc1, 10);

adcValue = HAL_ADC_GetValue(&hadc1);


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

filteredValue = moving_average(adcValue);


/* ==== BASELINE ADAPTIF ==== */

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; // FIX PERHITUNGAN

if(interval > 0) BPM = 60000 / interval;

}


lastBeatTime = now;

}


if(filteredValue < threshold)

{

beatDetected = 0;

}


/* ==== TIMEOUT (TIDAK ADA DETAK) ==== */

if(HAL_GetTick() - lastBeatTime > 2000)

{

BPM = 0;

}


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

if(BPM > 0)

{

if(BPM < 60)

{

LED_Mati();

LED_Merah();

if(!buzzerOff) Buzzer_On(); // BUZZER NYALA

else Buzzer_Off();

}

else if(BPM <= 80)

{

LED_Mati();

LED_Hijau();

if(!buzzerOff) Buzzer_On();

else Buzzer_Off();

}

else

{

LED_Mati();

LED_Kuning();

Buzzer_Off();

}

}

else

{

LED_Mati();

Buzzer_Off();

}


HAL_Delay(5);

}

}


/* ================= CLOCK CONFIG ================= */

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

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

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


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


HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(EXTI1_IRQn);


/* GPIOB = LED + 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 Sensor Heartbeat membaca BPM < 60, maka LED menyala merah dan Buzzer berbunyi

7. Video Simulasi [Kembali]



8. Download File [Kembali]

  • Download File Zip disini
  • Download File Rangkaian Proteus disini
  • Download Listing Program disini
  • Link Video Simulasi disini
  • Download Datasheet Heartbeat Sensor disini
  • Download Datasheet STM32F103C8 disini
  • Download Datasheet LED disini


Komentar

Postingan populer dari blog ini