Tugas Pendahuluan 1 M1

 [KEMBALI KE MENU SEBELUMNYA]


Tugas Pendahuluan 1 Modul 1
(Percobaan 2 Kondisi 8)

1. Prosedur

1. Rangkai rangkaian di wokwi sesuai dengan kondisi percobaan.
2. Buat program untuk mikrokontroler STM32 NUCLEO-G474RE di software STM32 CubeIDE.
3. Salin program main.c dan main.h dari stm32cubeide ke wokwi
4. Setelah program selesai di upload, jalankan simulasi rangkaian pada wokwi.
5. Selesai.


Hardware :

a) Mikrokontroler STM32 NUCLEO-G474RE








2. Infrared Sensor

Infrared Sensor Module



3. Buzzer


4. Power Supply

 
5. RGB LED
Jual LED RGB 4 PIN WARNA MERAH HIJAU BIRU 5mm ( ARDUINO ) - Common Cathode  - Jakarta Barat - Ardushop-id | Tokopedia

6. Resistor 1k Ohm



7. Switch



8. Adaptor



9. Breadboard



Diagram Blok  :






Rangkaian Simulasi Sebelum dirunning:





Rangkaian Simulasi Setelah dirunning:
 



Prinsip Kerja : 

Sistem deteksi jarak pada parkir mundur ini bekerja dengan memanfaatkan dua sinyal input digital yang dibaca oleh mikrokontroler STM32 NUCLEO-G474RE secara terus-menerus dalam sebuah loop. Switch yang terhubung ke pin PA0 berfungsi sebagai tombol aktivasi mode parkir mundur — ketika switch ditekan, sistem mulai memantau infrared sensor pada pin PA1 yang bertugas mendeteksi keberadaan objek di belakang kendaraan. Mikrokontroler membaca kedua sinyal tersebut menggunakan fungsi HAL_GPIO_ReadPin() lalu memproses logikanya untuk menentukan kondisi output, yaitu LED hijau pada PB0 sebagai indikator aman, LED merah pada PB1 sebagai peringatan objek terdeteksi, dan buzzer pada PB2 sebagai peringatan audio. Seluruh pengukuran waktu menggunakan HAL_GetTick() sehingga tidak ada pemblokiran eksekusi program, menjaga loop tetap responsif setiap 10ms.

Kondisi tambahan yang membedakan sistem ini dari rangkaian parkir mundur biasa adalah mekanisme deteksi transisi berbasis waktu yang mengaktifkan mode darurat. Setiap kali IR sensor berubah dari kondisi tidak mendeteksi menjadi mendeteksi, sistem mengukur selisih waktu antara kedua transisi tersebut menggunakan variabel ir_not_detect_time yang dicatat saat sensor pertama kali kehilangan deteksi. Apabila jarak waktu perubahan tersebut kurang dari 500ms — yang mengindikasikan objek muncul secara tiba-tiba atau kendaraan bergerak terlalu cepat mendekati halangan — sistem langsung mengaktifkan emergency_mode dan menonaktifkan alur normal. Dalam mode darurat ini, LED merah dan LED biru berkedip bergantian setiap 100ms secara non-blocking menggunakan teknik timestamp comparison, sementara buzzer berbunyi terus-menerus tanpa henti sebagai peringatan keras, dan kondisi ini hanya dapat direset dengan menekan switch kembali yang terdeteksi sebagai rising edge oleh variabel switch_last.


Flowchart :



Listing Program :
a. main.c
/* USER CODE BEGIN Header */
// Header awal
/**

---

* @file           : main.c
* @brief          : Main program body

---

*/
// Header akhir
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "main.h" // Library utama

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void); // Konfigurasi clock
static void MX_GPIO_Init(void); // Inisialisasi GPIO

int main(void)
{
HAL_Init(); // Inisialisasi HAL
SystemClock_Config(); // Set clock
MX_GPIO_Init(); // Inisialisasi GPIO

while (1) // Loop utama
{
static uint32_t lastTime = 0;
// Menyimpan waktu terakhir trigger

  static uint8_t lastState = 0;
  // Menyimpan kondisi sebelumnya

  static uint8_t emergency = 0;
  // Status mode darurat

  uint8_t currentState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
  // Membaca sensor infrared di PA0

  // Deteksi perubahan LOW -> HIGH
  if (lastState == 0 && currentState == 1)
  {
      uint32_t now = HAL_GetTick();
      // Ambil waktu sekarang (ms)

      // Jika perubahan terjadi cepat (<500ms)
      if ((now - lastTime) < 500)
      {
          emergency = 1;
          // Aktifkan mode darurat
      }

      lastTime = now;
      // Simpan waktu terakhir
  }

  lastState = currentState;
  // Update kondisi sebelumnya

  // Jika mode darurat aktif
  if (emergency)
  {
      // LED merah & biru berkedip cepat
      HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
      // LED merah

      HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
      // LED biru

      HAL_Delay(50);
      // Delay cepat (kedip cepat)

      // Buzzer nada tinggi (frekuensi tinggi)
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
      // ON

      HAL_Delay(1);
      // Delay sangat kecil

      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
      // OFF

      HAL_Delay(1);
      // Delay sangat kecil → menghasilkan nada tinggi
  }

}
}

