Tugas Pendahuluan 1 M2
Tugas Pendahuluan Modul 2 Percobaan 1 kondisi 1
- Menyiapkan alat dan bahan.
- Merangkai komponen pada breadboard sesuai dengan gambar rangkaian percobaan.
- Menghubungkan masing masing pin input output.
- Mengunggah program menggunakan ST-LINK ke mikrokontroler.
- Jalankan Rangkaian
- STM32F103C8T6
- Sensor Suhu Lm35
- Kipas DC
- Push Button
- Motor Driver l298N
- Breadboard
- Adaptor
- Resistor
Rangkaian pada gambar bekerja sebagai sistem monitoring detak jantung menggunakan sensor heartbeat, mikrokontroler, LED merah, push button, dan buzzer. Sensor heartbeat membaca denyut jantung pengguna lalu mengirimkan data ke mikrokontroler untuk dihitung menjadi nilai BPM (Beat Per Minute).
Sistem akan memeriksa kondisi BPM yang terbaca. Jika BPM > 70 dan push button tidak ditekan, maka mikrokontroler mengaktifkan LED merah dan buzzer. LED merah berfungsi sebagai indikator visual, sedangkan buzzer sebagai alarm suara bahwa detak jantung melebihi batas yang ditentukan.
Push button digunakan sebagai tombol kontrol alarm. Karena pada kondisi soal tombol tidak ditekan, maka LED dan buzzer akan tetap aktif selama BPM masih di atas 70.
#include "stm32f1xx_hal.h"
/* ======================================================
HANDLE ADC
Digunakan untuk konfigurasi dan pembacaan ADC STM32
====================================================== */
ADC_HandleTypeDef hadc1;
/* ======================================================
VARIABEL GLOBAL
====================================================== */
/* Menyimpan nilai ADC asli dari sensor */
uint32_t adcValue = 0;
/* Menyimpan hasil filter moving average */
uint32_t filteredValue = 0;
/* Penanda apakah detak sudah terdeteksi */
uint8_t beatDetected = 0;
/* Menyimpan hasil BPM */
uint32_t BPM = 0;
/* Menyimpan waktu detak terakhir */
uint32_t lastBeatTime = 0;
/* Menyimpan interval antar detak */
uint32_t interval = 0;
/*
buttonState = 0 -> tombol tidak ditekan
buttonState = 1 -> tombol ditekan
*/
uint8_t buttonState = 0;
/* ======================================================
FILTER MOVING AVERAGE
Digunakan untuk mengurangi noise dari sensor
====================================================== */
/* Jumlah data yang dirata-ratakan */
#define FILTER_SIZE 10
/* Buffer penyimpanan data ADC */
uint16_t buffer[FILTER_SIZE];
/* Index posisi buffer */
uint8_t indexBuf = 0;
/* ======================================================
FUNGSI MOVING AVERAGE
Merata-ratakan data ADC agar sinyal lebih stabil
====================================================== */
uint16_t moving_average(uint16_t val)
{
/* Simpan data baru ke buffer */
buffer[indexBuf++] = val;
/* Jika index melebihi ukuran buffer,
kembali ke awal */
if(indexBuf >= FILTER_SIZE)
{
indexBuf = 0;
}
/* Variabel penjumlahan */
uint32_t sum = 0;
/* Menjumlahkan seluruh isi buffer */
for(int i = 0; i < FILTER_SIZE; i++)
{
sum += buffer[i];
}
/* Menghasilkan nilai rata-rata */
return (sum / FILTER_SIZE);
}
/* ======================================================
FUNGSI LED
====================================================== */
/* Menyalakan LED merah */
void LED_Merah_On(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
}
/* Mematikan semua LED */
void LED_All_Off(void)
{
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10,
GPIO_PIN_RESET);
}
/* ======================================================
FUNGSI BUZZER
====================================================== */
/* Menyalakan buzzer */
void Buzzer_On(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET);
}
/* Mematikan buzzer */
void Buzzer_Off(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET);
}
/* ======================================================
INTERRUPT PUSH BUTTON
Akan dijalankan saat tombol ditekan
====================================================== */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Jika interrupt berasal dari PA1 */
if(GPIO_Pin == GPIO_PIN_1)
{
/* Toggle status tombol
0 menjadi 1
1 menjadi 0 */
buttonState = !buttonState;
}
}
/* ======================================================
PROTOTYPE FUNCTION
====================================================== */
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
/* ======================================================
PROGRAM UTAMA
====================================================== */
int main(void)
{
/* Inisialisasi HAL Library */
HAL_Init();
/* Konfigurasi clock sistem */
SystemClock_Config();
/* Inisialisasi GPIO */
MX_GPIO_Init();
/* Inisialisasi ADC */
MX_ADC1_Init();
/* Variabel baseline sensor */
uint32_t baseline = 0;
/* ==================================================
LOOP UTAMA
Program berjalan terus menerus
================================================== */
while (1)
{
/* ==============================================
MEMBACA ADC DARI SENSOR HEARTBEAT
============================================== */
/* Memulai ADC */
HAL_ADC_Start(&hadc1);
/* Menunggu konversi selesai */
HAL_ADC_PollForConversion(&hadc1, 10);
/* Mengambil data ADC */
adcValue = HAL_ADC_GetValue(&hadc1);
/* ==============================================
FILTER DATA SENSOR
============================================== */
/* Menghaluskan sinyal ADC */
filteredValue = moving_average(adcValue);
/* ==============================================
BASELINE DINAMIS
Digunakan sebagai referensi sinyal normal
============================================== */
baseline = (baseline * 9 + filteredValue) / 10;
/* Ambang deteksi detak */
uint32_t threshold = baseline + 50;
/* ==============================================
DETEKSI DETAK JANTUNG
============================================== */
/* Jika sinyal melewati threshold
dan sebelumnya belum terdeteksi */
if((filteredValue > threshold) && (beatDetected == 0))
{
/* Tandai detak terdeteksi */
beatDetected = 1;
/* Ambil waktu sekarang */
uint32_t now = HAL_GetTick();
/* Jika sudah ada detak sebelumnya */
if(lastBeatTime != 0)
{
/* Hitung interval antar detak */
interval = now - lastBeatTime;
/* Hindari pembagian nol */
if(interval > 0)
{
/* Rumus BPM
60000 ms = 1 menit */
BPM = 60000 / interval;
}
}
/* Simpan waktu detak terakhir */
lastBeatTime = now;
}
/* Jika sinyal turun di bawah threshold,
sistem siap mendeteksi detak berikutnya */
if(filteredValue < threshold)
{
beatDetected = 0;
}
/* ==============================================
TIMEOUT SENSOR
Jika tidak ada detak selama 2 detik,
BPM dianggap 0
============================================== */
if((HAL_GetTick() - lastBeatTime) > 2000)
{
BPM = 0;
}
/* ==============================================
KONDISI ALARM
Jika:
- BPM > 70
- Tombol belum ditekan
Maka:
- LED merah menyala
- Buzzer berbunyi
============================================== */
if((BPM > 70) && (buttonState == 0))
{
/* Matikan LED lain */
LED_All_Off();
/* Nyalakan LED merah */
LED_Merah_On();
/* Nyalakan buzzer */
Buzzer_On();
}
else
{
/* Jika kondisi tidak terpenuhi,
matikan LED dan buzzer */
LED_All_Off();
Buzzer_Off();
}
/* Delay kecil agar pembacaan stabil */
HAL_Delay(5);
}
}
/* ======================================================
KONFIGURASI CLOCK STM32
Menggunakan internal oscillator HSI
====================================================== */
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/* Mengaktifkan HSI */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
/* PLL tidak digunakan */
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
/* Konfigurasi clock bus */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |
RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_PCLK1 |
RCC_CLOCKTYPE_PCLK2;
/* Sumber clock dari HSI */
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
/* Pembagi clock */
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);
}
/* ======================================================
INISIALISASI ADC1
ADC digunakan membaca sensor heartbeat
====================================================== */
void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
/* Aktifkan clock ADC1 */
__HAL_RCC_ADC1_CLK_ENABLE();
/* Gunakan ADC1 */
hadc1.Instance = ADC1;
/* Mode scan dimatikan */
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
/* Konversi kontinu dimatikan */
hadc1.Init.ContinuousConvMode = DISABLE;
/* Trigger software */
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
/* Format data rata kanan */
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
/* Jumlah channel = 1 */
hadc1.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc1);
/* Konfigurasi channel ADC */
sConfig.Channel = ADC_CHANNEL_0;
/* Rank channel */
sConfig.Rank = ADC_REGULAR_RANK_1;
/* Sampling time */
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
/* ======================================================
INISIALISASI GPIO
====================================================== */
void MX_GPIO_Init(void)
{
/* Aktifkan clock GPIO */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* ==============================================
PA0 = INPUT ADC SENSOR HEARTBEAT
============================================== */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* ==============================================
PA1 = PUSH BUTTON INTERRUPT
============================================== */
GPIO_InitStruct.Pin = GPIO_PIN_1;
/* Interrupt falling edge */
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
/* Pull up internal */
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Aktifkan interrupt EXTI1 */
HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
/* ==============================================
PB0 = LED
PB1 = LED
PB10 = LED MERAH
PB11 = BUZZER
============================================== */
GPIO_InitStruct.Pin = GPIO_PIN_0 |
GPIO_PIN_1 |
GPIO_PIN_10 |
GPIO_PIN_11;
/* Output push pull */
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
/* Kecepatan rendah */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* Pastikan semua output mati di awal */
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_0 |
GPIO_PIN_1 |
GPIO_PIN_10 |
GPIO_PIN_11,
GPIO_PIN_RESET);
}
- Download File Rangkaian (klik disini)
- Download Datasheet Heartbeat Sensor (klik disini)
- Download Datasheet Resistor (klik disini)
- Download Datasheet LED (klik disini)
- Download Datasheet Buzzer (klik disini)
Comments
Post a Comment