Tugas Pendahuluan 2



1. Prosedur [kembali]

  1. Membuka Wokwi dan membuat project baru dengan menggunakan board STM32 Nucleo C031C6, kemudian menambahkan komponen berupa push button sebagai input, LED sebagai indikator visual, buzzer sebagai indikator suara, serta resistor sebagai pembatas arus.
  2. Menyusun rangkaian dengan menghubungkan push button ke pin input mikrokontroler (misalnya ke pin A0 atau PA0) dengan konfigurasi pull-down resistor ke GND, kemudian menghubungkan LED ke salah satu pin output (misalnya D2/PB0) melalui resistor dan buzzer ke pin output lainnya (misalnya D3/PB1), serta memastikan semua VCC dan GND terhubung dengan benar.
  3. Menuliskan program pada editor Wokwi untuk membaca kondisi push button sebagai simulasi sensor jarak, dimana tombol ditekan dianggap sebagai kondisi objek mendekat (jarak dekat) dan tidak ditekan sebagai kondisi objek jauh.
  4. Menambahkan logika kontrol pada program yaitu ketika tombol tidak ditekan maka LED dan buzzer dalam kondisi mati, ketika tombol ditekan sebagian maka LED menyala sebagai indikator jarak mulai dekat, dan ketika kondisi tertentu (misalnya logika tambahan atau penekanan penuh) maka buzzer juga aktif sebagai tanda jarak sangat dekat.
  5. Menjalankan simulasi dengan menekan tombol start pada Wokwi, kemudian melakukan pengujian dengan menekan dan melepas push button untuk mensimulasikan perubahan jarak objek terhadap sensor.
  6. Mengamati hasil output dimana saat tombol ditekan LED akan menyala dan buzzer dapat ikut aktif sebagai peringatan, sedangkan saat tombol dilepas semua output kembali mati, sehingga sistem dapat mensimulasikan fungsi dasar deteksi jarak parkir mundur secara sederhana.

2. Hardware dan Diagram Blok [kembali]

 1. STM32G474RE

 

Microcontroller

STM32G474RE (ARM Cortex-M4F)

Operating Voltage

3.3 V

Input Voltage (recommended)

5 V via USB (ST-LINK) atau 7–12 V via VIN

Input Voltage (limit)

4.5 – 15 V (VIN board Nucleo)

Digital I/O Pins

±51 GPIO pins (tergantung konfigurasi fungsi)

PWM Digital I/O Pins

Hingga 24 channel PWM (advanced, general-purpose, dan high-resolution timers)

Analog Input Pins

Hingga 24 channel ADC (12-bit / 16-bit dengan oversampling)

DC Current per I/O Pin

Maks. 20 mA per pin (disarankan ≤ 8 mA)

DC Current for 3.3V Pin

Hingga ±500 mA (tergantung regulator & sumber daya)

Flash Memory

512 KB internal Flash

SRAM

128 KB SRAM (termasuk CCM RAM)

Clock Speed

Hingga 170 MHz

 

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. Push Button

 


Diagram Blok:




3. Rangkaian Simulasi dan Prinsip Kerja [kembali]


Prinsip Kerja:

Prinsip kerja sistem pada percobaan deteksi jarak parkir mundur ini menggunakan sensor inframerah sebagai pendeteksi keberadaan objek yang terhubung ke mikrokontroler STM32 sebagai pusat pengendali. Ketika sensor mendeteksi adanya benda, sistem akan mengaktifkan LED merah dan buzzer sebagai tanda peringatan bahwa objek berada dekat. Namun ketika kondisi berubah dari mendeteksi menjadi tidak mendeteksi benda, mikrokontroler akan merespon dengan mematikan LED merah, menghentikan bunyi buzzer, serta menyalakan LED hijau sebagai indikator bahwa area sudah aman. Proses ini berlangsung secara terus menerus sehingga sistem mampu memberikan respon otomatis terhadap perubahan kondisi lingkungan secara real-time.

4. Flowchart dan Listing Program [kembali]

Flowchart: 


Listing Program:
Main h:

#ifndef __MAIN_H
#define __MAIN_H

#ifdef __cplusplus
extern "C" {
#endif

#include "stm32c0xx_hal.h"

void Error_Handler(void);

// ===== INPUT =====
#define BUTTON_REVERSE_Pin GPIO_PIN_0
#define BUTTON_REVERSE_GPIO_Port GPIOA

#define IR_SENSOR_Pin GPIO_PIN_1
#define IR_SENSOR_GPIO_Port GPIOA

// ===== OUTPUT =====
#define LED_GREEN_Pin GPIO_PIN_0
#define LED_GREEN_GPIO_Port GPIOB

#define LED_RED_Pin GPIO_PIN_1
#define LED_RED_GPIO_Port GPIOB

#define BUZZER_Pin GPIO_PIN_2
#define BUZZER_GPIO_Port GPIOB

#ifdef __cplusplus
}
#endif

