Tugas Pendahuluan 1 Modul II

 [KEMBALI KE MENU SEBELUMNYA]


Tugas Pendahuluan 1 Modul II
(Percobaan 1 Kondisi 8)

1. Prosedur

1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.
2. Buat program untuk mikrokontroler STM32F103C8 di software STM32 CubeIDE.
3. debug program dan simpan dalam bentuk hex
4. uploud atau masukkan hex tadi ke dalam STM32F103C8 di proteus
5.Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.
6. Selesai.


Hardware :

a) Mikrokontroler STM32F103C8








2. Heart Beat Sensor



3. Buzzer


4. Power Supply

 
5. LED

6. Potensiometer




7. Switch



8. Adaptor



9. Breadboard


10.Resistor 220 ohm






Diagram Blok  :








Rangkaian Simulasi Sebelum dirunning:




Rangkaian Simulasi Setelah dirunning:
 





Prinsip Kerja : 

Sistem bekerja dengan membaca sinyal analog dari sensor detak jantung yang masuk ke pin ADC pada STM32. Sinyal ini kemudian dikonversi menjadi data digital dan diproses menggunakan metode moving average untuk mengurangi noise sehingga bentuk gelombang detak menjadi lebih halus. Setelah itu, sistem menentukan nilai baseline secara adaptif sebagai nilai acuan kondisi normal sinyal, lalu menetapkan threshold sedikit di atas baseline untuk mendeteksi adanya puncak sinyal yang merepresentasikan detak jantung.

Ketika nilai sinyal hasil filter melebihi threshold, mikrokontroler menganggap terjadi detak jantung dan mengaktifkan LED hijau (PB0), sedangkan saat sinyal berada di bawah threshold LED dimatikan. Proses ini berlangsung terus-menerus dengan jeda sampling yang cepat, sehingga LED berkedip mengikuti pola detak jantung secara real-time sesuai dengan kondisi pada rangkaian.

4. Flowchart dan Listing Program


Flowchart :




Listing Program :
#include "main.h" // Library utama STM32 HAL (akses GPIO, ADC, dll) /* ================= PRIVATE VARIABLES ================= */ ADC_HandleTypeDef hadc1; // Handle untuk mengontrol ADC1 /* ================= DEFINE ================= */ #define LED_HIJAU GPIO_PIN_0 // LED hijau terhubung ke pin PB0 /* ================= VARIABLE ================= */ uint32_t adcValue = 0; // Menyimpan data mentah dari ADC uint32_t filteredValue = 0; // Menyimpan data hasil filter uint32_t baseline = 0; // Nilai acuan sinyal (adaptif) /* ================= FILTER FUNCTION ================= */ uint32_t moving_average(uint32_t newValue) // Fungsi untuk meratakan sinyal (filter) { static uint32_t history[5] = {0}; // Array menyimpan 5 data terakhir static uint8_t index = 0; // Index posisi data dalam array uint32_t sum = 0; // Variabel penjumlahan history[index] = newValue; // Masukkan data baru ke array index = (index + 1) % 5; // Geser index (circular buffer) for (int i = 0; i < 5; i++) // Loop untuk menjumlahkan data { sum += history[i]; // Tambahkan semua data } return sum / 5; // Kembalikan nilai rata-rata } /* ================= MAIN PROGRAM ================= */ int main(void) { HAL_Init(); // Inisialisasi HAL (hardware abstraction layer) SystemClock_Config(); // Konfigurasi clock sistem MX_GPIO_Init(); // Inisialisasi GPIO MX_ADC1_Init(); // Inisialisasi ADC HAL_GPIO_WritePin(GPIOB, LED_HIJAU, GPIO_PIN_RESET); // Pastikan LED mati di awal while (1) // Loop utama (berjalan terus) { // ===== BACA SENSOR (ADC) ===== HAL_ADC_Start(&hadc1); // Mulai konversi ADC HAL_ADC_PollForConversion(&hadc1, 10); // Tunggu ADC selesai (timeout 10ms) adcValue = HAL_ADC_GetValue(&hadc1); // Ambil nilai hasil konversi // ===== FILTER DATA ===== filteredValue = moving_average(adcValue); // Haluskan sinyal (kurangi noise) // ===== BASELINE AWAL ===== if (baseline == 0) // Jika pertama kali dijalankan { baseline = filteredValue; // Set baseline awal } // ===== BASELINE ADAPTIF ===== baseline = (baseline * 9 + filteredValue) / 10; // Update baseline agar mengikuti perubahan sinyal (low-pass filter) // ===== THRESHOLD ===== uint32_t threshold = baseline + 15; // Menentukan batas deteksi detak (offset dari baseline) // ===== DETEKSI DETAK ===== if (filteredValue > threshold) { HAL_GPIO_WritePin(GPIOB, LED_HIJAU, GPIO_PIN_SET); // Jika sinyal > threshold → detak terdeteksi → LED ON } else { HAL_GPIO_WritePin(GPIOB, LED_HIJAU, GPIO_PIN_RESET); // Jika tidak → LED OFF } HAL_Delay(5); // Delay 5 ms → sampling sekitar 200 Hz } } /* ================= SYSTEM CLOCK ================= */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Struktur konfigurasi osilator RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // Struktur konfigurasi clock RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; // Gunakan HSI (internal clock) RCC_OscInitStruct.HSIState = RCC_HSI_ON; // Aktifkan HSI RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Tidak pakai PLL HAL_RCC_OscConfig(&RCC_OscInitStruct); // Terapkan konfigurasi osilator RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // Sumber clock dari HSI RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // Tidak dibagi HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); // Terapkan konfigurasi clock } /* ================= ADC CONFIG ================= */ static void MX_ADC1_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; // Struktur konfigurasi channel ADC hadc1.Instance = ADC1; // Gunakan ADC1 hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; // Mode single channel hadc1.Init.ContinuousConvMode = DISABLE; // Tidak continuous (manual start) hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // Trigger dari software hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // Data rata kanan hadc1.Init.NbrOfConversion = 1; // Hanya 1 channel HAL_ADC_Init(&hadc1); // Inisialisasi ADC sConfig.Channel = ADC_CHANNEL_0; // Gunakan channel 0 (PA0) sConfig.Rank = ADC_REGULAR_RANK_1; // Ranking pertama sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; // Sampling cepat HAL_ADC_ConfigChannel(&hadc1, &sConfig); // Terapkan konfigurasi channel } /* ================= GPIO CONFIG ================= */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // Struktur konfigurasi GPIO __HAL_RCC_GPIOA_CLK_ENABLE(); // Aktifkan clock GPIOA __HAL_RCC_GPIOB_CLK_ENABLE(); // Aktifkan clock GPIOB HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 | GPIO_PIN_11, GPIO_PIN_RESET); // Set semua LED dalam kondisi mati GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 | GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Mode output push-pull GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Kecepatan rendah HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // Terapkan konfigurasi GPIO } /* ================= ERROR HANDLER ================= */ void Error_Handler(void) { __disable_irq(); // Nonaktifkan interrupt jika terjadi error while (1) { // Sistem berhenti di sini jika error } }



Percobaan 1 Kondisi 8
Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi LED warna menyala hijau dengan pola yang sama dengan detak jantung









Download HTML [Download]
Download File Rangkaian  [Download]
Download Listing Program [Download]
Download Video Simulasi [Download]
Datasheet Mikrokontroler STM32F103C8 [Download]
Datasheet Sensor Infrared [Download]
Datasheet LED [Download]
Datasheet Buzzer [Download]








Komentar

Postingan populer dari blog ini