TP MODUL 2 P1K4



Percobaan 1 kondisi 4

1. Prosedur[Kembali]

    1. Buat rangkaian sesuai dengan kondisi percobaan
    2. Buat program 
    4. Jalankan simulasinya 
    5. Selesai.

2. Hardware dan Diagram Blok[Kembali]

Hardware :

  • STM32F103C8T6
  • Heartbeat Sensor


  • Push Button

  • Buzzer 
  • LED
  • Resistor

  • Breadboard 

Diagram Blok

3. Rangkaian Simulasi[Kembali]

  • Rangkaian sebelum di running
  • Rangkaian setelah di running

  • Prinsip Kerja 

Rangkaian ini bekerja dengan cara mengambil sinyal detak jantung dari sensor yang kemudian diterjemahkan menjadi angka digital oleh mikrokontroler agar bisa diolah lebih lanjut. Untuk memastikan hasil yang akurat, program pertama-tama akan menyaring data mentah tersebut menggunakan metode rata-rata agar gangguan atau "noise" hilang, serta secara otomatis membuat garis ambang batas (baseline) yang bisa menyesuaikan diri dengan naik-turunnya kekuatan sinyal sensor. 

Setiap kali sinyal sensor melonjak melewati ambang batas tersebut, sistem akan mencatatnya sebagai satu detak dan menghitung jarak waktu antar detakan untuk menentukan nilai BPM atau kecepatan jantung per menit. Berdasarkan angka BPM yang didapat, alat ini akan memberikan laporan visual dan suara: jika detak jantung terbaca sangat lambat (antara 30 hingga 60), lampu akan menyala biru; jika berada di rentang normal (60 hingga 100), lampu akan berubah menjadi hijau; dan jika detak jantung terlalu cepat (di atas 100), lampu akan menyala merah disertai bunyi buzzer sebagai alarm peringatan. 

Namun, jika dalam waktu dua setengah detik tidak ada detak yang terbaca, sistem akan menganggap tidak ada aktivitas dan mematikan semua indikator secara otomatis.


4. Flowchart dan Listing Program[Kembali]

  • Flowchart

  • Listing Program
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Heartbeat Monitor with ADC Adaptive Baseline ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ #define FILTER_SIZE 10 /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; /* USER CODE BEGIN PV */ 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 baseline = 0; /* Buffer untuk Moving Average Filter */ uint16_t buffer[FILTER_SIZE]; uint8_t indexBuf = 0; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_ADC1_Init(void); /* USER CODE BEGIN PFP */ 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 (uint16_t)(sum / FILTER_SIZE); } void LED_Biru(void) { HAL_GPIO_WritePin(GPIOB, blue_Pin, GPIO_PIN_SET); } void LED_Hijau(void) { HAL_GPIO_WritePin(GPIOB, green_Pin, GPIO_PIN_SET); } void LED_Merah(void) { HAL_GPIO_WritePin(GPIOB, red_Pin, GPIO_PIN_SET); } void LED_Mati(void) { HAL_GPIO_WritePin(GPIOB, blue_Pin | green_Pin | red_Pin, GPIO_PIN_RESET); } void Buzzer_On(void) { HAL_GPIO_WritePin(GPIOB, buzzer_Pin, GPIO_PIN_SET); } void Buzzer_Off(void){ HAL_GPIO_WritePin(GPIOB, buzzer_Pin, GPIO_PIN_RESET); } /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC1_Init(); /* USER CODE BEGIN 2 */ // Inisialisasi awal baseline agar tidak mulai dari nol HAL_ADC_Start(&hadc1); if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK) { baseline = HAL_ADC_GetValue(&hadc1); } /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* ==== BACA ADC ==== */ HAL_ADC_Start(&hadc1); if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) { adcValue = HAL_ADC_GetValue(&hadc1); } /* ==== FILTER (Moving Average) ==== */ filteredValue = moving_average(adcValue); /* ==== BASELINE (ADAPTIF) ==== */ // Mengikuti tren sinyal secara lambat (Low Pass Effect) baseline = (baseline * 9 + filteredValue) / 10; uint32_t threshold = baseline + 50; // Toleransi detak di atas rata-rata /* ==== DETEKSI DETAK + INTERVAL ==== */ if(filteredValue > threshold && beatDetected == 0) { beatDetected = 1; uint32_t now = HAL_GetTick(); if(lastBeatTime != 0) { interval = now - lastBeatTime; if(interval > 300) { // Debouncing: abaikan jika detak terlalu cepat (noise) BPM = 60000 / interval; } } lastBeatTime = now; } else if(filteredValue < threshold) { beatDetected = 0; } /* ==== TIMEOUT (TIDAK ADA DETAK) ==== */ if(HAL_GetTick() - lastBeatTime > 2500) { BPM = 0; } /* ==== OUTPUT INDIKATOR ==== */ LED_Mati(); // Reset semua LED sebelum update kondisi if(BPM > 0) { if(BPM > 30 && BPM < 60) { LED_Biru(); // Lambat (Biru menggantikan Kuning) Buzzer_Off(); } else if(BPM >= 60 && BPM <= 100) { LED_Hijau(); // Normal Buzzer_Off(); } else if(BPM > 100) { LED_Merah(); // Cepat / Bahaya Buzzer_On(); } } else { Buzzer_Off(); } HAL_Delay(10); // Sampling Rate sekitar 100Hz /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ 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.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } 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; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } } /** * @brief ADC1 Initialization Function * @param None * @retval None */ static void MX_ADC1_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_1; // Sudah menggunakan Channel 1 sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOB, blue_Pin|green_Pin|red_Pin|buzzer_Pin, GPIO_PIN_RESET); GPIO_InitStruct.Pin = blue_Pin|green_Pin|red_Pin|buzzer_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } void Error_Handler(void) { __disable_irq(); while (1) { } }

5. Kondisi[Kembali]

Percobaan 1 Kondisi 4

Buatlah rangkaian seperti pada gambar percobaan 1 namun ganti led nya dengan LED RGB dengan logika dasar yang sama.

6. Video Simulasi[Kembali]

 



7. Download File[Kembali]

Rangkaian [Download
Listing Program [Download]
Video Simulasi [Download]  




Komentar