Tugas Pendahuluan 2
a. Prosedur [Kembali]
- Buka web WOKWI.COM dan cari STM 32 NUCLEO C031C6
- Rangkai komponen sesuai dengan gambar rangkaian di modul
- Klik pada Library Manager untuk membuat file baru yang bernama main.h dan main.c
- Masukan program yang telah di buat sesuai kondisi pada kedua file tersebut
- Simulasikan
b. Hardware dan Diagram Blok [Kembali]
- Hardware
1. STM32 NUCLEO-G474RE
2. PIR Sensor
3. LDR Sensor
4. Driver Motor L298
5. Resistor 1k ohm
6. LED
c. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
ldr < 2000). Saat mikrokontroler mendeteksi kondisi terang ini, program akan mengeksekusi instruksi di dalam blok logika khusus siang hari. Mikrokontroler akan langsung menjalankan fungsi set_LED(LED_OFF) yang mengirimkan sinyal PWM (Pulse Width Modulation) dengan nilai siklus kerja 0 ke pin PA6, sehingga lampu LED akan mati sepenuhnya. Karena struktur program ini menggunakan percabangan if-else di mana evaluasi kondisi LDR ditempatkan sebagai prioritas (di dalam blok if pertama), mikrokontroler akan secara otomatis melompati atau mengabaikan seluruh blok kode else yang berisi logika pembacaan sensor gerak PIR. Akibatnya, terlepas dari apakah sensor PIR mendeteksi pergerakan atau tidak, sistem sama sekali tidak akan memproses sinyal tersebut dan LED dipastikan akan tetap padam. Selain itu, pada kondisi terang ini, mikrokontroler juga akan mereset data waktu pergerakan terakhir (last_motion_time), guna mencegah lampu tiba-tiba menyala akibat "sisa" memori gerakan ketika kondisi lingkungan berangsur berubah menjadi gelap (malam hari).
d. Flowchart dan Listing Program [Kembali]
- Flowchart
- Listing Program
#include "main.h"
// HANDLE
ADC_HandleTypeDef
hadc1;
TIM_HandleTypeDef
htim3;
// VARIABLE
volatile uint8_t emergency_mode = 0;
uint32_t last_motion_time = 0;
// fallback
tombol
uint8_t last_button_state = 1;
//
PARAMETER
#define LDR_THRESHOLD 2000
#define MOTION_TIMEOUT 5000
#define LED_OFF 0
#define LED_DIM 100
#define LED_FULL 1000
//
================= 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;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource
= RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
}
//
================= GPIO =================
void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// PIR → PA1
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// BUTTON → PB1 (PULL-UP +
INTERRUPT)
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// LED PWM → PA6
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// IRQ untuk PB1 (EXTI0_1)
HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0,
0);
HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
}
//
================= ADC =================
void MX_ADC1_Init(void)
{
__HAL_RCC_ADC_CLK_ENABLE();
hadc1.Instance = ADC1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
HAL_ADC_Init(&hadc1);
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
//
================= PWM =================
void MX_TIM3_Init(void)
{
__HAL_RCC_TIM3_CLK_ENABLE();
htim3.Instance = TIM3;
htim3.Init.Prescaler = 64;
htim3.Init.Period = 1000;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_PWM_Init(&htim3);
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}
//
================= INTERRUPT =================
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_1)
{
emergency_mode = !emergency_mode;
}
}
//
================= HELPER =================
uint16_t read_LDR(void)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,
HAL_MAX_DELAY);
return HAL_ADC_GetValue(&hadc1);
}
void set_LED(uint16_t value)
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, value);
}
//
================= MAIN =================
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM3_Init();
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
while (1)
{
// =====
FALLBACK BUTTON =====
uint8_t current_button =
HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
if (last_button_state == 1 && current_button == 0)
{
emergency_mode = !emergency_mode;
HAL_Delay(50);
}
last_button_state = current_button;
// =====
MODE DARURAT =====
if (emergency_mode)
{
set_LED(LED_OFF);
continue;
}
uint16_t ldr = read_LDR();
uint8_t pir = HAL_GPIO_ReadPin(GPIOA,
GPIO_PIN_1);
// =====
KONDISI SIANG (CAHAYA TERANG) =====
// (Ganti
tanda '<' menjadi '>' jika nilai ADC LDR Anda naik saat terang)
if (ldr < LDR_THRESHOLD)
{
set_LED(LED_OFF); // Matikan LED sepenuhnya
// Reset timer agar gerakan terakhir tidak tersimpan ke malam hari
last_motion_time = HAL_GetTick() - MOTION_TIMEOUT;
}
else
{
// ===== KONDISI MALAM (CAHAYA GELAP) =====
if (pir == GPIO_PIN_SET)
{
last_motion_time = HAL_GetTick();
}
if (HAL_GetTick() -
last_motion_time < MOTION_TIMEOUT)
{
set_LED(LED_FULL); // Ada gerakan -> Nyala Penuh
}
else
{
set_LED(LED_DIM); // Tidak ada gerakan -> Redup
}
}
HAL_Delay(100);
}
}
e. Video Demo [Kembali]
f. Kondisi [Kembali]
Kondisi 10 : Buatlah rangkaian seperti pada gambar percobaan 4 dengan kondisi ketika LDR mendeteksi cahaya terang, maka LED akan mati sepenuhnya terlepas dari apakah PIR mendeteksi gerakan atau tidak.
g. Video Simulasi [Kembali]
h. Download File [Kembali]
File Tugas Pendahuluan(Zip) [Download]
Video Simulasi [Download]
Download Datasheet Pir Sensor [Download]
Download Datasheet Resistor [Download]
Download Datasheet LED [Download]
Download Datasheet STM32 Nucleo G474RE [Download]
Download Datasheet LDR Sensor [Download]
Download Datasheet Push Button [Download]
Komentar
Posting Komentar