Laporan Akhir 1 M2



LAPORAN AKHIR

PERCOBAAN 1 

 1. Prosedur [kembali]

  1. Pahami terlebih dahulu kondisi yang akan digunakan
  2. Buka software Proteus 8.17
  3. Persiapkan alat dan bahan
  4. Buat rangkaian sesuai dengan kondisi dan modul
  5. Buka software STM32Cube IDE 
  6. Setelah membuka software, pilih perangkat STM32F103C8T6 
  7. Sesuaikan konfigurasi pin sesuai dengan rangkaian proteus 
  8. Buat kode program untuk mengoperasikan rangkaian tersebut sesuai dengan kondisi 
  9. Konfigurasi kan program dengan software Proteus
  10. Jalankan simulasi rangkaian.  
  11. Proses selesai

 2. Hardware[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


TM32F103C8 adalah mikrokontroler berbasis ARM Cortex-M3 yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini sering digunakan dalam pengembangan sistem tertanam karena kinerjanya yang baik, konsumsi daya yang rendah, dan kompatibilitas dengan berbagai protokol komunikasi. Pada praktikum ini, kita menggunakan STM32F103C8 yang dapat diprogram menggunakan berbagai metode, termasuk komunikasi serial (USART), SWD (Serial Wire Debug), atau JTAG untuk berhubungan dengan komputer maupun perangkat lain.

    2. Sensor Heartbeat
HeartBeat sensor atau sensor detak jantung merupakan perangkat input analog yang berfungsi untuk mendeteksi denyut nadi manusia dengan prinsip fotopletismografi (PPG). Sensor ini biasanya bekerja menggunakan infra merah dan fototransistor untuk mengukur perubahan volume darah di dalam pembuluh darah kecil di ujung jari atau telinga. Sinyal yang dihasilkan bersifat analog, sehingga memerlukan fitur ADC (Analog to Digital Converter) pada mikrokontroler agar data detak jantung dapat diproses dan dikonversi menjadi nilai Beats Per Minute (BPM).

                                                  

                                                
    3. Push Button
Push button adalah komponen sakelar sederhana yang berfungsi untuk menghubungkan atau memutuskan aliran arus listrik dalam suatu rangkaian dengan cara menekan tombolnya. Pada penggunaan mikrokontroler, komponen ini berperan sebagai perangkat input digital yang bekerja berdasarkan prinsip logika high atau low, di mana status penekanannya dapat dibaca oleh pin GPIO atau digunakan untuk memicu mekanisme interrupt eksternal. Agar pembacaan sinyal tetap stabil dan terhindar dari kondisi floating, push button biasanya dikonfigurasi menggunakan resistor pull-up atau pull-down yang memastikan level tegangan input tetap berada pada kondisi logika yang jelas saat tombol tidak sedang ditekan.
                                                   

    4. LED
LED adalah komponen semikonduktor yang berfungsi sebagai indikator visual dengan cara memancarkan cahaya ketika dialiri arus listrik searah. Dalam sistem yang menggunakan PWM (Pulse Width Modulation), LED tidak hanya berfungsi sebagai indikator aktif atau tidaknya suatu sistem, tetapi juga dapat diatur tingkat kecerahannya melalui pengaturan duty cycle. LED sangat efektif digunakan sebagai penanda status sensor atau sebagai simulasi output yang merepresentasikan kondisi tertentu dari hasil pemrosesan data.


LED adalah dioda semikonduktor yang dapat memancarkan cahaya ketika dialiri arus listrik. LED digunakan dalam berbagai aplikasi seperti indikator elektronik, pencahayaan, dan display. LED hanya bekerja pada arah bias maju dan memiliki berbagai warna yang ditentukan oleh material semikonduktornya.

    5. Buzzer


Buzzer adalah suatu komponen elektronika yang berfungsi untuk mengubah energi listrik menjadi energi suara (bunyi) melalui mekanisme getaran. Komponen ini termasuk dalam kategori output device karena digunakan untuk memberikan respon berupa suara terhadap suatu kondisi atau perintah dalam rangkaian elektronik.

    6. Resistor

Resistor adalah komponen elektronik pasif yang berfungsi untuk membatasi arus listrik dalam suatu rangkaian. Resistor bekerja berdasarkan hukum Ohm, yang menyatakan bahwa tegangan (V) = arus (I) × resistansi (R). Resistor memiliki satuan Ohm (Ω) dan digunakan dalam berbagai aplikasi seperti pembagian tegangan, kontrol arus, dan proteksi rangkaian elektronik.

    7. Breadboard
Breadboard adalah papan sirkuit tanpa solder yang digunakan sebagai media untuk merakit dan menguji purwarupa rangkaian elektronik secara sementara. Papan ini memiliki lubang lubang koneksi yang terhubung secara internal (horizontal di bagian tengah dan vertikal di jalur daya samping) sehingga memudahkan pengguna untuk menghubungkan sensor, mikrokontroler, dan komponen lainnya dengan kabel jumper. Penggunaan breadboard sangat efisien dalam tahap pengembangan karena memungkinkan komponen untuk dilepas dan dipasang kembali dengan mudah tanpa merusak jalur sirkuit.

     8. Diagram Blok


 3. Rangkaian Simulasi dan Prinsip Kerja [kembali]



Prinspi Kerja : 
Prinsip kerja rangkaian indikator detak jantung ini dimulai ketika sensor heartbeat mendeteksi denyut nadi melalui ujung jari dan mengirimkan sinyal analog ke mikrokontroler untuk dikonversi menjadi data digital melalui fitur ADC. Data digital tersebut kemudian diolah oleh program untuk menghitung nilai BPM (Beats Per Minute)

Pada simulasi yang dilakukan di Proteus, sensor detak jantung direpresentasikan menggunakan potensiometer yang menghasilkan sinyal analog dengan rentang nilai ADC 0–4095 (resolusi 12-bit). Karena tidak tersedia sinyal detak jantung yang berbentuk gelombang periodik, maka perhitungan BPM secara langsung tidak dapat dilakukan.

Oleh karena itu, sistem menggunakan pendekatan berbasis level tegangan sebagai indikator kondisi. Ambang batas (threshold) ditentukan sebesar 2048, yang merupakan 50% dari nilai maksimum ADC (4095).

Untuk meningkatkan kestabilan sistem, digunakan metode hysteresis sebesar ±50, sehingga batas keputusan menjadi:

  • Kondisi senang: nilai ADC > 2098 (2048 + 50) → LED merah menyala
  • Kondisi sedih: nilai ADC < 1998 (2048 − 50) → LED biru menyala

Rentang di antara kedua batas tersebut berfungsi sebagai daerah transisi untuk mencegah perubahan output yang terlalu cepat (flicker) akibat noise atau fluktuasi kecil pada sinyal input.

 4. Flowchart dan Listing Program [kembali]

Flowchart :


Listing Program :

/* USER CODE BEGIN Header */

/**

******************************************************************************

* @file : main.c

* @brief : Sensor di PA0 mengontrol LED Merah (PB1) dan Biru (PB0).

* Kondisi Senang (>50%): Merah ON, Biru OFF.

* Kondisi Sedih (<50%): Biru ON, Merah OFF.

******************************************************************************

*/

/* USER CODE END Header */


/* Includes ------------------------------------------------------------------*/

#include "main.h"


/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */

#define FILTER_SIZE 10

#define THRESHOLD_50_PERCENT 2048 // 50% dari 4095

#define HYSTERESIS 50 // Jarak aman agar LED tidak flicker

/* USER CODE END PD */


/* Private variables ---------------------------------------------------------*/

ADC_HandleTypeDef hadc1;


/* USER CODE BEGIN PV */

uint32_t adcValue = 0;

uint32_t filteredValue = 0;

uint16_t buffer[FILTER_SIZE];

uint8_t indexBuf = 0;

/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);