/**

* @brief System Clock Configuration
  */
  // Fungsi konfigurasi clock
  void SystemClock_Config(void)
  {
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  // Struktur oscillator

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// Struktur clock

__HAL_FLASH_SET_LATENCY(FLASH_LATENCY_1);
// Set latency flash

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
// Pakai oscillator internal

RCC_OscInitStruct.HSIState = RCC_HSI_ON;
// Aktifkan HSI

RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
// Divider

RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
// Kalibrasi default

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
// Jika gagal
}

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;
// Jenis clock

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
// Sumber clock

RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
// Divider

RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;
// Divider AHB

RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
// Divider APB1

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Error_Handler();
}
}

/**

* @brief GPIO Initialization
  */
  // Inisialisasi GPIO
  static void MX_GPIO_Init(void)
  {
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  // Struktur GPIO

__HAL_RCC_GPIOA_CLK_ENABLE();
// Aktifkan GPIOA

__HAL_RCC_GPIOB_CLK_ENABLE();
// Aktifkan GPIOB

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
// Set awal LOW

// PA0 sebagai input (sensor)
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// PB1, PB2, PB3 sebagai output (LED & buzzer)
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
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);
}

/**

* @brief Error Handler
  */
  // Fungsi error
  void Error_Handler(void)
  {
  __disable_irq();
  // Matikan interrupt

while (1)
{
// Loop terus jika error
}
}


b. main.h
/* USER CODE BEGIN Header */
// Penanda awal header user

/**

---

* @file           : main.h
  // Nama file header utama

* @brief          : Header for main.c file.
  // File header untuk main.c

* ```
                This file contains the common defines of the application.
  ```

// Berisi definisi umum yang dipakai di program

---

* @attention
  // Informasi perhatian

* Copyright (c) 2026 STMicroelectronics.
  // Hak cipta

* All rights reserved.
  // Semua hak dilindungi

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

* If no LICENSE file comes with this software, it is provided AS-IS.
  // Jika tidak ada lisensi, digunakan apa adanya

---

*/
// Penutup komentar header
/* USER CODE END Header */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
// Jika MAIN_H belum didefinisikan

#define __MAIN_H
// Definisikan MAIN_H agar tidak include berulang

#ifdef __cplusplus
// Jika menggunakan C++

extern "C" {
// Agar kompatibel dengan C
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32c0xx_hal.h"
// Memanggil library HAL STM32

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
// Tempat tambahan library user
/* USER CODE END Includes */

/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */
// Tempat deklarasi tipe data (struct, enum)
/* USER CODE END ET */

/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */
// Tempat konstanta global
/* USER CODE END EC */

/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */
// Tempat macro (#define)
/* USER CODE END EM */

/* Exported functions prototypes ---------------------------------------------*/
void Error_Handler(void);
// Deklarasi fungsi error handler

/* USER CODE BEGIN EFP */
// Tambahan prototype fungsi user
/* USER CODE END EFP */

/* Private defines -----------------------------------------------------------*/
// Bagian definisi privat

/* USER CODE BEGIN Private defines */
// Tempat define pin atau konstanta tambahan
/* USER CODE END Private defines */

#ifdef __cplusplus
}
#endif
// Penutup kompatibilitas C++

#endif /* __MAIN_H */
// Penutup guard agar tidak include berulang


Percobaan 2 Kondisi 8
ketika infrared sensor jika kondisi sensor tidak mendeteksi ke mendeteksi dalam waktu kurang dari 500ms, sistem mengaktifkan mode darurat, maka LED RGB berkedip Merah & Biru secara cepat dan Buzzer berbunyi nada tinggi terus-menerus.





Download HTML [Download]
Download File Rangkaian [Download[wokwi link]
Download Video Simulasi [Download]
Datasheet Mikrokontroler STM32 NUCLEO-G474RE [Download]
Datasheet Sensor Infrared [Download]
Datasheet RGB LED [Download]
Datasheet Buzzer [Download]

Komentar

Postingan populer dari blog ini