Tugas Pendahuluan 1


1. Prosedur [Kembali]

  1. Membuka software Proteus dan membuat project baru untuk simulasi rangkaian.
  2. Menambahkan komponen yang dibutuhkan seperti STM32F103C8, sensor heartbeat, LED, resistor, buzzer, dan potensiometer.
  3. Menghubungkan sensor heartbeat ke pin analog mikrokontroler (PA0) sebagai input sinyal.
  4. Menghubungkan LED merah, kuning, dan biru ke pin GPIO mikrokontroler (port B) sebagai indikator output.
  5. Menambahkan resistor pada setiap LED sebagai pembatas arus.
  6. Menghubungkan buzzer ke salah satu pin GPIO sebagai indikator tambahan.
  7. Menghubungkan semua komponen ke sumber tegangan 3,3 V dan ground yang sama (common ground).
  8. Melakukan konfigurasi pin pada STM32 menggunakan STM32CubeIDE sesuai dengan rangkaian (ADC untuk input, GPIO untuk output).
  9. Menuliskan dan meng-compile program hingga menghasilkan file .hex.
  10. Memasukkan file .hex ke mikrokontroler STM32F103C8 pada Proteus.
  11. Menjalankan simulasi dan memberikan variasi input (melalui sensor atau potensiometer).
  12. Mengamati perubahan LED:
    • LED merah menyala saat kondisi senang (input tinggi)
    • LED biru menyala saat kondisi sedih (input rendah)
  13. Menganalisis hasil simulasi untuk memastikan sistem bekerja sesuai perintah soal.

2. Hardware dan Diagram Blok [Kembali]




A. Hardware

  1. STM32F103C8 (Mikrokontroler)
    • Berfungsi sebagai pusat pengolah data.
    • Mengolah sinyal dari sensor dan mengendalikan output LED serta buzzer.
    • Memiliki fitur ADC untuk membaca sinyal analog.
  2. Sensor Heartbeat
    • Berfungsi mendeteksi detak jantung.
    • Menghasilkan sinyal analog berupa perubahan tegangan.
  3. LED Merah
    • Indikator kondisi senang (nilai input tinggi).
  4. LED Biru
    • Indikator kondisi sedih (nilai input rendah).
  5. LED Kuning
    • Indikator kondisi netral atau transisi (opsional).
  6. Resistor
    • Digunakan sebagai pembatas arus pada LED.
    • Mencegah kerusakan komponen akibat arus berlebih.
  7. Buzzer
    • Memberikan indikator suara pada kondisi tertentu.
    • Digunakan sebagai tambahan notifikasi sistem.
  8. Potensiometer
    • Digunakan sebagai pengganti sensor saat simulasi.
    • Memberikan variasi tegangan input ke mikrokontroler.
  9. Sumber Tegangan (3,3 V)
    • Menyuplai daya ke mikrokontroler dan rangkaian.
  10. Ground (GND)
    • Sebagai referensi tegangan.
    • Semua komponen harus terhubung ke ground yang sama (common ground). 


B. Diagram Blok



1. Blok Input (Sensor Heartbeat / Potensiometer)

  • Sensor heartbeat berfungsi mendeteksi detak jantung dan menghasilkan sinyal analog berupa tegangan.
  • Pada simulasi, potensiometer dapat digunakan sebagai pengganti untuk memberikan variasi tegangan input.

