Tugas Pendahuluan 1 M2
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]
1. STM32F103C8
Microcontroller | ARM Cortex-M3 |
Operating Voltage | 3.3 V |
Input Voltage (recommended) | 5 V |
Input Voltage (limit) | 2 – 3.6 V |
Digital I/O Pins | 32 |
PWM Digital I/O Pins | 15 |
Analog Input Pins | 10 (dengan resolusi 12-bit ADC) |
DC Current per I/O Pin | 25 mA |
DC Current for 3.3V Pin | 150 mA |
Flash Memory | 64 KB |
SRAM | 20 KB |
EEPROM | Emulasi dalam Flash |
Clock Speed | 72 MHz |
2. Sensor Heartbeat
3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
Rangkaian menggunakan sensor heartbeat sebagai input untuk membaca nilai BPM (Beat Per Minute) yang diproses oleh mikrokontroler STM32F103C8. Sistem juga dilengkapi push button, LED merah, dan buzzer sebagai indikator keluaran.
Pada kondisi percobaan ini, ketika sensor heartbeat mendeteksi BPM > 70 dan push button tidak ditekan, maka mikrokontroler akan mengaktifkan LED merah dan buzzer. LED merah berfungsi sebagai indikator kondisi denyut jantung di atas batas yang ditentukan, sedangkan buzzer memberikan alarm peringatan.
Sebaliknya, jika kondisi tersebut tidak terpenuhi, maka LED merah dan buzzer akan mati. Dengan demikian, rangkaian bekerja sebagai sistem monitoring denyut jantung sederhana berbasis STM32 dengan indikator visual dan suara.
4. Flowchart dan Listing Program [Kembali]
#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 buzzerOff = 0;
/* ================= 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 (uint16_t)(sum / FILTER_SIZE);
}
/* ================= OUTPUT CONTROL ================= */
// Berdasarkan skema: Merah=PB10, Kuning=PB1, Hijau=PB0, Buzzer=PB11
void Mode_Bahaya() {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); // Merah ON
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET); // Hijau & Kuning OFF
if(!buzzerOff) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET); // Buzzer ON
else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET);
}
void Mode_Aman() {
// Matikan semua output (Merah, Kuning, Hijau, dan Buzzer)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 | GPIO_PIN_11, GPIO_PIN_RESET);
buzzerOff = 0; // Reset status mute
}
/* ================= INTERRUPT ================= */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if(GPIO_Pin == GPIO_PIN_1) buzzerOff = !buzzerOff; // Tombol PA1
}
/* ================= 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) {
// 1. Baca Sensor
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
adcValue = HAL_ADC_GetValue(&hadc1);
filteredValue = moving_average(adcValue);
// 2. Logika Deteksi
baseline = (baseline * 9 + filteredValue) / 10;
uint32_t threshold = baseline + 50;
if(filteredValue > threshold && beatDetected == 0) {
beatDetected = 1;
uint32_t now = HAL_GetTick();
if(lastBeatTime != 0) {
interval = now - lastBeatTime;
if(interval > 250) BPM = 60000 / interval;
}
lastBeatTime = now;
}
if(filteredValue < (threshold - 10)) beatDetected = 0;
// 3. Timeout (Jika jari dilepas)
if(HAL_GetTick() - lastBeatTime > 2500) BPM = 0;
/* ==== LOGIKA SESUAI PERMINTAAN ==== */
if(BPM > 70) {
Mode_Bahaya(); // Hanya Merah & Buzzer yang aktif
} else {
Mode_Aman(); // LED Hijau, Kuning, dan Buzzer mati
}
HAL_Delay(10);
}
}
/* ================= KONFIGURASI HARDWARE ================= */
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;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
}
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; // PA0
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// PA1 Button
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);
// PB0, PB1, PB10, 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);
}
5. Video Demo [Kembali]
6. Kondisi [Kembali]
7. Video Simulasi [Kembali]
8. Download File [Kembali]
Rangkaian Simulasi Link
Komentar
Posting Komentar