LAPORAN AKHIR 2




MODUL 2

LAPORAN AKHIR 2


1. Prosedur [kembali]

1. Persiapan Alat dan Bahan

  • STM32 Nucleo G474RE
  • LED + resistor
  • Sensor LDR
  • Sensor PIR
  • Push button
  • Breadboard & jumper

2. Perakitan Rangkaian

  • Hubungkan VCC (3.3V/5V) dan GND ke semua komponen
  • LDR → rangkaian pembagi tegangan → masuk ke pin ADC MCU
  • PIR sensor → pin input digital MCU
  • Push button → pin input (dengan pull-up)
  • LED → pin output MCU melalui resistor

3. Pemrograman

  • Konfigurasi:
    • ADC untuk membaca LDR (intensitas cahaya)
    • Input digital untuk PIR dan push button
    • Output untuk LED
  • Logika program:
    • Jika gelap (LDR rendah) dan ada gerakan (PIR aktif) → LED ON
    • Jika terang → LED OFF
    • Push button → sebagai kontrol manual (override ON/OFF)

4. Pengujian

  • Nyalakan sistem
  • Tutup LDR (simulasi malam) → LED siap aktif
  • Gerakkan objek di depan PIR → LED menyala
  • Tekan push button → cek fungsi kontrol manual


2. Hardware [kembali]

a) STM32 NUCLEO G474RE


    b) LED



    c) Resistor




    d) PIR Sensor




e) Diagram Blok


3. Rangkaian Simulasi dan Prinsip Kerja [kembali]




Prinsip Kerja:

Rangkaian ini bekerja sebagai sistem lampu jalan otomatis yang dikontrol oleh mikrokontroler STM32 berdasarkan kondisi cahaya dan gerakan. Sensor LDR digunakan untuk mendeteksi intensitas cahaya lingkungan; saat kondisi terang, nilai tegangan dari LDR menunjukkan siang hari sehingga lampu (LED) tetap mati. Sebaliknya, saat kondisi gelap (malam), mikrokontroler akan mengaktifkan sistem siaga. Pada kondisi ini, sensor PIR akan mendeteksi adanya gerakan; jika ada objek yang bergerak, maka mikrokontroler akan menyalakan LED sebagai lampu jalan. Jika tidak ada gerakan, lampu tetap mati meskipun kondisi gelap untuk menghemat energi. Selain itu, push button berfungsi sebagai kontrol manual (override), misalnya untuk menyalakan atau mematikan lampu secara langsung tanpa bergantung pada sensor. Dengan demikian, sistem ini bekerja secara otomatis dan efisien berdasarkan kombinasi input cahaya dan deteksi gerakan.


4. Flowchart dan Listing Program [kembali]



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 */
    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;
        }

        /* ===== BACA SENSOR ===== */
        uint16_t ldr = read_LDR();
        uint8_t pir  = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);

        /* ===== SIANG ===== */
        if (ldr < LDR_THRESHOLD)
        {
            set_LED(LED_OFF);
        }
        else
        {
            /* ===== MALAM ===== */
            if (pir == GPIO_PIN_SET)
            {
                last_motion_time = HAL_GetTick();
            }

            if (HAL_GetTick() - last_motion_time < MOTION_TIMEOUT)
            {
                set_LED(LED_FULL);
            }
            else
            {
                set_LED(LED_DIM);
            }
        }

        HAL_Delay(100);
    }
}


5. Video Demo [kembali]



6. Kondisi [kembali]

Program memiliki beberapa kondisi utama yang menentukan kerja sistem. Pertama, terdapat mode darurat (emergency_mode), di mana jika bernilai 1 maka sistem akan langsung mematikan LED (PWM = 0) tanpa memproses sensor, sedangkan jika 0 maka sistem berjalan normal. Mode ini dapat diubah melalui push button (interrupt maupun fallback polling). Selanjutnya, pada kondisi normal, sistem membaca nilai LDR untuk menentukan siang atau malam; jika nilai LDR lebih kecil dari batas (LDR_THRESHOLD), maka dianggap siang hari dan LED dimatikan. Jika nilai LDR lebih besar atau sama dengan batas, maka dianggap malam hari, sehingga sistem mulai mempertimbangkan sensor PIR. Jika PIR mendeteksi gerakan (HIGH), maka waktu terakhir gerakan akan disimpan. Selama selisih waktu sekarang dengan waktu gerakan terakhir masih kurang dari MOTION_TIMEOUT (5 detik), maka LED menyala terang (LED_FULL). Jika tidak ada gerakan dalam waktu tersebut, maka LED hanya menyala redup (LED_DIM). Dengan demikian, sistem bekerja berdasarkan kombinasi kondisi: mode darurat, intensitas cahaya (siang/malam), dan deteksi gerakan.


7. Video Simulasi [kembali]



8. Link Download [kembali]

Komentar

Postingan populer dari blog ini