Tugas Pendahuluan 1
MODUL 1 PERCOBAAN 1 KONDISI 2
1. Buka software proteus lalu rangkai komponen sesuai dengan gambar yang ada di modul
2. Buka software STM32CubeIDE lalu lakukan konfigurasi pin pada STM untuk menentukan GPIO input dan GPIO output
3. Masukan Program ke dalam software STM32CubeIDE lalu build untuk mendapatkan file .hex
4. Masukan file .hex ke dalam file library STM32F103C8 pada proteus
5. Simulasikan rangkaian
2. Hardware dan Diagram Blok[Kembali]
- Hardware
1. STM32F103C8
2. Touch Sensor
3. PIR Sensor
4. LED
5. Buzzer
6. Resistor
3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]
- Sensor mendeteksi, maka logicstate berlogika 1
- Salah satu sensor ketika berlogika 1, maka akan diteruskan ke STM32F103C8 sebagai input PA0 dan PA1
- Setelah itu keluarannya dari PB0 dan PB1 akan menghidupkan LED dan Buzzer secara bersamaan
- Pada Touch sensor, outputnya akan ON dan OFF setiap berlogika 1 secara bergantian.
- Pada PIR sensor, outputnya akan ON dan OFF setiap pergantian logika 1 dengan 0
4. Flowchart dan Listing Program[Kembali]
- Flowchart
- Listing Program
#include "stm32f1xx_hal.h"
// =====================
// VARIABEL GLOBAL
// =====================
uint8_t system_enable = 0;
uint8_t touch_last = 0;
uint8_t pir_first_trigger = 1;
// =====================
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void Error_Handler(void);
// =====================
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
uint8_t pir_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
uint8_t touch_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
// =========================
// TOUCH → TOGGLE SYSTEM
// =========================
if (touch_now == GPIO_PIN_SET && touch_last == GPIO_PIN_RESET)
{
system_enable = !system_enable;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_Delay(200);
}
touch_last = touch_now;
// =========================
// PIR TRIGGER (BUZZER SEKALI)
// =========================
if (pir_now == GPIO_PIN_SET && pir_first_trigger)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
pir_first_trigger = 0;
}
else if (pir_now == GPIO_PIN_RESET)
{
pir_first_trigger = 1;
}
// =========================
// LOGIKA LED (FIX SESUAI SOAL)
// =========================
uint8_t led_state = 0;
// 👉 KONDISI WAJIB (soal)
if (pir_now == GPIO_PIN_RESET && touch_now == GPIO_PIN_RESET && system_enable == 0)
{
led_state = 0; // LED mati
}
else if (pir_now == GPIO_PIN_SET)
{
led_state = 1; // PIR aktif
}
else if (system_enable)
{
led_state = 1; // mode manual
}
else
{
led_state = 0;
}
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,
led_state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
}
// =====================
// CLOCK CONFIG
// =====================
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 INIT
// =====================
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// PA0 = PIR, PA1 = TOUCH
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);
// PB0 = LED, PB1 = BUZZER
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);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);
}
// =====================
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
M1 P1 K2: Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi ketika PIR tidak mendeteksi gerakan dan sensor Touch tidak mendeteksi sentuhan, maka LED akan mati
Komentar
Posting Komentar