2. Blok ADC (Analog to Digital Converter – STM32)

  • Sinyal analog dari sensor masuk ke pin PA0 mikrokontroler.
  • ADC mengubah sinyal analog menjadi data digital agar dapat diproses oleh program.
  • 3. Blok Proses Program (Mikrokontroler STM32)

  • Data digital dari ADC diolah oleh program.
  • Program menentukan kondisi berdasarkan besar kecilnya nilai input:
    • Nilai tinggi → kondisi senang 
    • Nilai sedang → kondisi netral 
    • Nilai rendah → kondisi sedih

    4. Blok Output Visual (LED)

  • LED Merah menyala saat kondisi senang (input tinggi).
  • LED Kuning menyala saat kondisi netral (opsional/transisi).
  • LED Biru menyala saat kondisi sedih (input rendah).
  • 5. Blok Output Tambahan (Buzzer)

    • Buzzer aktif sebagai indikator tambahan pada kondisi tertentu (misalnya saat kondisi senang atau perubahan kondisi).

    3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]



    Rangkaian ini dirancang untuk mensimulasikan sistem pendeteksi perubahan kondisi emosi (senang ke sedih) dengan memanfaatkan sensor heartbeat, potensiometer sebagai pengatur ambang (threshold), serta mikrokontroler STM32F103C8 sebagai pengolah utama. Sensor heartbeat menghasilkan sinyal keluaran berupa pulsa digital (HIGH/LOW) yang merepresentasikan detak jantung. Karena tegangan keluaran sensor berada pada rentang 0–5 V, maka digunakan rangkaian pembagi tegangan yang terdiri dari resistor R4 (10 kΩ) dan R5 (20 kΩ) untuk menurunkan tegangan menjadi sekitar 0–3,3 V agar aman dibaca oleh pin input mikrokontroler (PA1). Tegangan hasil pembagi ini kemudian menjadi sinyal digital yang akan dibaca sebagai kondisi HIGH atau LOW oleh STM32.

    Di sisi lain, potensiometer (RV1) berfungsi sebagai sumber tegangan analog yang dapat diatur dari 0 hingga 3,3 V. Tegangan ini masuk ke pin PA0 (ADC1_IN0) dan dikonversi oleh ADC internal STM32 menjadi nilai digital dengan resolusi 12-bit (0–4095). Nilai ADC ini digunakan sebagai parameter untuk menentukan batas ambang (threshold) antara kondisi “senang” dan “sedih”. Dalam sistem ini, nilai  potensio dari 0 - 24% merupakan batas yang menunjukkan kondisi emosi sedih dan nilai potensio dari 25 - 100% merupakan batas yang menunjukkan kondisi emosi senang.

    Mikrokontroler STM32F103C8 berperan sebagai pusat pengolahan data dengan membaca kedua input tersebut secara bersamaan. Logika kerja sistem adalah sebagai berikut: apabila sinyal heartbeat pada PA1 bernilai HIGH (menandakan adanya detak jantung), maka mikrokontroler akan membandingkan nilai ADC dari potensiometer dengan nilai threshold. Jika nilai ADC lebih besar atau sama dengan threshold, maka sistem menganggap kondisi sebagai “senang” dan akan menyalakan LED merah (PB10). Sebaliknya, jika nilai ADC lebih kecil dari threshold, maka kondisi dianggap “sedih” dan LED biru (PB0) akan menyala. Namun, apabila tidak ada sinyal heartbeat (PA1 = LOW), maka semua LED akan dimatikan sebagai indikasi tidak adanya deteksi aktivitas.

    Dengan demikian, prinsip kerja rangkaian ini menggabungkan input analog (potensiometer) dan input digital (heartbeat sensor) untuk menghasilkan output visual berupa perubahan warna LED. Potensiometer bertindak sebagai pengatur ambang batas kondisi, sedangkan sensor heartbeat berfungsi sebagai pemicu utama (trigger) sistem. Integrasi keduanya melalui mikrokontroler memungkinkan simulasi sederhana dari sistem klasifikasi kondisi berdasarkan parameter yang dapat diatur secara real-time.



    Listing Program :

    #include "main.h" /* USER CODE BEGIN PD */ #define ADC_MAX_VALUE 4095.0f #define ADC_VREF 3.3f // PA0: batas senang/sedih = 0.5V #define THRESHOLD_PA0_VOLT 0.80f #define THRESHOLD_PA0_ADC ((uint32_t)((THRESHOLD_PA0_VOLT / ADC_VREF) * ADC_MAX_VALUE)) // PA1: batas heartbeat aktif = 1.5V #define THRESHOLD_PA1_VOLT 1.5f #define THRESHOLD_PA1_ADC ((uint32_t)((THRESHOLD_PA1_VOLT / ADC_VREF) * ADC_MAX_VALUE)) #define ADC_SAMPLES 10 /* USER CODE END PD */ ADC_HandleTypeDef hadc1; /* USER CODE BEGIN PV */ uint32_t adcPA0 = 0; uint32_t adcPA1 = 0; /* USER CODE END PV */ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_ADC1_Init(void); /* USER CODE BEGIN PFP */ uint32_t Read_ADC_Channel_Average(uint32_t channel); void Semua_Output_Mati(void); void LED_Merah_ON(void); void LED_Biru_ON(void); /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ uint32_t Read_ADC_Channel_Average(uint32_t channel) { ADC_ChannelConfTypeDef sConfig = {0}; uint32_t total = 0; sConfig.Channel = channel; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5; HAL_ADC_ConfigChannel(&hadc1, &sConfig); for (uint8_t i = 0; i < ADC_SAMPLES; i++) { HAL_ADC_Start(&hadc1); if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK) { total += HAL_ADC_GetValue(&hadc1); } HAL_ADC_Stop(&hadc1); HAL_Delay(2); } return total / ADC_SAMPLES; } void Semua_Output_Mati(void) { HAL_GPIO_WritePin(GPIOB, LED_RED_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_BLUE_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_YELLOW_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, BUZZER_Pin, GPIO_PIN_RESET); } void LED_Merah_ON(void) { HAL_GPIO_WritePin(GPIOB, LED_RED_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, LED_BLUE_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_YELLOW_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, BUZZER_Pin, GPIO_PIN_RESET); } void LED_Biru_ON(void) { HAL_GPIO_WritePin(GPIOB, LED_RED_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_BLUE_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, LED_YELLOW_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, BUZZER_Pin, GPIO_PIN_RESET); } /* USER CODE END 0 */ int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC1_Init(); Semua_Output_Mati(); while (1) { // PA0 = potensio / input 0-1V adcPA0 = Read_ADC_Channel_Average(ADC_CHANNEL_0); // PA1 = Vout heartbeat setelah pembagi tegangan adcPA1 = Read_ADC_Channel_Average(ADC_CHANNEL_1); if (adcPA1 >= THRESHOLD_PA1_ADC) { if (adcPA0 >= THRESHOLD_PA0_ADC) { LED_Merah_ON(); // Senang: PA0 > 0.5V } else { LED_Biru_ON(); // Sedih: PA0 < 0.5V } } else { Semua_Output_Mati(); // Heartbeat tidak aktif } HAL_Delay(50); } } 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; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } 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; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); } } static void MX_ADC1_Init(void) { 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; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOB, LED_BLUE_Pin | LED_YELLOW_Pin | LED_RED_Pin | BUZZER_Pin, GPIO_PIN_RESET); // PA0 dan PA1 sebagai input analog ADC GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Output LED dan buzzer GPIO_InitStruct.Pin = LED_BLUE_Pin | LED_YELLOW_Pin | LED_RED_Pin | BUZZER_Pin; 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) { HAL_GPIO_WritePin(GPIOB, LED_RED_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, LED_BLUE_Pin, GPIO_PIN_RESET); HAL_Delay(1000); HAL_GPIO_WritePin(GPIOB, LED_RED_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_BLUE_Pin, GPIO_PIN_SET); HAL_Delay(1000); } } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t *file, uint32_t line) { } #endif




    #ifndef __MAIN_H

    #define __MAIN_H


    #ifdef __cplusplus

    extern "C" {

    #endif


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

    #include "stm32f1xx_hal.h"


    /* Private includes ----------------------------------------------------------*/

    /* USER CODE BEGIN Includes */


    /* USER CODE END Includes */


    /* Exported types ------------------------------------------------------------*/

    /* USER CODE BEGIN ET */


    /* USER CODE END ET */


    /* Exported constants --------------------------------------------------------*/

    /* USER CODE BEGIN EC */


    /* USER CODE END EC */


    /* Exported macro ------------------------------------------------------------*/

    /* USER CODE BEGIN EM */


    /* USER CODE END EM */


    /* Exported functions prototypes ---------------------------------------------*/

    void Error_Handler(void);


    /* USER CODE BEGIN EFP */


    /* USER CODE END EFP */


    /* Private defines -----------------------------------------------------------*/

    #define Wiper_Potensio_Pin GPIO_PIN_0

    #define Wiper_Potensio_GPIO_Port GPIOA

    #define Vour_Heartbeat_Pin GPIO_PIN_1

    #define Vour_Heartbeat_GPIO_Port GPIOA

    #define LED_BLUE_Pin GPIO_PIN_0

    #define LED_BLUE_GPIO_Port GPIOB

    #define LED_YELLOW_Pin GPIO_PIN_1

    #define LED_YELLOW_GPIO_Port GPIOB

    #define LED_RED_Pin GPIO_PIN_10

    #define LED_RED_GPIO_Port GPIOB

    #define BUZZER_Pin GPIO_PIN_11

    #define BUZZER_GPIO_Port GPIOB


    /* USER CODE BEGIN Private defines */


    /* USER CODE END Private defines */


    #ifdef __cplusplus

    }

    #endif


    #endif /* __MAIN_H */


    5. Video Demo [Kembali]


    6. Kondisi [Kembali]

    Percobaan 1 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. Download File [Kembali]

    Download rangkaian Proteus klik disini

    Download library Heartbeat Sensor klik disini

    Download library STM32F103C8 klik disini

    Tidak ada komentar:

    Posting Komentar

      BAHAN PRESENTASI UNTUK MATAKULIAH ELEKTRONIKA 2024 Oleh : MUHAMMAD FADLI NIM. 2310952007   Dosen Pengampu : Dr. Darwison, S. T., M. T. NID...