/* USER CODE BEGIN PFP */

uint32_t Calculate_Moving_Average(uint16_t new_value);

/* USER CODE END PFP */


/* USER CODE BEGIN 0 */

uint32_t Calculate_Moving_Average(uint16_t new_value)

{

buffer[indexBuf] = new_value;

indexBuf++;

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

}

/* USER CODE END 0 */


int main(void)

{

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_ADC1_Init();


/* USER CODE BEGIN 2 */

// Inisialisasi: Matikan semua output

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;

/* USER CODE END 2 */


/* Infinite loop */

while (1)

{

HAL_ADC_Start(&hadc1);


if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)

{

adcValue = HAL_ADC_GetValue(&hadc1);

filteredValue = Calculate_Moving_Average(adcValue);


// --- LOGIKA TRANSISI SENANG KE SEDIH ---


// Jika Kondisi SENANG ( > 50% )

if (filteredValue > (THRESHOLD_50_PERCENT + HYSTERESIS))

{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // LED MERAH ON

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // LED BIRU OFF


HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET); // Buzzer ON (Indikator Senang)

}

// Jika Kondisi SEDIH ( < 50% )

else if (filteredValue < (THRESHOLD_50_PERCENT - HYSTERESIS))

{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // LED MERAH OFF

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // LED BIRU ON


HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET); // Buzzer OFF

}

}

HAL_ADC_Stop(&hadc1);


HAL_Delay(10); // Sampling rate 100Hz

}

}


/**

* @brief System Clock Configuration

*/

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};


RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

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


PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;

PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;

HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);

}


/**

* @brief ADC1 Initialization Function

*/

static void MX_ADC1_Init(void)

{

ADC_ChannelConfTypeDef sConfig = {0};

hadc1.Instance = ADC1;

hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;

hadc1.Init.ContinuousConvMode = DISABLE;

hadc1.Init.DiscontinuousConvMode = 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_1CYCLE_5;

HAL_ADC_ConfigChannel(&hadc1, &sConfig);

}


/**

* @brief GPIO Initialization Function

*/

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};


__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();


/* Konfigurasi Pin PB0, PB1, PB10, PB11 sebagai Output */

GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}


void Error_Handler(void)

{

__disable_irq();

while (1){}

}

 5. Video Demo [kembali]


 6. Kondisi [kembali]

Percobaan 1 Kontrol Lampu Lorong

Kondisi 3 : Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi sensor heartbear mendeteksi perubahan dari keadaan senang ke sedih sehingga LED berubah dari merah menjadi biru 

7. Video Simulasi [kembali]

8. Link Download [kembali]

Komentar

Postingan populer dari blog ini

SISTEM DIGITAL

ELEKTRONIKA