- Dapatkan link
- X
- Aplikasi Lainnya
MODUL 2
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]
- STM32F103C8
- HeartBeat Sensor
- Buzzer
- Resistor
3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
A. Rangkaian Simulasi
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 */
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
- Dapatkan link
- X
- Aplikasi Lainnya
Komentar
Posting Komentar