P4 K4



1. Prosedur [Kembali]

1. Buka web WOKWI.COM dan cari STM 32 NUCLEO C031C6

2. Rangkai komponen sesuai dengan gambar rangkaian di modul

3. Klik pada Library Manager untuk membuat file baru yang bernama main.h dan main.c

4. Masukan program yang telah di buat sesuai kondisi pada kedua file tersebut

5. Simulasikan

2. Hardware [Kembali]

  • Hardware

1. STM32 NUCLEO-G474RE



2. PIR Sensor



3. Infrared Sensor


4. Resistor


5. Buzzer



6. LED 

7. Push Button
  • Diagram Blog

3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]




  • Prinsip Kerja Sistem Lampu Jalan Otomatis 

Percobaan 4 membahas tentang pembuatan Sistem Lampu Jalan Otomatis menggunakan papan pengembangan STM32 Nucleo G474RE. Sistem ini mengintegrasikan sensor cahaya (LDR) dan sensor gerak (PIR) untuk mengoptimalkan penggunaan energi.

Berikut adalah penjelasan prinsip kerjanya:

1. Deteksi Kondisi Lingkungan (LDR & PIR)

  • Sensor LDR (Cahaya): Mikrokontroler membaca intensitas cahaya sekitar melalui pin ADC. LDR digunakan untuk menentukan fase waktu, yaitu siang atau malam hari.

  • Sensor PIR (Gerak): Sensor ini mendeteksi adanya pergerakan manusia atau objek di area lampu jalan. Data dari sensor ini hanya akan diproses secara aktif oleh sistem ketika kondisi lingkungan terdeteksi sebagai malam hari.

2. Logika Operasional dan Kontrol Output (PWM)

Sistem menggunakan teknik PWM (Pulse Width Modulation) untuk mengatur tingkat kecerahan LED secara bertahap:

  • Kondisi Siang Hari: Jika LDR mendeteksi cahaya di atas ambang batas (threshold), maka sistem menganggap hari masih siang dan lampu akan mati sepenuhnya (0% PWM).

  • Kondisi Malam Hari (Tanpa Gerakan): Jika hari sudah malam namun sensor PIR tidak mendeteksi adanya gerakan, lampu akan menyala dalam mode hemat energi atau redup (PWM rendah).

  • Kondisi Malam Hari (Ada Gerakan): Saat sensor PIR mendeteksi gerakan, sistem akan memicu lampu untuk menyala terang (PWM tinggi/penuh). Lampu akan tetap terang selama durasi tertentu (misalnya 5 detik) sebelum kembali redup jika tidak ada gerakan lebih lanjut.

3. Mode Darurat (Interrupt)

  • Sistem ini dilengkapi dengan fitur Interrupt yang dihubungkan ke sebuah Push Button pada pin PB1.

  • Interupsi ini berfungsi sebagai Emergency Mode. Ketika tombol ditekan, mikrokontroler akan segera menghentikan logika otomatis sensor dan mematikan lampu jalan secara paksa untuk kebutuhan pemeliharaan atau situasi darurat tertentu.

4. Flowchart [Kembali]

  • Flowchart



  • Listing Program
main.h:

#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]

M1 P1 K4: 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]

Rangkaian Simulasi [Klik]

Video Simulasi [Klik]


Kembali ke Halaman Atas



Komentar

Postingan populer dari blog ini

KONTROL KOLAM IKAN