Gambar
[KEMBALI KE MENU SEBELUMNYA] DAFTAR ISI 1. Prosedur 2. Hardware dan Diagram Blok 3. Rangkaian Simulasi Dan Prinsip Kerja 4. Flowchart dan Listing Program 5. Video Demo 6. Kondisi 7. Video simulasi 8. Download File MODUL 2 TUGAS PENDAHULUAN 2 1. Prosedur   [Kembali] Rangkai komponen sesuai gambar pada modul menggunakan platform  Wokwi.com . Buka  STM32CubeIDE , kemudian pilih opsi  New STM32 Project . Pada menu  BOARD SELECTOR , cari dan pilih papan  STM32 Nucleo G474RE . Atur konfigurasi pin pada file  .ioc  sesuai kebutuhan rangkaian yang telah dirancang. Lakukan  Generate Code , lalu masukkan kode program yang diperlukan ke dalam file  main.c  dan  main.h . Klik  Build Project  untuk mengkompilasi proyek. Ambil file  main.c  dan  main.h  yang telah selesai di-generate, lalu masukkan kedua file tersebut ke dalam komponen  STM32 Nucleo G474RE  di Wokwi. Jalankan simulasi rangk...



MODUL 2

TUGAS PENDAHULUAN 1


1. Prosedur [Kembali]

  • Rangkai rangkaian sesuai gambar pada modul menggunakan Proteus 8.17.

  • Buka STM32CubeIDE, kemudian pilih New STM32 Project.

  • Pada bagian MPU/MCU Selector, cari dan pilih STM32F103C8.

  • Atur konfigurasi pin pada file .ioc sesuai kebutuhan rangkaian.

  • Generate kode program, lalu masukkan kode yang diperlukan ke file main.c dan main.h.

  • Klik Build Project untuk menghasilkan file .hex.

  • Masukkan file .hex yang telah dihasilkan ke mikrokontroler STM32F103C8 di Proteus.

  • Jalankan simulasi rangkaian di Proteus.

2. Hardware dan Diagram Blok [Kembali]

A. Hardware
        
  • STM32F103C8 

  • HeartBeat Sensor 



  • Buzzer 


  • Resistor  

  • LED

B. Diagram Blok






3. Rangkaian Simulasi dan Prinsip Kerja  [Kembali]


A. Rangkaian Simulasi

    


B. Prinsip Kerja
Sistem ini bekerja dengan mendeteksi perubahan emosi seseorang berdasarkan detak jantung yang diukur oleh sensor Heart Sleep Sensor. Sensor heartbeat membaca nilai detak jantung yang kemudian dikirim ke mikrokontroler STM32F103ZET6 melalui pin PA0. Mikrokontroler memproses nilai tersebut dengan membandingkannya terhadap ambang batas yang telah ditentukan. Jika nilai detak jantung berada di atas atau sama dengan 2000, sistem menganggap bahwa orang tersebut dalam keadaan senang, sehingga mikrokontroler akan menyalakan LED merah dan mematikan buzzer. Sebaliknya, jika nilai detak jantung berada di bawah atau sama dengan 1000, sistem menganggap bahwa orang tersebut dalam keadaan sedih, sehingga mikrokontroler akan menyalakan LED biru dan menyalakan buzzer sebagai penanda. Sistem hanya akan mengubah kondisi LED dan buzzer jika terjadi perubahan emosi dari senang ke sedih atau sebaliknya, sehingga tidak ada pemborosan energi dengan pembacaan yang terus-menerus. Proses ini berulang setiap 100 milidetik dalam loop utama program, sehingga sistem dapat merespon perubahan emosi secara real-time.

4. Flowchart dan Listing Program  [Kembali]

A. Flowchart





B. Listing Program

/* USER CODE BEGIN Header */

/**

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

* @file : main.c

* @brief : Main program body

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

* @attention

*

* Copyright (c) 2026 STMicroelectronics.

* All rights reserved.

*

* This software is licensed under terms that can be found in the LICENSE file

* in the root directory of this software component.

* If no LICENSE file comes with this software, it is provided AS-IS.

*

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

*/

/* USER CODE END Header */

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

#include "main.h"


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

/* USER CODE BEGIN Includes */


/* USER CODE END Includes */


/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */


// Mendefinisikan keadaan emosi

typedef enum {

EMOTION_HAPPY, // Senang

EMOTION_SAD // Sedih

} EmotionState;


/* USER CODE END PTD */


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

/* USER CODE BEGIN PD */


