Tugas Pendahuluan 2
1. Prosedur[kembali]
- Akses situs Wokwi melalui alamat wokwi.com, kemudian pilih board STM32 Nucleo C031C6.
- Susun rangkaian komponen sesuai dengan diagram rangkaian yang terdapat pada modul praktikum.
- Buka menu Library Manager, lalu buat dua file baru dengan nama main.h dan main.c.
- Masukkan program yang telah dibuat ke dalam kedua file tersebut sesuai dengan kondisi yang ditentukan pada percobaan.
- Jalankan simulasi untuk menguji apakah rangkaian dan program telah bekerja dengan baik.
2. Hardware dan Diagram Blok [kembali]
Hardware
1. STM32 NUCLEO-G474RE
2. PIR Sensor
3. Infrared Sensor
4. Resistor
5. Buzzer
6. LED
3. Rangkaian Simulasi Dan Prinsip Kerja [kembali]
Prinsip Kerja:
Rangkaian pada percobaan ini bekerja sebagai sistem kontrol pencahayaan otomatis berbasis mikrokontroler STM32 Nucleo C031C6 dengan memanfaatkan sensor cahaya (LDR) dan sensor gerak (PIR). LDR berfungsi untuk mendeteksi intensitas cahaya lingkungan dan menghasilkan sinyal analog yang akan dibaca oleh mikrokontroler melalui pin ADC. Nilai analog tersebut menunjukkan kondisi terang atau gelap di sekitar sensor. Sementara itu, sensor PIR digunakan untuk mendeteksi adanya gerakan manusia dan menghasilkan sinyal digital berupa logika HIGH ketika terdapat gerakan dan LOW ketika tidak ada gerakan.
Data dari kedua sensor tersebut kemudian diproses oleh mikrokontroler untuk menentukan kondisi sistem. Apabila LDR mendeteksi kondisi terang dan sensor PIR mendeteksi adanya gerakan, maka mikrokontroler akan mematikan LED. Sebaliknya, jika tidak ada gerakan atau kondisi tidak memenuhi syarat tersebut, maka LED akan menyala. Dengan demikian, LED hanya akan mati ketika terdapat aktivitas pada kondisi terang. Selain itu, push button pada rangkaian dapat digunakan sebagai input tambahan untuk kontrol manual atau pengujian sistem. Secara keseluruhan, rangkaian ini menunjukkan prinsip kerja integrasi antara sensor analog dan digital dalam sistem embedded untuk mengontrol output secara otomatis berdasarkan kondisi lingkungan.
4. Flowchart dan Listing Program [kembali]
#ifndef __MAIN_H // Mencegah double include
#define __MAIN_H
#include "stm32c0xx_hal.h" // Library utama HAL STM32
// ================= PIN DEFINITIONS =================
// LDR (ADC)
#define LDR_PORT GPIOA
#define LDR_PIN GPIO_PIN_0 // PA0 sebagai input analog (LDR)
// PIR SENSOR
#define PIR_PORT GPIOA
#define PIR_PIN GPIO_PIN_1 // PA1 sebagai input digital (PIR)
// PUSH BUTTON (INTERRUPT)
#define BUTTON_PORT GPIOB
#define BUTTON_PIN GPIO_PIN_1 // PB1 sebagai tombol interrupt
// LED PWM
#define LED_PORT GPIOA
#define LED_PIN GPIO_PIN_6 // PA6 sebagai output PWM (TIM3_CH1)
// ================= FUNCTION PROTOTYPES =================
void SystemClock_Config(void); // Konfigurasi clock sistem
void MX_GPIO_Init(void); // Inisialisasi GPIO
void MX_ADC1_Init(void); // Inisialisasi ADC
void MX_TIM3_Init(void); // Inisialisasi Timer PWM
#endif
main.c:
#include "main.h" // Memanggil header utama
// ================= HANDLE =================
ADC_HandleTypeDef hadc1; // Handle untuk ADC
TIM_HandleTypeDef htim3; // Handle untuk Timer PWM
// ================= VARIABLE =================
volatile uint8_t emergency_mode = 0; // Mode darurat (toggle dari tombol)
uint32_t last_motion_time = 0; // Waktu terakhir deteksi gerakan
// fallback tombol (manual polling)
uint8_t last_button_state = 1;
// ================= PARAMETER =================
#define LDR_THRESHOLD 2000 // Ambang terang/gelap (ADC)
#define MOTION_TIMEOUT 5000 // Delay waktu gerakan (tidak dipakai di logika baru)
#define LED_OFF 0 // PWM = 0 → LED mati
#define LED_DIM 100 // LED redup (opsional)
#define LED_FULL 1000 // LED terang maksimal
// ================= CLOCK =================
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Struktur konfigurasi oscillator
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // Struktur konfigurasi clock
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; // Gunakan HSI
RCC_OscInitStruct.HSIState = RCC_HSI_ON; // Aktifkan HSI
HAL_RCC_OscConfig(&RCC_OscInitStruct); // Terapkan konfigurasi
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // Sumber clock dari HSI
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // Tanpa pembagi
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); // Terapkan
}
// ================= GPIO =================
void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE(); // Aktifkan clock GPIOA
__HAL_RCC_GPIOB_CLK_ENABLE(); // Aktifkan clock GPIOB
GPIO_InitTypeDef GPIO_InitStruct = {0};
// ===== PIR → PA1 =====
GPIO_InitStruct.Pin = GPIO_PIN_1; // Pin PA1
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // Input digital
GPIO_InitStruct.Pull = GPIO_NOPULL; // Tanpa pull resistor
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// ===== BUTTON → PB1 =====
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // Interrupt saat ditekan
GPIO_InitStruct.Pull = GPIO_PULLUP; // Pull-up internal
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// ===== LED PWM → PA6 =====
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // Alternate function (PWM)
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM3; // Hubungkan ke TIM3
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// ===== ENABLE INTERRUPT =====
HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0, 0); // Prioritas interrupt
HAL_NVIC_EnableIRQ(EXTI0_1_IRQn); // Aktifkan interrupt
}
// ================= ADC =================
void MX_ADC1_Init(void)
{
__HAL_RCC_ADC_CLK_ENABLE(); // Aktifkan clock ADC
hadc1.Instance = ADC1; // Gunakan ADC1
hadc1.Init.Resolution = ADC_RESOLUTION_12B; // Resolusi 12-bit
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // Data rata kanan
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; // Single channel
hadc1.Init.ContinuousConvMode = DISABLE; // Tidak kontinu
HAL_ADC_Init(&hadc1);
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_0; // PA0
sConfig.Rank = ADC_REGULAR_RANK_1;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
// ================= PWM =================
void MX_TIM3_Init(void)
{
__HAL_RCC_TIM3_CLK_ENABLE(); // Aktifkan clock timer
htim3.Instance = TIM3;
htim3.Init.Prescaler = 64; // Pembagi clock
htim3.Init.Period = 1000; // Resolusi PWM
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_PWM_Init(&htim3);
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1; // Mode PWM
sConfigOC.Pulse = 0; // Awal mati
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) // Jika tombol ditekan
{
emergency_mode = !emergency_mode; // Toggle mode darurat
}
}
// ================= HELPER =================
uint16_t read_LDR(void)
{
HAL_ADC_Start(&hadc1); // Mulai ADC
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); // Tunggu selesai
return HAL_ADC_GetValue(&hadc1); // Ambil nilai
}
void set_LED(uint16_t value)
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, value); // Set PWM
}
// ================= MAIN =================
int main(void)
{
HAL_Init(); // Inisialisasi HAL
SystemClock_Config(); // Setup clock
MX_GPIO_Init(); // Setup GPIO
MX_ADC1_Init(); // Setup ADC
MX_TIM3_Init(); // Setup PWM
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // Start PWM
while (1)
{
// ===== FALLBACK BUTTON =====
uint8_t current_button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1); // Baca tombol
if (last_button_state == 1 && current_button == 0) // Deteksi tekan
{
emergency_mode = !emergency_mode; // Toggle
HAL_Delay(50); // Debounce
}
last_button_state = current_button;
// ===== MODE DARURAT =====
if (emergency_mode)
{
set_LED(LED_OFF); // Paksa LED mati
continue;
}
// ===== BACA SENSOR =====
uint16_t ldr = read_LDR(); // Baca LDR
uint8_t pir = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1); // Baca PIR
// ===== LOGIKA UTAMA =====
if (ldr < LDR_THRESHOLD) // KONDISI TERANG
{
if (pir == GPIO_PIN_SET)
{
// ADA GERAKAN → LED MATI
set_LED(LED_OFF);
}
else
{
// TIDAK ADA GERAKAN → LED MENYALA
set_LED(LED_FULL);
}
}
else // KONDISI GELAP
{
// LED MATI (sesuai permintaan percobaan)
set_LED(LED_OFF);
}
HAL_Delay(100); // Delay loop
}
}
5. Video Demo [kembali]
6. Kondisi [kembali]
Buatlah rangkaian seperti pada gambar percobaan 4 dengan kondisi ketika LDR mendeteksi cahaya terang, PIR mendeteksi ada gerakan orang lewat, maka LED akan mati selama ada gerakan dan kembali menyala.
7. Video Simulasi [kembali]
8. Download File [kembali]
Komentar
Posting Komentar