TP 1




a. Prosedur[Kembali]

.1.Persiapan Alat dan Bahan

  • STM32 (STM32F103C8 atau sesuai rangkaian)
  • Sensor Heartbeat
  • LED (Hijau, Kuning, Merah)
  • Buzzer
  • Resistor (220Ω / 330Ω)
  • Breadboard dan kabel jumper
  • Sumber tegangan (USB / adaptor)

2. Langkah Percobaan

1. Perakitan Rangkaian

  • Hubungkan output sensor heartbeat ke pin PA0 (ADC)
  • Hubungkan LED:
    • PB0 → LED hijau
    • PB1 → LED kuning
    • PB10 → LED merah
  • Hubungkan buzzer ke PB11
  • Pastikan semua ground (GND) dan VCC terhubung dengan benar

2. Pemrograman Mikrokontroler

  • Tuliskan program sesuai kode yang diberikan
  • Pastikan:
    • ADC aktif di PA0
    • GPIO output di PB0, PB1, PB10, PB11
  • Upload program ke STM32

3. Pengujian Sistem

  • Nyalakan rangkaian
  • Tempelkan jari pada sensor heartbeat
  • Amati pembacaan:
    • Saat detak sekitar 60 BPM:
      • LED hijau menyala
      • Buzzer berbunyi
    • Jika tidak mencapai threshold:
      • Semua LED dan buzzer mati

b. Hardware dan Diagram Blok[Kembali]

HARDWARE

    1. STM32F103C8

Microcontroller

ARM Cortex-M3

Operating Voltage

3.3 V

Input Voltage (recommended)

V

Input Voltage (limit)

2  3.6 V

Digital I/O Pins

32

PWM Digital I/O Pins

15

Analog Input Pins

10 (dengan resolusi 12-bit ADC)

DC Current per I/O Pin

25 mA

DC Current for 3.3V Pin

150 mA

Flash Memory

64 KB

SRAM

20 KB

EEPROM

Emulasi dalam Flash

Clock Speed

72 MHz


    2. Sensor Heart Beat
 





  1. Pulse Sensor Features and Specifications

    • Biometric Pulse Rate or Heart Rate detecting sensor
    • Plug and Play type sensor
    • Operating Voltage: +5V or +3.3V
    • Current Consumption: 4mA
    • Inbuilt Amplification and Noise cancellation circuit.
    • Diameter: 0.625”
    • Thickness: 0.125” Thick

    3.Push button

    4. LED

  1. LED — Light Emitting Diode sebagai indikator output visual.

    Spesifikasi (LED 5mm Standar):

    • Warna : Merah / Hijau / Kuning (tergantung jenis)
    • Forward Voltage (Vf) : 1.8V – 2.2V (merah), 2.0V – 3.5V (hijau/biru)
    • Forward Current (If) : 10 mA – 30 mA (tipikal 20 mA)
    • Maximum Current : 30 mA
    • Luminous Intensity : 5 – 500 mcd
    • Viewing Angle : 20° – 60°
    • Reverse Voltage (max) : 5V
    • Operating Temperature : -25°C hingga +85°C
    • Resistor yang dibutuhkan (3.3V supply) : (3.3V – 2.0V) / 0.02A = 65 ohm (gunakan 100 ohm)

      Spesifikasi:

      • Tipe : Common Cathode LED RGB
      • Forward Voltage Merah : 1.8V – 2.2V
      • Forward Voltage Hijau : 2.8V – 3.5V
      • Forward Voltage Biru : 2.8V – 3.5V
      • Forward Current : 20 mA per channel
      • Maximum Current per Channel : 30 mA
      • Luminous Intensity : 2000 – 4000 mcd
      • Viewing Angle : 30°
      • Pin : 4 pin (R, G, B, GND/common cathode)Spesifikasi:
        • Tipe : Tactile Push Button / Toggle Switch
        • Tegangan Operasi : 12V DC (max 50V DC)
        • Arus Maksimum : 50 mA
        • Contact Resistance : < 100 mΩ
        • Insulation Resistance : > 100 MΩ
        • Life Cycle : > 100,000 kali tekan
        • Operating Temperature : -25°C hingga +70°C
        • Bounce Time : 5 – 10 ms (perlu debounce di software)
    5. Buzzer
  1. Buzzer — Komponen output audio sebagai alarm/peringatan.

    Spesifikasi:

    • Tipe : Active Buzzer (osilator internal)
    • Tegangan Operasi : 3.5V – 5.5V DC
    • Tegangan Rated : 5V DC
    • Konsumsi Arus : < 30 mA
    • Frekuensi Suara : 2300 ± 300 Hz
    • Sound Pressure Level (SPL) : ≥ 85 dB (pada 10 cm)
    • Operating Temperature : -20°C hingga +70°C
    • Dimensi : 12mm × 9.5mm
    • Sambungan : 2 pin (+ dan -)

    6. Resistor
  1. Resistor — Komponen pembatas arus (1k ohm).

    Spesifikasi (Resistor 100 ohm, 1/4 Watt):

    • Nilai Resistansi : 100 Ω (coklat-hitam-coklat)
    • Toleransi : ±5% (gelang emas)
    • Daya Maksimum : 0.25 Watt (1/4 W)
    • Tegangan Maksimum : 250V
    • Suhu Operasi : -55°C hingga +155°C
    • Material : Carbon Film



         DIAGRAM BLOK  



    
                      

 
                                                                                                                                   

