Laporan Akhir 1

 


1. Prosedur [kembali]

    1. Menyiapkan alat dan bahan berupa STM32 Nucleo G474RE, sensor LDR, push button, motor
        servo, breadboard, adaptor, dan kabel jumper.
    2. Menghubungkan sensor LDR ke pin PA0, push button ke pin PB1, dan motor servo ke pin PA6
        pada STM32, kemudian menghubungkan seluruh VCC dan GND komponen ke sumber tegangan.
    3. Membuat program konfigurasi GPIO, ADC, dan PWM pada STM32 menggunakan library HAL.
    4. Mengatur timer TIM3 untuk menghasilkan sinyal PWM 50 Hz agar motor servo dapat bergerak
        dengan baik.
    5. Mengunggah program ke STM32 Nucleo G474RE dan memastikan sistem berjalan tanpa error.
    6. Menguji sensor LDR dengan memberikan kondisi terang dan gelap untuk melihat perubahan posisi
        servo secara otomatis.
    7. Menguji push button untuk memastikan sistem dapat berpindah antara mode manual dan otomatis.
    8. Mengamati pergerakan servo ketika nilai cahaya berubah, dimana servo bergerak masuk saat gelap
        dan keluar saat terang.


2. Hardware dan Diagram Blok [kembali]

    A. Hardware
    1. STM32 NUCLEO-G474RE        

    2. LDR Sensor

    
    3. Push Button 
    4. Motor Servo

    B. Diagram Blok


3. Rangkaian Simulasi dan Prinsip Kerja [kembali]

    Prinsip Kerja:
    Sistem jemuran otomatis bekerja dengan memanfaatkan sensor LDR sebagai pendeteksi intensitas
    cahaya, ADC pada STM32 untuk membaca sinyal analog, serta PWM untuk mengontrol motor servo.
    Sensor LDR akan menghasilkan nilai resistansi yang berubah sesuai kondisi cahaya lingkungan. Nilai
    analog dari LDR kemudian dibaca oleh ADC STM32 dan dibandingkan dengan nilai threshold yang
    telah ditentukan.

    Ketika kondisi terang terdeteksi, STM32 memberikan sinyal PWM ke motor servo sehingga jemuran
    bergerak keluar. Sebaliknya, saat kondisi gelap atau mendung, servo akan bergerak masuk ke dalam
    atap. Selain mode otomatis, sistem juga dilengkapi push button untuk mengubah mode menjadi
    manual menggunakan input digital. PWM dari timer TIM3 digunakan untuk mengatur posisi sudut
    servo dengan mengubah lebar pulsa sinyal.

4. Flowchart dan Listing Program [kembali]

    A. Flowchart

    B. Listing Program
    main.c
    #include "main.h"

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

    // ========================= VARIABLE =========================
    uint8_t manual_mode = 0;
    uint8_t posisi_servo = 0;
    uint8_t last_button = 1;

    // ========================= THRESHOLD ========================
    #define LDR_THRESHOLD 2000

    // Prototipe Fungsi Internal
    void SystemClock_Config(void);
    void MX_GPIO_Init(void);
    void MX_ADC1_Init(void);
    void MX_TIM3_Init(void);
    void set_servo(uint8_t state);
    uint16_t read_LDR(void);

    // ========================== 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) {
        GPIO_InitTypeDef GPIO_InitStruct = {0};

        __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();

        // LDR PA0
        GPIO_InitStruct.Pin = GPIO_PIN_0;
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        // BUTTON PB1
        GPIO_InitStruct.Pin = GPIO_PIN_1;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

        // SERVO PA6
        GPIO_InitStruct.Pin = GPIO_PIN_6;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    }

    // ============================ 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;
        HAL_ADC_Init(&hadc1);
    }

    // ====================== PWM (FIX SERVO) =====================
    void MX_TIM3_Init(void) {
        TIM_OC_InitTypeDef sConfigOC = {0};

        __HAL_RCC_TIM3_CLK_ENABLE();

        htim3.Instance = TIM3;
        // FIX: 1us tick (asumsi 48MHz clock)
        htim3.Init.Prescaler = 48 - 1;
        htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
        htim3.Init.Period = 20000 - 1; // 20ms = 50Hz (servo standard)
        HAL_TIM_PWM_Init(&htim3);

        sConfigOC.OCMode = TIM_OCMODE_PWM1;
        sConfigOC.Pulse = 1500; // posisi tengah awal
        sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
        HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
    }

    // ======================= SERVO CONTROL ======================
    void set_servo(uint8_t state) {
        if (state == 0) {
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000); // masuk atap
        } else {
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000); // keluar atap
        }
    }

    // ========================= ADC READ =========================
    uint16_t read_LDR(void) {
        ADC_ChannelConfTypeDef sConfig = {0};

        sConfig.Channel = ADC_CHANNEL_0;
        sConfig.Rank = ADC_REGULAR_RANK_1;
        HAL_ADC_ConfigChannel(&hadc1, &sConfig);

        HAL_ADC_Start(&hadc1);
        HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
        return HAL_ADC_GetValue(&hadc1);
    }

    // =========================== 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) {
            // ===== BUTTON TOGGLE =====
            uint8_t button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);

            if (last_button == 1 && button == 0) { // Logika Falling Edge
                manual_mode = !manual_mode;
                posisi_servo = !posisi_servo;
                set_servo(posisi_servo);
                HAL_Delay(50); // Debounce sederhana
            }
            last_button = button;

            // ===== MODE OTOMATIS =====
            if (!manual_mode) {
                uint16_t ldr = read_LDR();

                if (ldr < LDR_THRESHOLD) {
                    posisi_servo = 0; // mendung -> masuk
                } else {
                    posisi_servo = 1; // terang -> keluar
                }
                set_servo(posisi_servo);
            }

            HAL_Delay(100);
        }
    }

    main.h
    #ifndef __MAIN_H 
    #define __MAIN_H 

    #include "stm32c0xx_hal.h" 
    // PIN 
    #define LDR_PIN GPIO_PIN_0 
    #define LDR_PORT GPIOA 

    #define BUTTON_PIN GPIO_PIN_1 
    #define BUTTON_PORT GPIOB 
    
    #define SERVO_PIN GPIO_PIN_6 
    #define SERVO_PORT GPIOA 

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

    #endif

5. Video Demo [kembali]



6. Analisa [kembali]



7. Download File [kembali]

  • Download Rangkaian Tugas Pendahulu disini
  • Download Listing Program disini
  • Download Datasheet STM32F103C8 disini
  • Download Datasheet PIR Sensor disini
  • Download Dastasheet Touch Sensor disini
    

[menuju awal]




Komentar

Postingan populer dari blog ini