Laporan Akhir 2




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

7. Push Button
  • Diagram Blog

3. Rangkaian Simulasi dan Prinsip Kerja [kembali]


Rangkaian ini beroperasi sebagai sistem lampu otomatis cerdas yang mengutamakan efisiensi energi dengan menggabungkan sensor cahaya (LDR), sensor gerak (PIR), dan sakelar pengaman manual. Secara urutan logika, mikrokontroler pertama-tama mengecek status tombol (PB1); jika ditekan, sistem masuk ke mode darurat yang memaksa lampu mati total dan mengabaikan semua pembacaan sensor. Pada kondisi normal, sistem mengecek sensor LDR (PA0) terlebih dahulu; jika lingkungan terdeteksi siang/terang (nilai ADC < 2000), lampu dipastikan mati terlepas dari ada tidaknya orang. Namun, jika lingkungan terdeteksi malam/gelap (nilai ADC ≥ 2000), mikrokontroler baru mulai memantau sensor PIR (PA1), di mana lampu LED (PA6) hanya akan menyala penuh jika mendeteksi adanya gerakan manusia, dan mikrokontroler akan menunda pemadaman selama 5 detik sejak gerakan terakhir sebelum akhirnya mematikan lampu secara otomatis.

4. Flowchart dan Listing Program [kembali]

  • Flowchart



  • Listing Program
  1. main.h

#ifndef __MAIN_H
#define __MAIN_H

#include "stm32c0xx_hal.h"

/* ================= PIN DEFINITIONS ================= */

/* LDR (ADC) */
#define LDR_PORT   GPIOA
#define LDR_PIN    GPIO_PIN_0   // PA0

/* PIR SENSOR */
#define PIR_PORT   GPIOA
#define PIR_PIN    GPIO_PIN_1   // PA1

/* PUSH BUTTON (INTERRUPT) */
#define BUTTON_PORT GPIOB
#define BUTTON_PIN  GPIO_PIN_1  // PB1

/* LED PWM (TIM3 CH1) */
#define LED_PORT   GPIOA
#define LED_PIN    GPIO_PIN_6   // PA6

/* ================= FUNCTION PROTOTYPES ================= */

void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void MX_TIM3_Init(void);

#endif

2. main.c
#include "main.h"

/* ================= HANDLE ================= */
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;

/* ================= VARIABLE ================= */
volatile uint8_t emergency_mode = 0;
uint32_t last_motion_time = 0;

/* fallback button */
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

/* ===================================================== */
/* ================= SYSTEM 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 INIT ========================== */
/* ===================================================== */
void MX_GPIO_Init(void)
{
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* ===== PIR (INPUT) ===== */
    GPIO_InitStruct.Pin = PIR_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(PIR_PORT, &GPIO_InitStruct);

    /* ===== BUTTON (INTERRUPT FALLING) ===== */
    GPIO_InitStruct.Pin = BUTTON_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);

    /* ===== LED PWM (AF) ===== */
    GPIO_InitStruct.Pin = LED_PIN;
    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(LED_PORT, &GPIO_InitStruct);

    /* ===== INTERRUPT ENABLE ===== */
    HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
}

/* ===================================================== */
/* ================= ADC INIT =========================== */
/* ===================================================== */
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 INIT =========================== */
/* ===================================================== */
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 == BUTTON_PIN)
    {
        emergency_mode = !emergency_mode;
    }
}

/* ===================================================== */
/* ================= HELPER FUNCTION ==================== */
/* ===================================================== */
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 PROGRAM ======================= */
/* ===================================================== */
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 (ANTI ERROR INTERRUPT) ===== */
        uint8_t current_button = HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);

        if (last_button_state == 1 && current_button == 0)
        {
            emergency_mode = !emergency_mode;
            HAL_Delay(50); // debounce
        }
        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(PIR_PORT, PIR_PIN);

        /* ===== 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. Analisa [kembali]

  1. Analisa bagaimana perbedaan implementasi PWM antara STM32 serta dampaknya terhadap kontrol motor dan LED.! 
    PWM pada STM32 dihasilkan menggunakan timer internal untuk mengatur duty cycle dan frekuensi sinyal. Pada LED, PWM digunakan untuk mengatur kecerahan berdasarkan besar duty cycle, sedangkan pada motor DC digunakan untuk mengatur kecepatan putaran motor. Duty cycle besar menghasilkan LED lebih terang dan motor berputar lebih cepat. Motor biasanya memerlukan driver tambahan karena membutuhkan arus lebih besar dibanding LED.

  2. Analisa bagaimana cara pembacaan nilai sensor analog menggunakan ADC pada STM32! 
    ADC pada STM32 digunakan untuk mengubah sinyal analog dari sensor menjadi data digital. Prosesnya dilakukan dengan mengonfigurasi pin analog, menjalankan ADC menggunakan fungsi HAL, lalu membaca hasil konversi menggunakan HAL_ADC_GetValue(). Nilai ADC biasanya memiliki resolusi 12-bit dengan rentang 0–4095 yang mewakili tegangan 0–3.3V.

  3. Analisa bagaimana penggunaan interrupt eksternal dalam mendeteksi input dari sensor atau tombol pada STM32!
    Interrupt eksternal pada STM32 digunakan untuk mendeteksi perubahan input dari tombol atau sensor tanpa polling terus-menerus. Saat terjadi perubahan sinyal pada pin EXTI, mikrokontroler langsung menjalankan fungsi callback sehingga respon sistem menjadi lebih cepat dan penggunaan CPU lebih efisien. Interrupt banyak digunakan pada tombol, sensor PIR, dan limit switch.

  4. Analisa bagaimana cara kerja fungsi HAL_GetTick() pada STM32!
    Fungsi HAL_GetTick() pada STM32 digunakan untuk menghitung waktu dalam milidetik sejak sistem mulai berjalan dengan memanfaatkan timer SysTick. Fungsi ini sering digunakan untuk delay non-blocking, pengukuran waktu, dan pengaturan interval proses tanpa menghentikan program utama sehingga lebih efisien dibanding HAL_Delay().

  5. Analisa bagaimana perbedaan konfigurasi dan kontrol pin PWM serta pemanfaatan timer internal pada STM32 dalam menghasilkan sinyal PWM
    PWM pada STM32 dihasilkan menggunakan timer internal dengan konfigurasi prescaler, period, dan compare value untuk mengatur frekuensi serta duty cycle. Pin PWM harus diatur dalam mode alternate function sesuai channel timer yang digunakan. Pengaturan timer yang tepat menghasilkan sinyal PWM stabil untuk kebutuhan seperti kontrol LED dan motor.

  6. Bagaimana mengatur pergerakan motor servo pada stm 32?
    Motor servo pada STM32 dikendalikan menggunakan sinyal PWM dengan frekuensi sekitar 50 Hz. Posisi servo ditentukan oleh lebar pulsa PWM, misalnya 1 ms untuk 0°, 1.5 ms untuk 90°, dan 2 ms untuk 180°. Pergerakan servo diatur dengan mengubah nilai compare register (CCR) pada timer PWM.

7. Download File [kembali]

Komentar

Postingan populer dari blog ini

Tugas Besar