Tugas Pendahuluan 1
2. Buat program untuk mikrokontroler STM32F103C8 di software STM32 CubeIDE.
3. Compile program dalam format hex, lalu upload ke dalam mikrokontroler.
4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.
Sistem ini menggunakan mikrokontroler STM32F103C8 untuk membaca input dari sensor infrared (IR) dan sensor sentuh, lalu mengendalikan output LED RGB berdasarkan kondisi yang terdeteksi. Ketika sistem dinyalakan, sensor IR dan sensor sentuh mulai melakukan pembacaan data. Jika sensor IR tidak mendeteksi objek (logika 0) namun sensor sentuh aktif (logika 1), LED RGB akan menyala dengan warna biru, yaitu hanya LED biru yang diaktifkan. Jika kedua sensor, baik IR maupun sensor sentuh, mendeteksi objek atau sentuhan (keduanya logika 1), maka LED RGB akan menampilkan warna cyan dengan menyalakan LED hijau dan biru secara bersamaan. Sedangkan, apabila hanya sensor IR yang mendeteksi objek (logika 1) dan sensor sentuh tidak aktif (logika 0), LED RGB akan menyala dengan warna hijau melalui aktivasi LED hijau saja.
Mikrokontroler membaca data sensor dari pin PB10 (untuk sensor IR) dan PB7 (untuk sensor touch), kemudian mengontrol LED RGB yang terhubung ke pin PA6 (Merah), PA7 (Hijau), dan PB0 (Biru) berdasarkan hasil pembacaan tersebut. Setiap perubahan pada sensor segera diproses oleh mikrokontroler untuk menentukan warna LED yang sesuai. Sistem ini bekerja secara real-time, sehingga setiap perubahan kondisi sensor langsung tercermin pada perubahan warna LED RGB. Dengan demikian, sistem ini memungkinkan pemantauan otomatis terhadap kondisi sensor dan memberikan umpan balik visual melalui pergantian warna LED.
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx_hal.h" // Library HAL untuk STM32F1
#include "main.h" // Header file main
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* USER CODE BEGIN Private defines */
// Definisi nama Pin LED dan Sensor
#define RED_Pin GPIO_PIN_6 // Pin untuk LED Merah
#define GREEN_Pin GPIO_PIN_7 // Pin untuk LED Hijau
#define BLUE_Pin GPIO_PIN_0 // Pin untuk LED Biru
#define IR_Pin GPIO_PIN_10 // Pin untuk Sensor IR
#define TOUCH_Pin GPIO_PIN_7 // Pin untuk Sensor Sentuh
#define RED_GPIO_Port GPIOA // Port LED Merah
#define GREEN_GPIO_Port GPIOA // Port LED Hijau
#define BLUE_GPIO_Port GPIOB // Port LED Biru
#define IR_GPIO_Port GPIOB // Port Sensor IR
#define TOUCH_GPIO_Port GPIOB // Port Sensor Sentuh
/* USER CODE END Private defines */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void); // Fungsi untuk konfigurasi clock sistem
static void MX_GPIO_Init(void); // Fungsi untuk inisialisasi GPIO
void Error_Handler(void); // Fungsi untuk error handling
/* Main program */
int main(void)
{
HAL_Init(); // Inisialisasi HAL Library
SystemClock_Config(); // Konfigurasi Clock Sistem
MX_GPIO_Init(); // Inisialisasi semua GPIO
while (1) // Loop utama program
{
uint8_t ir_status = HAL_GPIO_ReadPin(IR_GPIO_Port, IR_Pin); // Membaca status sensor IR
uint8_t touch_status = HAL_GPIO_ReadPin(TOUCH_GPIO_Port, TOUCH_Pin); // Membaca status sensor Sentuh
if (ir_status == GPIO_PIN_RESET && touch_status == GPIO_PIN_SET) // Jika IR LOW dan Sentuh HIGH
{
// Hanya LED Biru yang dinyalakan
HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, GPIO_PIN_SET); // Nyalakan LED Biru
HAL_GPIO_WritePin(RED_GPIO_Port, RED_Pin, GPIO_PIN_RESET); // Matikan LED Merah
HAL_GPIO_WritePin(GREEN_GPIO_Port, GREEN_Pin, GPIO_PIN_RESET); // Matikan LED Hijau
}
else if (ir_status == GPIO_PIN_SET) // Jika IR HIGH (terdeteksi objek)
{
// Nyalakan LED Cyan (Hijau + Biru)
HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, GPIO_PIN_SET); // Nyalakan LED Biru
HAL_GPIO_WritePin(RED_GPIO_Port, RED_Pin, GPIO_PIN_RESET); // Matikan LED Merah
HAL_GPIO_WritePin(GREEN_GPIO_Port, GREEN_Pin, GPIO_PIN_SET); // Nyalakan LED Hijau
}
else
{
// Semua LED dimatikan
HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, GPIO_PIN_RESET); // Matikan LED Biru
HAL_GPIO_WritePin(RED_GPIO_Port, RED_Pin, GPIO_PIN_RESET); // Matikan LED Merah
HAL_GPIO_WritePin(GREEN_GPIO_Port, GREEN_Pin, GPIO_PIN_RESET);// Matikan LED Hijau
}
HAL_Delay(100); // Delay 100ms untuk stabilisasi pembacaan sensor
}
}
/**
* @brief System Clock Configuration
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Struktur untuk konfigurasi osilator
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // Struktur untuk konfigurasi clock
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; // Gunakan internal HSI oscillator
RCC_OscInitStruct.HSIState = RCC_HSI_ON; // Aktifkan HSI
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; // Kalibrasi default HSI
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Tidak menggunakan PLL
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) // Jika gagal konfigurasi oscillator
{
Error_Handler(); // Panggil Error Handler
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; // Konfigurasi semua clock bus
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // Gunakan HSI sebagai sumber clock
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB = SYSCLK/1
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; // APB1 = HCLK/1
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // APB2 = HCLK/1
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) // Set konfigurasi clock
{
Error_Handler(); // Panggil Error Handler jika gagal
}
}
/**
* @brief GPIO Initialization Function
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; // Struktur konfigurasi GPIO
/* Enable Clocks */
__HAL_RCC_GPIOA_CLK_ENABLE(); // Aktifkan clock untuk GPIOA
__HAL_RCC_GPIOB_CLK_ENABLE(); // Aktifkan clock untuk GPIOB
__HAL_RCC_GPIOD_CLK_ENABLE(); // Aktifkan clock untuk GPIOD
/* Output Pins: RED, GREEN */
GPIO_InitStruct.Pin = RED_Pin | GREEN_Pin; // Pin untuk LED Merah dan Hijau
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Mode output push-pull
GPIO_InitStruct.Pull = GPIO_NOPULL; // Tidak ada pull-up/pull-down
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Kecepatan rendah
HAL_GPIO_Init(RED_GPIO_Port, &GPIO_InitStruct); // Inisialisasi di Port A
/* Output Pin: BLUE */
GPIO_InitStruct.Pin = BLUE_Pin; // Pin untuk LED Biru
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Mode output push-pull
GPIO_InitStruct.Pull = GPIO_NOPULL; // Tidak ada pull-up/pull-down
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Kecepatan rendah
HAL_GPIO_Init(BLUE_GPIO_Port, &GPIO_InitStruct); // Inisialisasi di Port B
/* Input Pins: IR, TOUCH */
GPIO_InitStruct.Pin = IR_Pin | TOUCH_Pin; // Pin untuk sensor IR dan Sentuh
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // Mode input
GPIO_InitStruct.Pull = GPIO_NOPULL; // Tidak ada pull-up/pull-down
HAL_GPIO_Init(IR_GPIO_Port, &GPIO_InitStruct); // Inisialisasi di Port B
/* Set semua LED OFF saat start */
HAL_GPIO_WritePin(RED_GPIO_Port, RED_Pin, GPIO_PIN_RESET); // Matikan LED Merah
HAL_GPIO_WritePin(GREEN_GPIO_Port, GREEN_Pin, GPIO_PIN_RESET);// Matikan LED Hijau
HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, GPIO_PIN_RESET); // Matikan LED Biru
}
Komentar
Posting Komentar