// Definisi pin untuk memudahkan pembacaan kode

#define HEARTBEAT_SENSOR_PIN GPIO_PIN_0 // PA0

#define SENSOR_VCC_PIN GPIO_PIN_1 // PA1


#define LED_GREEN_PIN GPIO_PIN_0 // PB0

#define LED_YELLOW_PIN GPIO_PIN_1 // PB1

#define LED_RED_PIN GPIO_PIN_10 // PB10

#define BUZZER_PIN GPIO_PIN_11 // PB11


// Ambang batas detak jantung (nilai contoh, sesuaikan dengan hasil kalibrasi)

// Semakin tinggi nilai ADC, semakin cepat detak jantung (senang)

// Semakin rendah nilai ADC, semakin lambat detak jantung (sedih)

#define THRESHOLD_HAPPY 2000 // Ambang batas untuk keadaan senang

#define THRESHOLD_SAD 1000 // Ambang batas untuk keadaan sedih


/* USER CODE END PD */


/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */


/* USER CODE END PM */


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


/* USER CODE BEGIN PV */


/* USER CODE END PV */


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

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

/* USER CODE BEGIN PFP */


// Deklarasi fungsi

uint32_t readHeartbeatSensor(void);

void setLEDByEmotion(EmotionState emotion);

void controlBuzzer(EmotionState emotion);


/* USER CODE END PFP */


/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */


// Fungsi untuk membaca nilai dari sensor heartbeat (PA0)

uint32_t readHeartbeatSensor(void) {

// Membaca nilai analog dari pin PA0

// Catatan: Pada STM32F103, untuk membaca analog perlu menginisialisasi ADC terlebih dahulu.

// Namun karena dalam kode ini tidak ada inisialisasi ADC, kita akan menggunakan

// pembacaan digital sederhana sebagai contoh.

// Untuk penggunaan sebenarnya, Anda perlu menambahkan konfigurasi ADC.


// Sementara gunakan HAL_GPIO_ReadPin untuk contoh (hanya nilai HIGH/LOW)

// Ganti dengan pembacaan ADC jika diperlukan.

return HAL_GPIO_ReadPin(GPIOA, HEARTBEAT_SENSOR_PIN) ? 3000 : 500;


/* Contoh jika menggunakan ADC (perlu inisialisasi ADC terlebih dahulu):

uint32_t adcValue = 0;

HAL_ADC_Start(&hadc1);

if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK) {

adcValue = HAL_ADC_GetValue(&hadc1);

}

HAL_ADC_Stop(&hadc1);

return adcValue;

*/

}


// Fungsi untuk mengatur LED berdasarkan emosi

void setLEDByEmotion(EmotionState emotion) {

// Matikan semua LED terlebih dahulu

HAL_GPIO_WritePin(GPIOB, LED_RED_PIN, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, LED_GREEN_PIN, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, LED_YELLOW_PIN, GPIO_PIN_RESET);


if (emotion == EMOTION_HAPPY) {

// Keadaan senang: LED Red menyala (merah)

HAL_GPIO_WritePin(GPIOB, LED_RED_PIN, GPIO_PIN_SET);

} else if (emotion == EMOTION_SAD) {

// Keadaan sedih: LED Blue? Tidak ada LED biru di pin yang disebutkan.

// Berdasarkan deskripsi: "LED berubah dari merah menjadi biru"

// Namun pin output hanya untuk LED Green, Yellow, Red.

// Maka kita asumsikan LED Biru terhubung ke pin yang sama dengan LED Red?

// Atau gunakan kombinasi LED? Untuk contoh ini, kita nyalakan LED Green sebagai pengganti biru.

// Atau jika ada pin lain untuk LED biru, silakan ditambahkan.


// Opsi 1: LED Green sebagai pengganti biru

HAL_GPIO_WritePin(GPIOB, LED_GREEN_PIN, GPIO_PIN_SET);


// Opsi 2: Jika LED biru terhubung ke pin yang sama dengan LED Red, maka matikan LED Red.

// Tidak ada perubahan karena LED Red sudah mati.

}

}


// Fungsi untuk mengontrol buzzer

void controlBuzzer(EmotionState emotion) {

if (emotion == EMOTION_SAD) {

// Saat sedih, buzzer berbunyi (contoh: bunyi continu)

HAL_GPIO_WritePin(GPIOB, BUZZER_PIN, GPIO_PIN_SET);

} else {

// Saat senang, buzzer mati

HAL_GPIO_WritePin(GPIOB, BUZZER_PIN, GPIO_PIN_RESET);

}

}


