Tugas Pendahuluan (M2P1K9)
1. Prosedur [kembali]
Langkah-langkah percobaan :
- Pahami terlebih dahulu kondisi yang akan digunakan
- Buka software Proteus 8.17
- Persiapkan alat dan bahan
- Buat rangkaian sesuai dengan kondisi dan modul
- Buka software STM32Cube IDE
- Setelah membuka software, pilih perangkat STM32F103C8T6
- Sesuaikan konfigurasi pin sesuai dengan rangkaian proteus
- Buat kode program untuk mengoperasikan rangkaian tersebut sesuai dengan kondisi
- Konfigurasi kan program dengan software Proteus
- Jalankan simulasi rangkaian.
- Proses selesai
2. Hardware dan Diagram Blok [kembali]
1. STM32F103C8
HeartBeat sensor atau sensor detak jantung merupakan perangkat input analog yang berfungsi untuk mendeteksi denyut nadi manusia dengan prinsip fotopletismografi (PPG). Sensor ini biasanya bekerja menggunakan infra merah dan fototransistor untuk mengukur perubahan volume darah di dalam pembuluh darah kecil di ujung jari atau telinga. Sinyal yang dihasilkan bersifat analog, sehingga memerlukan fitur ADC (Analog to Digital Converter) pada mikrokontroler agar data detak jantung dapat diproses dan dikonversi menjadi nilai Beats Per Minute (BPM).
Push button adalah komponen sakelar sederhana yang berfungsi untuk menghubungkan atau memutuskan aliran arus listrik dalam suatu rangkaian dengan cara menekan tombolnya. Pada penggunaan mikrokontroler, komponen ini berperan sebagai perangkat input digital yang bekerja berdasarkan prinsip logika high atau low, di mana status penekanannya dapat dibaca oleh pin GPIO atau digunakan untuk memicu mekanisme interrupt eksternal. Agar pembacaan sinyal tetap stabil dan terhindar dari kondisi floating, push button biasanya dikonfigurasi menggunakan resistor pull-up atau pull-down yang memastikan level tegangan input tetap berada pada kondisi logika yang jelas saat tombol tidak sedang ditekan.
4. LED
b. Diagram Blok
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
Prinsip Kerja :
4. Flowchart dan Listing Program [kembali]
#include "stm32f1xx_hal.h"
/* ================= HANDLE & VARIABLE ================= */
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;
uint32_t buzzerBeatTimer = 0;
/* ================= FILTER MOVING AVERAGE ================= */
#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;
}
/* ================= OUTPUT FUNCTIONS ================= */
void LED_Mati() {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10, GPIO_PIN_RESET);
}
void LED_Hijau() { LED_Mati(); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); }
void LED_Merah() { LED_Mati(); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); }
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); }
/* ================= PROTOTYPES ================= */
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
/* ================= MAIN PROGRAM ================= */
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
uint32_t baseline = 0;
while (1) {
/* 1. BACA ADC */
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
adcValue = HAL_ADC_GetValue(&hadc1);
/* 2. FILTERING */
filteredValue = moving_average(adcValue);
/* 3. PERBAIKAN: LOGIKA DEADZONE (Test Pin 0 = Sistem Mati) */
// Jika ADC sangat rendah (di bawah noise floor), langsung bypass semua logika
if (filteredValue < 150) {
BPM = 0;
beatDetected = 0;
lastBeatTime = HAL_GetTick();
LED_Mati();
Buzzer_Off();
}
else {
/* 4. BASELINE ADAPTIF (Logika Anda) */
baseline = (baseline * 9 + filteredValue) / 10;
uint32_t threshold = baseline + 50;
/* 5. DETEKSI DETAK */
if (filteredValue > threshold && beatDetected == 0) {
beatDetected = 1;
uint32_t now = HAL_GetTick();
if (lastBeatTime != 0) {
interval = now - lastBeatTime;
// Filter Debounce agar tidak double count pada satu detakan
if (interval > 300) {
BPM = 60000 / interval;
}
}
lastBeatTime = now;
/* BUZZER mengikuti detak (Khusus BPM < 60) */
if (BPM < 60) {
buzzerBeatTimer = HAL_GetTick();
Buzzer_On();
}
}
if (filteredValue < threshold) {
beatDetected = 0;
}
/* 6. OUTPUT BERDASARKAN BPM (Logika Anda) */
if (BPM > 0) {
if (BPM < 60) {
LED_Mati();
} else if (BPM <= 80) {
LED_Hijau();
// Buzzer akan mati otomatis oleh timer 50ms
} else {
LED_Merah();
}
}
}
/* 7. AUTO-OFF BUZZER (Timer 50ms Anda) */
if (HAL_GetTick() - buzzerBeatTimer > 50) {
Buzzer_Off();
}
/* 8. TIMEOUT (Logika Anda) */
if (HAL_GetTick() - lastBeatTime > 2000) {
BPM = 0;
LED_Mati();
Buzzer_Off();
}
HAL_Delay(5);
}
}
/* ================= HARDWARE 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;
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_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);
LED_Mati();
Buzzer_Off();
}
5. Video Demo [kembali]
Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi Sensor Heartbeat membaca BPM < 60 LED mati dan buzzer ber bunyi dengan pola yang sama dengan detak jantung
7. Video Simulasi [kembali]
- Download file lengkap (Rangkaian dan Program) (klik disini)
- Download video simulasi (klik disini)
- Download Datasheet Heartbeat Sensor (klik disini)
- Download Datasheet STM32F103C (klik disini)
- Download Datasheet Resistor (klik disini)
- Download Datasheet LED (klik disini)
- Download Datasheet Buzzer (klik disini)
Komentar
Posting Komentar