#endif Main c:
#include "main.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();

  while (1)
  {
    // Baca input
    uint8_t sensor = HAL_GPIO_ReadPin(IR_SENSOR_GPIO_Port, IR_SENSOR_Pin);
    uint8_t button = HAL_GPIO_ReadPin(BUTTON_REVERSE_GPIO_Port, BUTTON_REVERSE_Pin);

    // 🟠 KONDISI UTAMA: tidak ada objek + switch ON → LED ORANGE
    if (sensor == GPIO_PIN_RESET && button == GPIO_PIN_SET)
    {
      HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
      HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET);
      HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);
    }

    // 🔴 Jika sensor mendeteksi objek
    else if (sensor == GPIO_PIN_SET)
    {
      if (button == GPIO_PIN_RESET)
      {
        // Mode 1 → LED merah
        HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
        HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);
      }
      else
      {
        // Mode 2 → LED hijau + buzzer
        HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET);
        HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
      }
    }

    // 📴 Kondisi lain → semua mati
    else
    {
      HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);
    }

    HAL_Delay(50);
  }
}

// ================= CLOCK =================
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

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

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |
                               RCC_CLOCKTYPE_SYSCLK |
                               RCC_CLOCKTYPE_PCLK1;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

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

// ================= GPIO =================
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  // INPUT (Button + IR)
  GPIO_InitStruct.Pin = BUTTON_REVERSE_Pin | IR_SENSOR_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  // OUTPUT (LED + BUZZER)
  GPIO_InitStruct.Pin = LED_GREEN_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);
}

// ================= ERROR =================
void Error_Handler(void)
{
  __disable_irq();
  while (1)
  {
  }
}

5. Video Demo [kembali]


6. Kondisi [kembali]

Percobaan 2 Sistem Deteksi Jarak Parkir Mundur

Kondisi 4: Buatlah rangkaian seperti pada gambar percobaan 2 dengan kondisi ketika Infrared sensor tidak mendeteksi benda dan switch on, maka LED menyala hijau

7. Video Simulasi [kembali]


8. Download File [kembali]

  1. Download Rangkaian Wokwi klik disini
  2. Download Datasheet IR sensor klik disini
  3. Download Datasheet Buzzer klik disini
  4. Download Datasheet LED RGB klik disini





Tugas Pendahuluan 1



1. Prosedur [kembali]

  1. Membuat project baru di STM32CubeIDE dengan memilih tipe mikrokontroler STM32F103C8 kemudian melakukan konfigurasi pin dengan mengatur PA0 sebagai input untuk sensor PIR, PA1 sebagai input untuk touch sensor, serta PB0 dan PB1 sebagai output untuk LED dan buzzer.
  2. Melakukan generate code menggunakan fitur yang tersedia di STM32CubeIDE, kemudian menambahkan program utama pada file main.c sesuai dengan kondisi percobaan yaitu ketika PIR mendeteksi gerakan selama waktu tertentu kemudian tidak lagi mendeteksi, dan sensor Touch tidak disentuh, LED mati dan Buzzer berbunyi
  3. Melakukan proses build atau kompilasi program untuk menghasilkan file berekstensi .hex yang nantinya akan digunakan pada simulasi di Proteus.
  4. Membuat rangkaian pada Proteus dengan menambahkan komponen STM32F103C8, sensor touch, sensor PIR, LED, buzzer, serta sumber tegangan VCC dan GND, kemudian menghubungkan touch sensor ke pin PA1, sensor PIR ke pin PA0, LED ke pin PB0 melalui resistor, dan buzzer ke pin PB1, serta memastikan semua ground terhubung dengan benar.
  5. Memasukkan file .hex hasil kompilasi ke dalam komponen STM32 pada Proteus melalui pengaturan program file.
  6. Menjalankan simulasi pada Proteus kemudian mengamati kondisi output dimana ketika PIR mendeteksi gerakan selama waktu tertentu kemudian tidak lagi mendeteksi, dan sensor Touch tidak disentuh, maka LED mati dan Buzzer berbunyi

2. Hardware dan Diagram Blok [kembali]

    1. STM32F103C8


Microcontroller

ARM Cortex-M3

Operating Voltage

3.3 V

Input Voltage (recommended)

5 V 

Input Voltage (limit)

2 – 3.6 V

Digital I/O Pins

