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 1 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 1

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 

  • Touch Sensor 




  • PIR Sensor 

  • Buzzer 


  • Resistor  

  • LED

B. Diagram Blok




3. Rangkaian Simulasi dan Prinsip Kerja  [Kembali]


A. Rangkaian Simulasi\

    

B. Prinsip Kerja

Pada percobaan kondisi 3 ini, sistem dirancang agar LED mati dan buzzer berbunyi ketika PIR sensor mendeteksi gerakan selama waktu tertentu kemudian tidak lagi mendeteksi gerakan, serta sensor touch tidak disentuh. Prinsip kerjanya dimulai ketika PIR sensor menangkap adanya gerakan manusia di lorong. Pada saat itu, mikrokontroler STM32F103C8 mulai menghitung durasi waktu tertentu (misalnya 5 atau 10 detik) sebagai periode deteksi aktif. Selama periode ini, biasanya sistem dapat mengaktifkan LED sebagai indikasi adanya gerakan. Namun, setelah waktu tertentu yang telah ditentukan berlalu dan PIR sensor sudah tidak lagi mendeteksi adanya gerakan, mikrokontroler membaca kondisi tersebut sebagai akhir dari kehadiran manusia. Pada saat yang sama, mikrokontroler juga memeriksa kondisi touch sensor. Jika touch sensor dalam keadaan tidak disentuh (nilai LOW), maka mikrokontroler memutuskan untuk mematikan LED dan sebaliknya mengaktifkan buzzer. Buzzer berbunyi sebagai penanda bahwa gerakan telah berhenti setelah periode deteksi selesai, sedangkan LED mati mengindikasikan bahwa tidak ada lagi kebutuhan penerangan di lorong. Dengan demikian, sistem ini membedakan respons antara kondisi masih ada gerakan (LED menyala) dengan kondisi gerakan telah berhenti setelah waktu tertentu (LED mati dan buzzer berbunyi), dengan tetap mempertimbangkan status touch sensor sebagai prioritas jika disentuh maka logika dapat berubah sesuai kebutuhan.


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 */


/* USER CODE END PTD */


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

/* USER CODE BEGIN PD */

#define PIR_ACTIVE_TIME 5000 // waktu tunggu 5 detik setelah PIR terakhir mendeteksi

/* USER CODE END PD */


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

/* USER CODE BEGIN PM */


/* USER CODE END PM */


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

TIM_HandleTypeDef htim1;


/* USER CODE BEGIN PV */

uint32_t lastMotionTime = 0;

uint8_t motionDetected = 0;

/* USER CODE END PV */


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

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_TIM1_Init(void);

/* USER CODE BEGIN PFP */


/* USER CODE END PFP */


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

/* USER CODE BEGIN 0 */


/* USER CODE END 0 */


/**

* @brief The application entry point.

* @retval int

*/

int main(void)

{

/* USER CODE BEGIN 1 */


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

MX_TIM1_Init();


/* USER CODE BEGIN 2 */

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

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

/* USER CODE END 2 */


/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

/* Baca sensor */

GPIO_PinState pirState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0); // PIR

GPIO_PinState touchState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1); // Touch


/* Jika PIR mendeteksi gerakan */

if (pirState == GPIO_PIN_SET)

{

motionDetected = 1;

lastMotionTime = HAL_GetTick();


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

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

}


/* Jika sebelumnya pernah ada gerakan,

lalu sekarang PIR tidak mendeteksi lagi dalam waktu tertentu */

if (motionDetected == 1)

{

if ((HAL_GetTick() - lastMotionTime >= PIR_ACTIVE_TIME) && (pirState == GPIO_PIN_RESET))

{

/* Jika Touch tidak disentuh */

if (touchState == GPIO_PIN_RESET)

{

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

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // Buzzer ON

}

else

{

/* Jika Touch disentuh, buzzer mati */

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);

}

}

}


HAL_Delay(100);

/* USER CODE END WHILE */


/* USER CODE BEGIN 3 */

}

/* 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 TIM1 Initialization Function

* @param None

* @retval None

*/

static void MX_TIM1_Init(void)

{

/* USER CODE BEGIN TIM1_Init 0 */


/* USER CODE END TIM1_Init 0 */


TIM_MasterConfigTypeDef sMasterConfig = {0};

TIM_OC_InitTypeDef sConfigOC = {0};

TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};


/* USER CODE BEGIN TIM1_Init 1 */


/* USER CODE END TIM1_Init 1 */

htim1.Instance = TIM1;

htim1.Init.Prescaler = 0;

htim1.Init.CounterMode = TIM_COUNTERMODE_UP;

htim1.Init.Period = 65535;

htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

htim1.Init.RepetitionCounter = 0;

htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)

{

Error_Handler();

}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)

{

Error_Handler();

}

sConfigOC.OCMode = TIM_OCMODE_PWM1;

sConfigOC.Pulse = 0;

sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;

sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;

sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;

if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)

{

Error_Handler();

}

sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;

sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;

sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;

sBreakDeadTimeConfig.DeadTime = 0;

sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;

sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;

sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;

if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)

{

Error_Handler();

}

/* USER CODE BEGIN TIM1_Init 2 */


/* USER CODE END TIM1_Init 2 */

HAL_TIM_MspPostInit(&htim1);

}


/**

* @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_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 */

GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;

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 */

__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 CODE END 6 */

}

#endif /* USE_FULL_ASSERT */

5. Video Demo [Kembali]



6. Kondisi  [Kembali]

Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi ketika PIR mendeteksi gerakan selama waktu tertentu kemudian tidak lagi mendeteksi, dan sensor Touch tidak disentuh, LED mati dan Buzzer berbunyi

7. Video Simulasi  [Kembali]



8. Download File  [Kembali]


Komentar

Postingan populer dari blog ini