Tugas Pendahuluan 1 M2

 Tugas Pendahuluan Modul 2 Percobaan 1 kondisi 1



1. Prosedur 
  1. Menyiapkan alat dan bahan.
  2. Merangkai komponen pada breadboard sesuai dengan gambar rangkaian percobaan.
  3. Menghubungkan masing masing pin input output.
  4. Mengunggah program menggunakan ST-LINK ke mikrokontroler.
  5. 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.





LISTIN PROGRAM

#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);

}



6. Kondisi [kembali]

Percobaan 1 Kondisi 1 
Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi Sensor Heartbeat membaca BPM>70 dan push button tidak ditekan, maka LED menyala merah dan Buzzer berbunyi.

7. Video Simulasi [kembali]





8. Download File [kembali]











Comments

Popular posts from this blog

Mikroprosesor dan Mikrokontroler

KONTROL TANK AIR