32

PWM Digital I/O Pins

15

Analog Input Pins

10 (dengan resolusi 12-bit ADC)

DC Current per I/O Pin

25 mA

DC Current for 3.3V Pin

150 mA

Flash Memory

64 KB

SRAM

20 KB

EEPROM

Emulasi dalam Flash

 

Clock Speed

72 MHz


    2. Touch Sensor



    SPESIFIKASI:

  • Konsumsi daya yang rendah
  • Bisa menerima tegangan dari 2 ~ 5.5V DC
  • Dapat menggantikan fungsi saklar tradisional
  • Dilengkapi 4 lobang baut untuk memudahkan pemasangan
  • Tegangan kerja : 2v s/d 5.5v (optimal 3V)
  • Output high VOH : 0.8 VCC (typical)
  • Output low VOL : 0.3 VCC (max)
  • Arus Output Pin Sink (@ VCC 3V, VOL 0.6V) : 8 mA
  • Arus Output pin pull-up (@ VCC=3V, VOH=2.4V) : 4 mA
  • Waktu respon (low power mode): max 220 ms
  • Waktu respon (touch mode): max 60 ms
  • Ukuran: 24 mm x 24 mm x 7.2 mm

    3. PIR Sensor

    4. LED



    5. Buzzer

    6. Resistor

7. Diagram Blok


3. Rangkaian Simulasi dan Prinsip Kerja [kembali]


Prinspi Kerja : 

Prinsip kerja rangkaian pada Gambar Percobaan 1 Kondisi 3 ini berpusat pada mikrokontroler STM32F103C8 yang memproses input dari sensor PIR dan sensor sentuh untuk mengendalikan indikator output. Sistem bekerja dengan logika spesifik di mana setelah sensor PIR sempat mendeteksi gerakan selama waktu tertentu lalu berhenti mendeteksi, dan secara bersamaan sensor sentuh (Touch Sensor) berada dalam kondisi tidak disentuh, maka mikrokontroler akan mengirimkan instruksi untuk mematikan LED (D1) dan mengaktifkan Buzzer (BUZ1) sebagai sinyal peringatan suara. Komponen pendukung seperti resistor R1 berfungsi menjaga kestabilan sinyal input, sementara R2 bertugas membatasi arus yang mengalir ke LED agar tetap aman selama operasional alat.

4. Flowchart dan Listing Program [kembali]

Flowchart:


Listing Program:

#include "stm32f1xx_hal.h"


/* ================== VARIABEL ================== */

uint32_t pir_last_time = 0;

uint8_t pir_detected = 0;


#define PIR_TIMEOUT 3000 // 3 detik


/* ================== PROTOTYPE ================== */

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

void Error_Handler(void);


/* ================== MAIN ================== */

int main(void)

{

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();


while (1)

{

uint8_t pir = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);

uint8_t touch = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);


/* ====== SAAT PIR MENDETEKSI ====== */

if (pir == GPIO_PIN_SET)

{

pir_detected = 1;

pir_last_time = HAL_GetTick();


// LED ON

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);


// Buzzer OFF

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);

}


/* ====== SAAT PIR TIDAK MENDETEKSI ====== */

else

{

// Jika sebelumnya ada gerakan

if (pir_detected == 1)

{

// Cek apakah sudah lewat waktu tertentu

if ((HAL_GetTick() - pir_last_time) > PIR_TIMEOUT)

{

// Jika touch TIDAK disentuh

if (touch == GPIO_PIN_RESET)

{

// LED OFF

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);


// Buzzer ON

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);

}


pir_detected = 0; // reset status

}

}

}

}

}


/* ================== CLOCK ================== */

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;


if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

Error_Handler();

}


/* ================== GPIO ================== */

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};


__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();


/* ===== INPUT: PIR (PA0) & TOUCH (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);


/* ===== OUTPUT: LED (PB0) & BUZZER (PB1) ===== */

GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


/* Default OFF */

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);

}


/* ================== ERROR ================== */

void Error_Handler(void)

{

__disable_irq();

while (1)

{

}

}

5. Video Demo [kembali]



6. Kondisi [kembali]

Percobaan 1 Kontrol Lampu Lorong

Kondisi 3 : 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]

  1. Download File Rangkaian klik disini
  2. Download Program klik disini
  3. Download Library PIR Sensor klik disini
  4. Download Library Touch Sensor klik disini





Tugas Pendahuluan 2

[KEMBALI KE MENU SEBELUMNYA] DAFTAR ISI 1.  Prosedur 2. H ardware dan Diagram Blok 3. R angkaian Simulasi dan Prinsip Kerja ...