P1 K 10

 




1. Prosedur [Kembali]

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 dan GPIO output

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

2. Hardware [Kembali]

  • Hardware
1. STM32F103C8





2. Push Button



3. Heart Beat Sensor


4. LED



5. Buzzer



6. Resistor 

  • Diagram Blog



3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]




Percobaan 1 adalah pembuatan Heart Rate Indikator menggunakan mikrokontroler STM32F103C8T6. Berikut adalah prinsip kerja dari sistem tersebut:

1. Akuisisi dan Pemrosesan Data Analog (ADC)

Sistem ini menggunakan HeartBeat Sensor yang dihubungkan ke pin analog mikrokontroler. Sinyal analog dari sensor dibaca melalui fitur ADC (Analog to Digital Converter) untuk diubah menjadi data digital. Data mentah ini kemudian diproses menggunakan metode Moving Average Filter untuk mengurangi noise dan mendapatkan nilai yang lebih stabil.

2. Deteksi Detak Jantung dan Kalkulasi BPM

Prinsip deteksi dilakukan dengan membandingkan nilai sensor yang telah difilter dengan sebuah ambang batas (threshold) adaptif.

  • Threshold Adaptif: Nilai ambang batas akan terus diperbarui berdasarkan rata-rata nilai dasar (baseline) ditambah nilai konstan tertentu (misalnya +50) agar deteksi tetap akurat meskipun ada pergeseran sinyal.

  • Kalkulasi BPM: Setiap kali nilai sensor melewati ambang batas, sistem mencatat waktu kejadian menggunakan fungsi HAL_GetTick(). Jeda waktu antar detak (interval) digunakan untuk menghitung nilai BPM (Beats Per Minute) dengan rumus $BPM = 60000 / interval$.

3. Klasifikasi Indikator (Output)

Mikrokontroler memberikan respon melalui LED dan Buzzer berdasarkan rentang nilai BPM yang terdeteksi:

  • BPM 30 - 60: Kondisi ini memicu LED Kuning menyala, sementara Buzzer dalam keadaan mati.

  • BPM 60 - 80: Dianggap sebagai rentang normal, ditandai dengan LED Hijau menyala dan Buzzer mati.

  • BPM > 80 atau < 30: Dianggap sebagai kondisi tidak normal, sehingga LED Merah menyala dan Buzzer berbunyi sebagai peringatan.

  • Tanpa Detak: Jika dalam 2 detik tidak terdeteksi detak jantung, sistem secara otomatis mereset nilai BPM menjadi 0 dan mematikan semua indikator.

4. Mekanisme Interupsi (Interrupt)

Percobaan ini mengimplementasikan fitur Interrupt pada Push Button yang dihubungkan ke pin PA1. Fungsi utama interupsi ini adalah sebagai Buzzer Toggle, yang memungkinkan pengguna untuk mematikan atau menyalakan suara buzzer secara manual tanpa mengganggu proses utama pembacaan sensor jantung.

4. Flowchart [Kembali]

  • Flowchart


  • Listing Program
#include "stm32f1xx_hal.h"

/* ================= HANDLE & GLOBAL VARIABLES ================= */
ADC_HandleTypeDef hadc1;

uint32_t adcValue = 0;
uint32_t BPM = 0;
uint32_t lastBeatTime = 0;
uint8_t beatDetected = 0;
uint8_t buzzerMute = 0; // 0 = Bunyi, 1 = Senyap (Toggle by Button)

/* ================= INTERRUPT TOMBOL (PA1) ================= */
// Fungsi ini akan dipanggil otomatis saat tombol ditekan (Falling Edge)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    if(GPIO_Pin == GPIO_PIN_1) {
        // Balikkan status mute (Toggle)
        buzzerMute = !buzzerMute;
    }
}

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

    while (1) {
        /* 1. BACA SENSOR (PA0) */
        HAL_ADC_Start(&hadc1);
        if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
            adcValue = HAL_ADC_GetValue(&hadc1);
        }
        HAL_ADC_Stop(&hadc1);

        /* 2. DETEKSI DETAK (LOGIKA THRESHOLD) */
        // Jika nilai ADC naik drastis (melewati 2500)
        if(adcValue > 2500 && beatDetected == 0) {
            beatDetected = 1;
            uint32_t now = HAL_GetTick();
            if(lastBeatTime > 0) {
                uint32_t interval = now - lastBeatTime;
                if(interval > 400) { // Anti-noise
                    BPM = 60000 / interval;
                }
            }
            lastBeatTime = now;
        }
        // Turunkan flag jika nilai ADC sudah rendah kembali
        if(adcValue < 2000) {
            beatDetected = 0;
        }

        // Jika sensor diam selama 2 detik, anggap BPM = 0
        if(HAL_GetTick() - lastBeatTime > 2000) {
            BPM = 0;
        }

        /* 3. KONTROL LED & BUZZER SESUAI MAPPING */
        if (BPM < 60) {
            // Kondisi Bahaya: Semua LED Merah (PB0, PB1, PB10) NYALA
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10, GPIO_PIN_SET);
            
            // Logika Buzzer (PB11) dengan pengecekan Mute
            if (buzzerMute == 0) {
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET);
            } else {
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET); // Mute Aktif
            }
        } 
        else {
            // Kondisi Normal: Semua Output MATI
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 | GPIO_PIN_11, GPIO_PIN_RESET);
            buzzerMute = 0; // Reset mute jika kondisi sudah normal kembali
        }

        HAL_Delay(10); 
    }
}

/* ================= KONFIGURASI PERIPHERAL ================= */

void MX_GPIO_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    /* PA1: Konfigurasi Input Interrupt (Tombol) */
    GPIO_InitStruct.Pin = GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // Ditekan ke Ground
    GPIO_InitStruct.Pull = GPIO_PULLUP;          // Wajib Pull-up Internal
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* PENTING: Jalur NVIC EXTI1 */
    HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(EXTI1_IRQn);

    /* PB0, PB1, PB10, PB11: Konfigurasi Output Push-Pull */
    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);

    // Kondisi Awal: Semua Low
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 | GPIO_PIN_11, GPIO_PIN_RESET);
}

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; // PA0
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

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

5. Video Demo [Kembali]




6. Kondisi [Kembali]

M2 P1 K10: 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]

Rangkaian Simulasi [Klik]

Video Simulasi [Klik]


Kembali ke Halaman Atas










Komentar

Postingan populer dari blog ini

KONTROL KOLAM IKAN