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]

a. Hardware
1. STM32F103C8
TM32F103C8 adalah mikrokontroler berbasis ARM Cortex-M3 yang  dikembangkan oleh STMicroelectronics. Mikrokontroler ini sering digunakan dalam pengembangan sistem tertanam karena kinerjanya yang baik, konsumsi daya yang rendah, dan kompatibilitas dengan berbagai protokol komunikasi. Pada praktikum ini, kita menggunakan STM32F103C8 yang dapat diprogram menggunakan berbagai  metode, termasuk komunikasi serial (USART), SWD (Serial Wire Debug), atau JTAG untuk berhubungan dengan komputer maupun perangkat lain.

2. Heartbeat Sensor

Touch sensor adalah sensor yang digunakan untuk mengukur frekuensi detak jantung manusia dalam satuan beats per minute (BPM).

3. Pushbutton
Pushbutton adalah komponen sakelar mekanis sederhana yang dioperasikan dengan cara ditekan untuk menghubungkan (on) atau memutuskan (off) aliran arus listrik dalam suatu rangkaian..

4. LED

LED adalah dioda semikonduktor yang dapat memancarkan cahaya ketika dialiri arus listrik. LED digunakan dalam berbagai aplikasi seperti indikator elektronik, pencahayaan, dan display. LED hanya bekerja pada arah bias maju dan memiliki berbagai warna yang ditentukan oleh material semikonduktornya.

5. Buzzer
Buzzer adalah suatu komponen elektronika yang berfungsi untuk mengubah energi listrik menjadi energi suara (bunyi) melalui mekanisme getaran. Komponen ini termasuk dalam kategori output device karena digunakan untuk memberikan respon berupa suara terhadap suatu kondisi atau perintah dalam rangkaian elektronik.

6. Resistor 

Resistor adalah komponen elektronik pasif yang berfungsi untuk membatasi arus listrik dalam suatu rangkaian. Resistor bekerja berdasarkan hukum Ohm, yang menyatakan bahwa tegangan (V) = arus (I) × resistansi (R). Resistor memiliki satuan Ohm (Ω) dan digunakan dalam berbagai aplikasi seperti pembagian tegangan, kontrol arus, dan proteksi rangkaian elektronik.

b. Diagram Blok


3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]


Prinsip Kerja :

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]

A. Flowchart


B. Listring Program

#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. Analisa[Kembali]




7Download File[Kembali]

Download Rangkaian Simulasi [Klik Disini]
Download Video Simulasi [Klik Disini]
Download Analisa [Klik Disini]

No comments:

Post a Comment

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