MODUL 2 PERCOBAAN 1 KONDISI 8


1. Prosedur[Kembali]

  1. Menyiapkan alat dan bahan.
  2. Merangkai komponen pada breadboard sesuai dengan gambar rangkaian percobaan.
  3. Menghubungkan masing masing pin input output.
  4. Mengunggah program menggunakan ST-LINK ke mikrokontroler.
  5. Jalankan Rangkaian

2. Hardware dan Diagram Blok[Kembali]

  • STM32F103C8T6 
  • HeartBeat Sensor 
  • Push Button 
  • LED 
  • Buzzer  
  • Resistor 
  • Breadboard 

3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]




Rangkaian pada gambar tersebut bekerja sebagai sistem pendeteksi detak jantung yang memanfaatkan sensor heartbeat, mikrokontroler STM32, serta indikator berupa LED dan buzzer. Prinsip kerjanya dimulai dari sensor HB1 yang berfungsi mendeteksi perubahan aliran darah pada ujung jari. Sensor ini menggunakan prinsip photoplethysmography, yaitu perubahan intensitas cahaya akibat variasi volume darah setiap kali jantung berdetak. Perubahan tersebut kemudian diubah menjadi sinyal tegangan analog pada pin output sensor.

Sinyal analog dari sensor selanjutnya diteruskan ke rangkaian yang dilengkapi dengan potensiometer (RV1). Komponen ini digunakan untuk mengatur sensitivitas atau ambang pembacaan sinyal, sehingga sinyal yang masuk ke mikrokontroler menjadi lebih stabil dan sesuai dengan kebutuhan pengolahan. Setelah itu, sinyal analog tersebut masuk ke pin ADC (Analog-to-Digital Converter) pada mikrokontroler STM32, yang bertugas mengubah sinyal analog menjadi data digital agar dapat diproses secara logika.

Di dalam mikrokontroler, data yang diterima akan diolah untuk mendeteksi pola detak jantung. Ketika terdeteksi adanya detak (pulse), mikrokontroler akan menghasilkan sinyal keluaran berupa logika HIGH atau LOW pada pin tertentu. Sinyal ini kemudian digunakan untuk mengendalikan LED dan buzzer.

LED yang terhubung melalui resistor (R1, R2, R3) berfungsi sebagai indikator visual. Resistor digunakan untuk membatasi arus agar LED tidak rusak. Pada kondisi yang diminta, LED hijau akan menyala mengikuti pola detak jantung, artinya LED akan berkedip sesuai ritme denyut yang terdeteksi oleh sensor. Sementara itu, buzzer akan berbunyi mengikuti sinyal yang sama, sehingga memberikan indikator suara dari detak jantung tersebut.

4. Flowchart dan Listing Program[Kembali]

Flowchart :





Listing Program :

#include "stm32f1xx_hal.h"


/* ================= STRUKTUR DATA ================= */

ADC_HandleTypeDef hadc1;


/* ================= VARIABEL GLOBAL ================= */

uint32_t baca_mentah = 0;

uint32_t sinyal_filter = 0;

uint8_t deteksi_fase = 0;

uint32_t nilai_BPM = 0;

uint32_t t_lampau = 0;

uint32_t jeda_waktu = 0;

uint8_t mute_mode = 0;


/* ================= FILTER RATA-RATA ================= */

#define UKURAN_SAMPLING 10

uint16_t data_buffer[UKURAN_SAMPLING];

uint8_t urutan = 0;


uint16_t proses_filter(uint16_t input) {

    data_buffer[urutan++] = input;

    if (urutan >= UKURAN_SAMPLING) urutan = 0;


    uint32_t total = 0;

    for (int i = 0; i < UKURAN_SAMPLING; i++) total += data_buffer[i];

    return (uint16_t)(total / UKURAN_SAMPLING);

}


/* ================= FUNGSI INDIKATOR ================= */

void Bersihkan_Output() {

    // Mematikan semua LED sekaligus (PB0, PB1, PB10)

    GPIOB->ODR &= ~(GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10);

}