c. Rangkaian Simulasi dan Prinsip Kerja[Kembali]




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.

Listing Program[Kembali]

FLOWCHART




LISTING PROGRAM 

/* USER CODE BEGIN Header */

/**

******************************************************************************

* @file : main.c

* @brief : Sensor di PA0 (>60%) -> Menyalakan LED PB1 & Buzzer PB11, mematikan PB0 & PB10.

******************************************************************************

*/

/* USER CODE END Header */


/* Includes ------------------------------------------------------------------*/

#include "main.h"


/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */

#define FILTER_SIZE 10

/* USER CODE END PD */


/* Private variables ---------------------------------------------------------*/

ADC_HandleTypeDef hadc1;


/* USER CODE BEGIN PV */

uint32_t adcValue = 0;

uint32_t filteredValue = 0;

uint16_t buffer[FILTER_SIZE];

uint8_t indexBuf = 0;

/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);


/* USER CODE BEGIN PFP */

uint32_t Calculate_Moving_Average(uint16_t new_value);

/* USER CODE END PFP */


/* USER CODE BEGIN 0 */

uint32_t Calculate_Moving_Average(uint16_t new_value)

{

buffer[indexBuf] = new_value;

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

}

/* USER CODE END 0 */


int main(void)

{

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_ADC1_Init();


/* USER CODE BEGIN 2 */

// Matikan semua LED dan Buzzer di awal program

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 | GPIO_PIN_11, GPIO_PIN_RESET);

for(int i = 0; i < FILTER_SIZE; i++) buffer[i] = 0;

/* USER CODE END 2 */


/* Infinite loop */

/* USER CODE BEGIN WHILE */

uint8_t beatDetected = 0;

uint32_t BPM = 0;

uint32_t lastBeatTime = 0;

uint32_t interval = 0;


while (1)

{

HAL_ADC_Start(&hadc1);

if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)

{

adcValue = HAL_ADC_GetValue(&hadc1);

filteredValue = Calculate_Moving_Average(adcValue);


/* ===== THRESHOLD 60% ===== */

uint32_t threshold = 2457;


/* ===== 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; // ⭐ WAJIB (konversi BPM)

}

}


lastBeatTime = now;

}


if (filteredValue < threshold)

{

beatDetected = 0;

}


/* ===== OUTPUT (TETAP SESUAI AWAL) ===== */

if (filteredValue >= threshold)

{

// kondisi utama kamu (tidak diubah)

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // LED

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET); // BUZZER


HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1 | GPIO_PIN_10, GPIO_PIN_RESET);

}

else

{

HAL_GPIO_WritePin(GPIOB,

GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 | GPIO_PIN_11,

GPIO_PIN_RESET);

}

}


HAL_ADC_Stop(&hadc1);

HAL_Delay(10);

}

}

/* USER CODE END WHILE */


/**

* @brief System Clock Configuration

*/

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};


RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); }


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;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); }


PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;

PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;

if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); }

}


/**

* @brief ADC1 Initialization Function

*/

static void MX_ADC1_Init(void)

{

ADC_ChannelConfTypeDef sConfig = {0};

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;

if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); }


sConfig.Channel = ADC_CHANNEL_0;

sConfig.Rank = ADC_REGULAR_RANK_1;

sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;

if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); }

}


/**

* @brief GPIO Initialization Function

*/

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};


__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();


// Matikan semua output di awal

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11, GPIO_PIN_RESET);


/* Configure PB0, PB1, PB10, PB11 as 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.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}


/* USER CODE BEGIN 4 */


/* USER CODE END 4 */


void Error_Handler(void)

{

__disable_irq();

while (1){}

}


#ifdef USE_FULL_ASSERT

void assert_failed(uint8_t *file, uint32_t line){}

#endif

e. Video Demo[Kembali]


f. Kondisi[Kembali]

Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi sensor heartbeat membaca BPM 60 dan LED menyala warna hijau serta buzzer berbunyi

g. Video Simulasi[Kembali]

  




h. Download File[Kembali]

FIle Zip  [klik disini]

File Rangkaian Proteus [klik disini]

Datasheet Sensor: 

Datasheet Led  [klik disini]









 

Komentar

Postingan populer dari blog ini

Tugas Besar