Modul 2 Percobaan 1
1. Prosedur [Kembali]
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 dan GPIO output
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
2. Hardware [Kembali]
- Hardware
3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
- Deteksi Sinyal Analog: Sensor Heartbeat bekerja dengan memancarkan cahaya ke pembuluh darah dan mendeteksi perubahan intensitas cahaya pantul akibat aliran darah. Perubahan tersebut kemudian diubah menjadi sinyal tegangan analog yang merepresentasikan denyut jantung pengguna.
- Konversi Data (ADC): Mikrokontroler menerima sinyal analog dari sensor melalui pin ADC (Analog to Digital Converter). ADC mengubah sinyal analog menjadi data digital sehingga dapat diproses oleh sistem mikrokontroler.
- Perhitungan BPM: Program melakukan perhitungan Beats Per Minute (BPM) berdasarkan interval waktu antar puncak sinyal denyut jantung yang terdeteksi dalam periode tertentu.
- Pembacaan Push Button: Selain membaca sensor heartbeat, sistem juga memantau kondisi push button sebagai input tambahan untuk menentukan status alarm.
- Komparasi Logika: Mikrokontroler membandingkan nilai BPM yang terbaca dengan nilai ambang batas yang telah ditentukan, yaitu BPM > 70, serta memeriksa kondisi push button apakah ditekan atau tidak.
- Eksekusi Kondisi BPM > 70 dan Push Button Tidak Ditekan: Jika hasil pembacaan menunjukkan BPM lebih dari 70 dan push button dalam kondisi tidak ditekan, maka mikrokontroler akan mengirimkan sinyal logika HIGH ke pin GPIO yang terhubung dengan LED merah dan buzzer.
- Aktivasi Indikator Output: LED merah akan menyala sebagai indikator visual, sedangkan buzzer akan aktif dan menghasilkan suara sebagai indikator audio bahwa kondisi BPM melebihi batas yang ditentukan.
- Kondisi Normal: Jika BPM kurang dari atau sama dengan 70 atau push button ditekan, maka LED dan buzzer akan berada pada kondisi OFF sehingga tidak ada peringatan yang diberikan.
- Umpan Balik Real-time: Sistem bekerja secara kontinu dalam bentuk looping sehingga perubahan nilai BPM maupun kondisi push button dapat dipantau secara real-time, dan status LED serta buzzer akan otomatis menyesuaikan dengan logika program yang telah ditentukan.
4. Flowchart [Kembali]
- Flowchart
- Listing Program
#include "main.h"
/* Private define */
#define FILTER_SIZE 10
/* Private variables */
ADC_HandleTypeDef hadc1;
uint32_t adcValue = 0;
uint32_t filteredValue = 0;
uint16_t buffer[FILTER_SIZE];
uint8_t indexBuf = 0;
/* BUTTON */
uint8_t buttonState = 1;
/* Function */
uint32_t Calculate_Moving_Average(uint16_t
new_value)
{
buffer[indexBuf++]
= new_value;
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;
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 |
GPIO_PIN_11,
GPIO_PIN_RESET);
for(int
i=0;i<FILTER_SIZE;i++) buffer[i]=0;
while (1)
{
/* ==== BACA ADC
==== */
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1,
10) == HAL_OK)
{
adcValue = HAL_ADC_GetValue(&hadc1);
filteredValue = Calculate_Moving_Average(adcValue);
}
HAL_ADC_Stop(&hadc1);
/* ==== BACA
BUTTON (PA1) ==== */
buttonState = HAL_GPIO_ReadPin(GPIOA,
GPIO_PIN_1);
/* ==== KONDISI
BARU ==== */
// anggap
threshold BPM > 70 ≈ ADC > 2457
if
(filteredValue > 2457 && buttonState == GPIO_PIN_SET)
{
// LED MERAH
ON
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_10, GPIO_PIN_SET);
// BUZZER ON
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_11, GPIO_PIN_SET);
// LED lain
OFF
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);
}
else
{
// semua
OFF
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 |
GPIO_PIN_11,
GPIO_PIN_RESET);
}
HAL_Delay(10);
}
}
/* ================= 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 */
GPIO_InitStruct.Pin
= GPIO_PIN_0;
GPIO_InitStruct.Mode
= GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA,
&GPIO_InitStruct);
/* PA1 = BUTTON
(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);
/* LED + 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]
7. Video Simulasi [Kembali]
8. Download File [Kembali]
Rangkaian Simulasi [klik disini]
Video Simulasi [klik disini]
Komentar
Posting Komentar