void Alarm_Sistem(uint8_t status) {

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, status ? GPIO_PIN_SET : GPIO_PIN_RESET);

}


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

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {

    if (GPIO_Pin == GPIO_PIN_1) { // PA1 sebagai Push Button

        mute_mode = !mute_mode;

    }

}


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

void SystemClock_Config(void);

void MX_GPIO_Init(void);

void MX_ADC1_Init(void);


/* ================= PROGRAM UTAMA ================= */

int main(void) {

    HAL_Init();

    SystemClock_Config();

    MX_GPIO_Init();

    MX_ADC1_Init();


    uint32_t referensi_dasar = 0;


    while (1) {

        /* 1. AKUISISI DATA SENSOR */

        HAL_ADC_Start(&hadc1);

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

            baca_mentah = HAL_ADC_GetValue(&hadc1);

        }

        HAL_ADC_Stop(&hadc1);


        sinyal_filter = proses_filter(baca_mentah);


        /* 2. PENENTUAN AMBANG BATAS (SENSITIF) */

        referensi_dasar = (referensi_dasar * 9 + sinyal_filter) / 10;

        uint32_t titik_puncak = referensi_dasar + 20;


        /* 3. LOGIKA HEARTBEAT (SINKRONISASI PB0) */

        if (sinyal_filter > titik_puncak) {

            // LED Hijau (PB0) aktif langsung saat detak fisik terdeteksi

            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);


            if (deteksi_fase == 0) {

                deteksi_fase = 1;

                uint32_t t_skrg = HAL_GetTick();

                if (t_lampau != 0) {

                    jeda_waktu = t_skrg - t_lampau;

                    if (jeda_waktu > 350) { // Proteksi dari noise ganda

                        nilai_BPM = 60000 / jeda_waktu;

                    }

                }

                t_lampau = t_skrg;

            }

        } else {

            // LED Hijau (PB0) mati saat sinyal di bawah ambang

            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);

            deteksi_fase = 0;

        }


        /* 4. PENANGANAN SENSOR LEPAS (TIMEOUT) */

        if (HAL_GetTick() - t_lampau > 2500) {

            nilai_BPM = 0;

        }


        /* 5. KONTROL INDIKATOR STATUS (PB1 & PB10) */

        if (nilai_BPM > 0) {

            if (nilai_BPM < 60) {

                // Kondisi: Bradikardia (Kuning)

                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);   // PB1 ON

                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); // PB10 OFF

                Alarm_Sistem(0);

            }

            else if (nilai_BPM >= 60 && nilai_BPM <= 100) {

                // Kondisi: Normal (Hanya Hijau yang Berkedip di Tahap 3)

                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1 | GPIO_PIN_10, GPIO_PIN_RESET);

                Alarm_Sistem(0);

            }

            else {

                // Kondisi: Takikardia (Merah)

                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);  // PB10 ON

                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // PB1 OFF

                Alarm_Sistem(!mute_mode); // Alarm aktif jika tidak di-mute

            }

        } else {

            Bersihkan_Output();

            Alarm_Sistem(0);

        }


        HAL_Delay(10); // Menjaga kestabilan simulasi Proteus

    }

}


/* ================= KONFIGURASI HARDWARE ================= */


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

}


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 MX_GPIO_Init(void) {

    __HAL_RCC_GPIOA_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();


    GPIO_InitTypeDef GPIO_InitStruct = {0};


    // PA1: Tombol Mute (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);


    // PB0, PB1, PB10, PB11: LED dan 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   LED warna menyala hijau dengan pola yang sama dengan detak jantung

8. Download File[Kembali]

Tidak ada komentar:

Posting Komentar

   BAHAN PRESENTASI UNTUK MATA KULIAH ELEKTRONIKA 2024 Oleh  : MUHAMMAD RHAKA AULIA (2310953009) Dosen Pengampu  : Dr. Darwison, MT Referens...