LAPORAN AKHIR 1 MODUL 1 GENERAL INPUT OUTPUT






1. Prosedur [kembali]

Percobaan 8 : LED RGB, Buzzer, Touch Sensor dan PIR
  1. Siapkan alat-alat yang diperlukan pada Wokwi Simulation atau perangkat keras nyata
  2. Hubungkan Sensor PIR:
    • VCC ke 5V
    • GND ke GND STM32
    • OUT ke GPIO PA0
  3. Hubungkan Sensor Sentuh (Touch Sensor):
    • VCC ke 5V
    • GND ke GND STM32
    • OUT ke GPIO PA1
  4. Hubungkan LED RGB:
    • Anoda LED Merah ke GPIO PB0 melalui resistor 110Ω
    • Anoda LED Hijau ke GPIO PB1 melalui resistor 110Ω
    • Anoda LED Biru ke GPIO PB2 melalui resistor 110Ω
    • Katoda ke GND
  5. Hubungkan Buzzer:
    • Salah satu kaki buzzer ke GND STM32
    • Kaki lainnya ke GPIO PA5 melalui resistor 110Ω
  6. Hubungkan sensor PIR dan sensor sentuh ke sumber daya 3,3V atau 5V sesuai spesifikasi sensor
  7. Inputkan Listing Program ke STM32CubeIDE
  8. Jalankan (Running) program dan amati respon sensor serta keluaran LED dan Buzzer
2. Hardware dan Diagram Blok [kembali]
  • STM32
STM32 adalah keluarga mikrokontroler berbasis arsitektur ARM Cortex yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini memiliki performa tinggi, konsumsi daya rendah, serta fitur periferal yang lengkap, seperti ADC (Analog to Digital Converter), komunikasi serial (UART, SPI, I2C), dan GPIO yang dapat dikonfigurasi sesuai kebutuhan. STM32 sering digunakan dalam sistem tertanam (embedded systems) untuk berbagai aplikasi, termasuk otomasi, robotika, dan perangkat IoT.
  • LED RGB
LED RGB (Red, Green, Blue) adalah jenis LED yang mampu menghasilkan berbagai warna cahaya dengan mengatur intensitas dari tiga warna dasar: merah, hijau, dan biru. Dengan menggabungkan ketiga warna ini dalam berbagai tingkat kecerahan, LED RGB dapat menghasilkan spektrum warna yang luas. Komponen ini sering digunakan dalam pencahayaan dekoratif, tampilan visual interaktif, dan sistem indikator dalam berbagai perangkat elektronik.
  • Buzzer

Buzzer adalah komponen elektronik yang digunakan untuk menghasilkan suara dalam berbagai frekuensi. Buzzer dapat bekerja berdasarkan prinsip piezoelektrik atau elektromagnetik untuk mengubah sinyal listrik menjadi getaran suara. Dalam sistem tertanam, buzzer sering digunakan sebagai alarm, notifikasi audio, atau indikator peringatan dalam perangkat elektronik seperti jam tangan, sistem keamanan, dan mesin industri.

  • Infrared Sensor
Infrared (IR) sensor adalah perangkat yang berfungsi untuk mendeteksi keberadaan objek atau perubahan suhu berdasarkan radiasi inframerah. Sensor ini bekerja dengan mengirimkan sinyal inframerah dan mengukur refleksi atau perubahan intensitas cahaya inframerah yang diterima. Dalam berbagai aplikasi, sensor inframerah digunakan untuk deteksi gerakan (seperti pada sensor PIR), pengukuran jarak, serta komunikasi data pada perangkat seperti remote control.
  • Touch Sensor
Touch sensor adalah komponen elektronik yang berfungsi untuk mendeteksi sentuhan atau tekanan fisik pada permukaannya. Sensor ini bekerja berdasarkan perubahan kapasitansi atau resistansi saat disentuh, sehingga dapat digunakan sebagai pengganti tombol mekanis. Touch sensor sering digunakan dalam perangkat layar sentuh, sakelar elektronik, dan sistem keamanan berbasis sentuhan karena keandalannya yang tinggi serta ketahanannya terhadap keausan dibandingkan dengan tombol konvensional.

  • flowchart


3. Rangkaian Simulasi dan Prinsip Kerja [kembali]

  • Rangkaian Simulasi

  • Prinsip Kerja

