Tugas Pendahuluan 1 M2
TUGAS PENDAHULUAN
PERCOBAAN 1 KONDISI 3
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[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
8. Diagram Blok

3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
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.

/* 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]
- Rangkaian Proteus [Download]
- Program [Download]
- Datasheet STM32F103C8 [Download]
- Datasheet Heartbeat Sensor [Download]
- Datasheet Resistor [Download]
- Datasheet LED [Download]
Komentar
Posting Komentar