1. Prosedur [Kembali]

  • 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]


STM32F103C8


Heartbeat Sensor


LED


Buzzer


Resistor

Pushbutton

3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]


Prinsip kerja rangkaian pada gambar mengikuti alur flowchart yang kamu buat, yaitu sistem pendeteksi detak jantung dengan indikator LED dan buzzer. Berikut penjelasan dalam bentuk paragraf yang runtut:

Rangkaian dimulai dari kondisi mulai, di mana mikrokontroler STM32F103C8 melakukan inisialisasi sistem. Pada tahap ini, mikrokontroler mengatur konfigurasi pin input-output, mengaktifkan pembacaan sinyal dari sensor detak jantung (HB1), serta menyiapkan output untuk LED dan buzzer. Sensor heart beat akan mendeteksi denyut jantung dan menghasilkan sinyal analog yang kemudian dapat disesuaikan sensitivitasnya menggunakan potensiometer (RV1) sebelum dibaca oleh mikrokontroler.

Setelah inisialisasi, sistem masuk ke dua kondisi utama sesuai flowchart. Pertama, mikrokontroler membaca nilai detak jantung. Jika nilai yang terbaca berada pada sekitar 60 BPM, maka mikrokontroler memberikan output ke LED merah sehingga LED merah menyala sebagai indikator kondisi tertentu (misalnya detak rendah atau normal batas bawah sesuai desain).

Kondisi kedua adalah ketika pushbutton ditekan. Tombol ini berfungsi sebagai input manual ke mikrokontroler. Saat tombol ditekan, mikrokontroler akan mendeteksi logika HIGH/LOW pada pin input dan kemudian mengaktifkan buzzer, sehingga buzzer berbunyi sebagai tanda peringatan atau respon dari input pengguna.

Kedua kondisi ini (pembacaan BPM dan penekanan pushbutton) berjalan sebagai percabangan logika. Setelah salah satu atau kedua kondisi terpenuhi, sistem akan menuju tahap akhir yaitu selesai, yang dalam implementasi nyata biasanya berarti sistem kembali mengulang proses (looping) untuk monitoring secara terus-menerus.

Secara keseluruhan, rangkaian ini bekerja sebagai sistem monitoring sederhana: sensor membaca detak jantung, mikrokontroler memproses data, lalu memberikan output berupa LED sebagai indikator visual dan buzzer sebagai indikator suara berdasarkan kondisi yang terjadi.


4. Flowchart dan Listing Program[Kembali]



Blok Diagram





Flowchart 

#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 buzzerActive = 0;     // Status buzzer (0=mati, 1=nyala)

/* ================= 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 ditekan
    {
        // Toggle buzzer (nyala/mati) setiap kali tombol ditekan
        if(buzzerActive == 0) {
            Buzzer_On();
            buzzerActive = 1;
        } else {
            Buzzer_Off();
            buzzerActive = 0;
        }
    }
}

/* ================= 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 + INTERVAL ==== */
        if(filteredValue > threshold && beatDetected == 0)
        {
            beatDetected = 1;
            uint32_t now = HAL_GetTick();
            if(lastBeatTime != 0)
            {
                interval = now - lastBeatTime;
                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 SESUAI KONDISI YANG DIINGINKAN ==== */
        // Kondisi: Sensor Heartbeat membaca BPM 60, maka LED menyala merah
        if(BPM >= 55 && BPM <= 65)  // Range sekitar 60 (55-65)
        {
            LED_Merah();  // LED merah menyala
            
            // Buzzer dikontrol oleh push button (dari interrupt)
            // Status buzzer sudah diatur di callback interrupt
        }
        else if(BPM > 0)
        {
            // Jika BPM bukan 60, semua LED mati
            LED_Mati();
            
            // Matikan buzzer jika sedang menyala
            if(buzzerActive == 1) {
                Buzzer_Off();
                buzzerActive = 0;
            }
        }
        else
        {
            // Tidak ada detak jantung
            LED_Mati();
            if(buzzerActive == 1) {
                Buzzer_Off();
                buzzerActive = 0;
            }
        }
        
        HAL_Delay(5);
    }
}

/* ================= CLOCK ================= */
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 ================= */
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 ================= */
void MX_GPIO_Init(void)
{
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    /* PA0 = ADC Input */
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    /* PA1 = Push Button (dengan interrupt) */
    GPIO_InitStruct.Pin = GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;  // Interrupt pada saat falling edge (tombol ditekan)
    GPIO_InitStruct.Pull = GPIO_PULLUP;            // Pull-up internal
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(EXTI1_IRQn);
    
    /* LED (PB0=Hijau, PB1=Kuning, PB10=Merah) + BUZZER (PB11) */
    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);
    
    /* Inisialisasi semua output ke LOW (mati) */
    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 namun ganti led nya dengan LED RGB dengan logika dasar yang sama

7. Video Simulasi[Kembali]


8. Download File[Kembali]

Download Rangkaian Simulasi [Klik Disini]

No comments:

Post a Comment

  BAHAN PRESENTASI UNTUK MATA KULIAH  ELEKTRONIKA 2024 Nama : Muhammad Fadhlurrahman Yuzary NIM : 2310952015 Elektronika A Dosen Pengampu ; ...