Rangkaian ini bekerja berdasarkan interaksi antara sensor PIR (Passive Infrared), sensor sentuh (Touch Sensor), mikrokontroler STM32, LED RGB, dan buzzer. Setiap komponen memiliki peran tertentu dalam sistem, yang secara keseluruhan dapat digunakan untuk mendeteksi keberadaan objek dan memberikan respons berupa cahaya dan suara. Berikut adalah prinsip kerja dari rangkaian:

  1. Deteksi Gerakan dengan Sensor PIR

    • Sensor PIR digunakan untuk mendeteksi gerakan berdasarkan perubahan radiasi inframerah yang diterima.
    • Saat ada pergerakan di depan sensor, sensor PIR akan mengirimkan sinyal output digital ke STM32.
    • STM32 akan memproses sinyal ini dan dapat mengaktifkan LED RGB atau buzzer sebagai indikator keberadaan objek.
  2. Deteksi Sentuhan dengan Touch Sensor

    • Sensor sentuh (Touch Sensor) berfungsi untuk mendeteksi sentuhan fisik.
    • Ketika pengguna menyentuh sensor, sensor akan mengeluarkan sinyal HIGH (1) ke STM32.
    • STM32 kemudian dapat mengontrol LED RGB untuk menyalakan atau mengubah warna sesuai dengan kondisi yang telah diprogram.
  3. Kontrol LED RGB

    • LED RGB memiliki tiga warna dasar (merah, hijau, dan biru) yang dapat dikombinasikan untuk menghasilkan warna yang berbeda.
    • STM32 mengontrol intensitas dari masing-masing warna LED berdasarkan input dari sensor PIR dan sensor sentuh.
    • Contohnya, jika sensor PIR mendeteksi gerakan, STM32 dapat mengaktifkan LED berwarna merah sebagai tanda peringatan.
  4. Aktivasi Buzzer sebagai Alarm

    • Buzzer digunakan sebagai indikator suara yang dikendalikan oleh STM32.
    • Ketika sensor PIR mendeteksi gerakan atau sensor sentuh diaktifkan, STM32 dapat menyalakan buzzer dengan pola bunyi tertentu sebagai alarm atau notifikasi.
    • Durasi dan pola bunyi buzzer dapat diatur sesuai dengan program yang telah dibuat.
  5. Pengolahan Data oleh Mikrokontroler STM32

    • Mikrokontroler STM32 berperan sebagai pusat kendali rangkaian.
    • STM32 menerima input dari sensor PIR dan sensor sentuh, kemudian memproses data untuk menentukan apakah LED RGB dan buzzer harus diaktifkan atau tidak.
    • Logika pemrosesan ini bergantung pada kode program yang ditanamkan dalam STM32, yang dapat dikustomisasi sesuai kebutuhan.


4. Flowchart dan Listing Program [kembali]
  • Listing Program pada STM32

/* USER CODE BEGIN Header */

/**

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

* @file : main.c

* @brief : Main program body

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

* @attention

*

* Copyright (c) 2025 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 */


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


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

/* USER CODE BEGIN 2 */


/* USER CODE END 2 */


/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

uint8_t pir_status = HAL_GPIO_ReadPin(GPIOB, PIR_Pin);

uint8_t touch_status = HAL_GPIO_ReadPin(GPIOB, TOUCH_Pin);


HAL_GPIO_WritePin(GPIOA, GREEN_Pin | RED_Pin | BUZZER_Pin, GPIO_PIN_RESET);


if (pir_status == GPIO_PIN_SET)

{

HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);

}


if (touch_status == GPIO_PIN_SET)

{

HAL_GPIO_WritePin(GPIOA, GREEN_Pin, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);

}


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(GPIOA, RED_Pin|GREEN_Pin|BUZZER_Pin, GPIO_PIN_RESET);


/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, GPIO_PIN_RESET);


/*Configure GPIO pins : RED_Pin GREEN_Pin BUZZER_Pin */

GPIO_InitStruct.Pin = RED_Pin|GREEN_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(GPIOA, &GPIO_InitStruct);


/*Configure GPIO pin : BLUE_Pin */

GPIO_InitStruct.Pin = BLUE_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(BLUE_GPIO_Port, &GPIO_InitStruct);


/*Configure GPIO pins : PIR_Pin TOUCH_Pin */

GPIO_InitStruct.Pin = PIR_Pin|TOUCH_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_NOPULL;

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

  • Listing Program pada modul
#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)
    {
        uint8_t pir_status = HAL_GPIO_ReadPin(GPIOB, PIR_Pin);
        uint8_t touch_status = HAL_GPIO_ReadPin(GPIOB, TOUCH_Pin);

        // Turn off all output signals initially
        HAL_GPIO_WritePin(GPIOA, GREEN_Pin | RED_Pin | BUZZER_Pin, GPIO_PIN_RESET);

        // PIR sensor detected motion
        if (pir_status == GPIO_PIN_SET)
        {
            HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_SET);
            HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
        }

        // Touch sensor activated
        if (touch_status == GPIO_PIN_SET)
        {
            HAL_GPIO_WritePin(GPIOA, GREEN_Pin, GPIO_PIN_SET);
            HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
        }

        HAL_Delay(100); // Small delay to debounce sensor readings
    }
}

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

    __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();

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

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

    __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    // Initialize output pins
    HAL_GPIO_WritePin(GPIOA, RED_Pin | GREEN_Pin | BUZZER_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, GPIO_PIN_RESET);

    GPIO_InitStruct.Pin = RED_Pin | GREEN_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(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = BLUE_Pin;
    HAL_GPIO_Init(BLUE_GPIO_Port, &GPIO_InitStruct);

    // Initialize input pins
    GPIO_InitStruct.Pin = PIR_Pin | TOUCH_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void Error_Handler(void)
{
    __disable_irq();
    while (1)
    {
    }
}

#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif
  • Flowchart


5. Video Demo [kembali]


6. Analisa [kembali]




7. Download file [kembali]

Komentar

Postingan populer dari blog ini

KOMITMEN TERHADAP KESELAMATAN DAN RESIKO DALAM PEKERJAAN

KELEBIHAN DAN KEKURANGAN MENJADI SEORANG PEMIMPIN