/* USER CODE END 0 */


/**

* @brief The application entry point.

* @retval int

*/

int main(void)

{


/* USER CODE BEGIN 1 */

EmotionState currentEmotion = EMOTION_HAPPY; // Mulai dengan keadaan senang

EmotionState previousEmotion = EMOTION_HAPPY;

uint32_t heartbeatValue = 0;

/* USER CODE END 1 */


/* MCU Configuration--------------------------------------------------------*/


/* Reset of all peripherals, Initializes the Flash interface and the Systick. */

HAL_Init();


/* USER CODE BEGIN Init */


/* USER CODE END Init */


/* Configure the system clock */

SystemClock_Config();


/* USER CODE BEGIN SysInit */


/* USER CODE END SysInit */


/* Initialize all configured peripherals */

MX_GPIO_Init();

/* USER CODE BEGIN 2 */


// Pastikan sensor VCC diberi tegangan (PA1 sebagai output HIGH)

// Karena PA1 dikonfigurasi sebagai input pada MX_GPIO_Init, kita perlu mengubahnya menjadi output?

// Atau sensor VCC terhubung ke VCC langsung? Berdasarkan deskripsi, PA1 ke VCC sensor.

// Maka kita set PA1 sebagai output HIGH.

GPIO_InitTypeDef GPIO_InitStruct = {0};

GPIO_InitStruct.Pin = SENSOR_VCC_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

HAL_GPIO_WritePin(GPIOA, SENSOR_VCC_PIN, GPIO_PIN_SET); // Nyalakan sensor


/* USER CODE END 2 */


/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

/* USER CODE END WHILE */


/* USER CODE BEGIN 3 */

// Baca nilai dari sensor heartbeat

heartbeatValue = readHeartbeatSensor();


// Tentukan emosi berdasarkan nilai sensor

if (heartbeatValue >= THRESHOLD_HAPPY) {

currentEmotion = EMOTION_HAPPY;

} else if (heartbeatValue <= THRESHOLD_SAD) {

currentEmotion = EMOTION_SAD;

}

// Jika nilai di antara kedua threshold, pertahankan emosi sebelumnya


// Jika terjadi perubahan emosi

if (currentEmotion != previousEmotion) {

// Update LED sesuai emosi yang baru

setLEDByEmotion(currentEmotion);


// Kontrol buzzer berdasarkan emosi

controlBuzzer(currentEmotion);


// Simpan emosi saat ini sebagai emosi sebelumnya untuk iterasi berikutnya

previousEmotion = currentEmotion;

}


// Delay sederhana untuk stabilitas pembacaan

HAL_Delay(100);

}

/* USER CODE END 3 */

}


/**

* @brief System Clock Configuration

* @retval None

*/

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};


/** Initializes the RCC Oscillators according to the specified parameters

* in the RCC_OscInitTypeDef structure.

*/

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

}


/** Initializes the CPU, AHB and APB buses clocks

*/

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

}

}


/**

* @brief GPIO Initialization Function

* @param None

* @retval None

*/

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

/* USER CODE BEGIN MX_GPIO_Init_1 */


/* USER CODE END MX_GPIO_Init_1 */


/* GPIO Ports Clock Enable */

__HAL_RCC_GPIOD_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();


/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11, GPIO_PIN_RESET);


/*Configure GPIO pins : PA0 PA1 */

GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


/*Configure GPIO pins : PB0 PB1 PB10 PB11 */

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


/* USER CODE BEGIN MX_GPIO_Init_2 */


/* USER CODE END MX_GPIO_Init_2 */

}


/* USER CODE BEGIN 4 */


/* USER CODE END 4 */


/**

* @brief This function is executed in case of error occurrence.

* @retval None

*/

void Error_Handler(void)

{

/* USER CODE BEGIN Error_Handler_Debug */

/* User can add his own implementation to report the HAL error return state */

__disable_irq();

while (1)

{

}

/* USER CODE END Error_Handler_Debug */

}


#ifdef USE_FULL_ASSERT

/**

* @brief Reports the name of the source file and the source line number

* where the assert_param error has occurred.

* @param file: pointer to the source file name

* @param line: assert_param error line source number

* @retval None

*/

void assert_failed(uint8_t *file, uint32_t line)

{

/* USER CODE BEGIN 6 */

/* User can add his own implementation to report the file name and line number,

ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

/* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */

5. Video Demo [Kembali]



6. Kondisi  [Kembali]

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]

Komentar