Percobaan 1 kondisi 5




a) Prosedur

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, GPIO output, EXTI dan ADC_IN

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

b) Hardware

  • 1. STM32F103C8


    2. Heartbeat Sensor


    3. Breadboard


    4. LED

    5. Buzzer

    6. Resistor

    7. Push Button


    Diagram blok:

c) Rangkaian Simulasi dan Prinsip Kerja



Rangkaian ini merupakan sistem kontrol berbasis mikrokontroler STM32 yang menggunakan dua input digital, yaitu sensor IR pada pin PA0 dan push button pada pin PA1. Kedua input dikonfigurasi sebagai pull-down sehingga kondisi awal bernilai LOW, sedangkan tiga pin output (PB0, PB1, PB2) digunakan untuk mengendalikan LED. Setelah sistem diberi catu daya, mikrokontroler melakukan inisialisasi dan kemudian bekerja dalam loop untuk membaca kondisi input secara terus-menerus.

Ketika sensor IR (PA0) bernilai LOW, sistem akan mengecek kondisi push button (PA1). Jika tombol ditekan (HIGH), maka LED pada PB1 akan menyala, sedangkan LED lainnya mati. Namun jika tombol tidak ditekan (LOW), maka semua LED dalam kondisi mati. Sebaliknya, ketika sensor IR bernilai HIGH, sistem kembali mengecek tombol, di mana jika tombol LOW maka LED pada PB0 menyala, dan jika tombol HIGH maka LED PB1 dan PB2 menyala secara bersamaan.

Pada rangkaian, resistor digunakan sebagai pembatas arus pada LED serta sebagai pull-down untuk menjaga kestabilan logika input. Sistem ini bekerja secara berulang dengan delay singkat, sehingga mampu merespons perubahan kondisi sensor dan tombol secara real-time dengan keluaran LED yang berbeda-beda sesuai kombinasi input.


d) Flowchart





Listing Program
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Heart Rate Monitor + Interrupt ON/OFF System ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private variables ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; /* ================= VARIABLE ================= */ uint32_t adcValue = 0; uint32_t filteredValue = 0; uint32_t BPM = 0; uint32_t interval = 0; uint32_t lastBeatTime = 0; uint32_t baseline = 0; uint8_t beatDetected = 0; uint8_t systemON = 1; /* ================= FILTER ================= */ #define FILTER_SIZE 10 uint16_t buffer[FILTER_SIZE]; uint8_t indexBuf = 0; /* ================= FUNCTION PROTOTYPE ================= */ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_ADC1_Init(void); /* ================= FILTER FUNCTION ================= */ 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; } /* ================= INTERRUPT CALLBACK ================= */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { static uint32_t lastInterrupt = 0; if(GPIO_Pin == BUTTON_Pin) { // Debounce if(HAL_GetTick() - lastInterrupt > 200) { systemON = !systemON; // Reset output saat OFF if(systemON == 0) { HAL_GPIO_WritePin(GPIOB, LED_GREEN_Pin | LED_YELLOW_Pin | LED_RED_Pin | BUZZER_Pin, GPIO_PIN_RESET); BPM = 0; beatDetected = 0; } lastInterrupt = HAL_GetTick(); } } } /* ================= MAIN ================= */ int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC1_Init(); while (1) { // ===== SISTEM OFF ===== if(systemON == 0) { HAL_GPIO_WritePin(GPIOB, LED_GREEN_Pin | LED_YELLOW_Pin | LED_RED_Pin | BUZZER_Pin, GPIO_PIN_RESET); HAL_Delay(100); continue; } // ===== BACA ADC ===== HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 10); adcValue = HAL_ADC_GetValue(&hadc1); // ===== FILTER ===== filteredValue = moving_average(adcValue); // ===== BASELINE ===== baseline = (baseline * 9 + filteredValue) / 10; uint32_t threshold = baseline + 80; // ===== DETEKSI DETAK ===== if(filteredValue > threshold && beatDetected == 0) { beatDetected = 1; uint32_t now = HAL_GetTick(); if(lastBeatTime != 0) { interval = now - lastBeatTime; uint32_t tempBPM = 60000 / interval; // Filter BPM tidak normal if(tempBPM < 200) { BPM = tempBPM; } } lastBeatTime = now; } if(filteredValue < threshold) { beatDetected = 0; } // ===== TIMEOUT ===== if(HAL_GetTick() - lastBeatTime > 2000) { BPM = 0; } // ===== RESET OUTPUT ===== HAL_GPIO_WritePin(GPIOB, LED_GREEN_Pin | LED_YELLOW_Pin | LED_RED_Pin | BUZZER_Pin, GPIO_PIN_RESET); // ===== BPM RENDAH ===== if(BPM > 30 && BPM < 60) { HAL_GPIO_WritePin(GPIOB, LED_YELLOW_Pin, GPIO_PIN_SET); } // ===== BPM NORMAL ===== else if(BPM >= 60 && BPM <= 80) { HAL_GPIO_WritePin(GPIOB, LED_GREEN_Pin, GPIO_PIN_SET); } // ===== BPM TINGGI ===== else if(BPM > 80) { HAL_GPIO_WritePin(GPIOB, LED_RED_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, BUZZER_Pin, GPIO_PIN_SET); } HAL_Delay(10); } } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit = {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(); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2; if(HAL_RCCEx_PeriphCLKConfig( &PeriphClkInit) != HAL_OK) { Error_Handler(); } } /* ================= ADC ================= */ 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(); } sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5; if(HAL_ADC_ConfigChannel( &hadc1, &sConfig) != HAL_OK) { Error_Handler(); } } /* ================= GPIO ================= */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /* Reset Output */ HAL_GPIO_WritePin(GPIOB, LED_GREEN_Pin | LED_YELLOW_Pin | LED_RED_Pin | BUZZER_Pin, GPIO_PIN_RESET); /* BUTTON INTERRUPT */ GPIO_InitStruct.Pin = BUTTON_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(BUTTON_GPIO_Port, &GPIO_InitStruct); /* Enable Interrupt */ HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI1_IRQn); /* LED + BUZZER OUTPUT */ GPIO_InitStruct.Pin = LED_GREEN_Pin | LED_YELLOW_Pin | LED_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); } /* ================= ERROR HANDLER ================= */ void Error_Handler(void) { __disable_irq(); while (1) { } } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t *file, uint32_t line) { } #endif

e) Video Demo

Tempel kode embed video demo di sini...

f) Kondisi

percobaan 1 kondisi 5


g) Video Simulasi








h) Download File














Komentar

Postingan populer dari blog ini

kuliah