Laporan Akhir 2 M2

  [KEMBALI KE MENU SEBELUMNYA]


1. Prosedur [kembali]

1. Persiapan Komponen dan Workspace

  1. Buka platform Wokwi dan buat proyek baru menggunakan board STM32F103C8. Tambahkan komponen pendukung berikut:

    • Sensor LDR sebagai pendeteksi intensitas cahaya matahari.

    • Motor Servo sebagai aktuator penggerak mekanisme jemuran.

    • Push Button untuk berpindah antara mode otomatis dan manual.

    • Resistor untuk melengkapi rangkaian pembagi tegangan pada sensor.

    2. Perakitan Rangkaian (Wiring)

    Susun koneksi antar komponen dengan ketentuan sebagai berikut:

    • LDR: Hubungkan ke pin analog PA0 menggunakan konfigurasi pembagi tegangan bersama resistor.

    • Servo: Hubungkan pin sinyal ke pin PWM PA6 (TIM3).

    • Push Button: Sambungkan ke pin PB1 dengan konfigurasi pull-up internal atau eksternal.

    • Pastikan seluruh jalur VCC (3.3V/5V) dan GND terintegrasi dengan benar agar sirkuit mendapat daya.

    3. Pemrograman dan Pembacaan Data

    Tuliskan kode program pada editor untuk membaca nilai analog dari LDR melalui fitur ADC. Nilai ini akan dikonversi untuk merepresentasikan kondisi lingkungan (gelap atau terang). Selain itu, buat fungsi interupsi atau pembacaan digital pada push button untuk mendeteksi pergantian mode sistem.

    4. Logika Kontrol Jemuran

    Implementasikan logika kontrol berikut ke dalam program:

    • Mode Otomatis: Sistem bekerja berdasarkan input cahaya:

      • Kondisi Terang: Servo bergerak ke posisi keluar (jemuran berada di luar atap untuk penjemuran).

      • Kondisi Gelap: Servo bergerak ke posisi masuk (jemuran ditarik ke bawah atap untuk perlindungan).

    • Mode Manual: Posisi servo dikunci berdasarkan pilihan pengguna (Mode 1: Masuk, Mode 2: Setengah terbuka, Mode 3: Keluar penuh), mengabaikan input sensor.

    5. Simulasi dan Pengujian

    Jalankan simulasi dengan menekan tombol Start dan lakukan verifikasi melalui langkah berikut:

    • Geser parameter intensitas pada LDR untuk mensimulasikan perubahan cuaca dari terang ke gelap.

    • Tekan push button untuk memastikan sistem dapat berpindah dari kendali sensor ke kendali manual.

    • Hasil Akhir: Pada mode otomatis, servo harus responsif terhadap cahaya; sedangkan pada mode manual, posisi jemuran tetap statis sesuai input terakhir meskipun kondisi cahaya berubah-ubah.

2. Hardware dan Diagram Blok [kembali]

    1. STM32 Nucleo G474RE


    2. LDR Sensor

                                                                  


    3. Push Button 

                                                            


    4. Motor Servo                                           


    5. Breadboard


    6. Adaptor
                       

        7. Diagram Blok


3. Rangkaian Simulasi dan Prinsip Kerja [kembali]





Rangkaian jemuran otomatis ini bekerja menggunakan sensor cahaya LDR sebagai pendeteksi kondisi terang atau gelap lingkungan, mikrokontroler Nucleo STM32 sebagai pengolah data, dan motor servo sebagai penggerak jemuran. Sensor LDR akan menghasilkan perubahan nilai tegangan sesuai intensitas cahaya yang diterima. Saat lingkungan terang, resistansi LDR menurun sehingga mikrokontroler membaca kondisi tersebut sebagai siang atau cuaca cerah. 

Kemudian STM32 mengirimkan sinyal PWM ke motor servo agar bergerak ke posisi keluar, sehingga jemuran berada di luar atap untuk mendapatkan sinar matahari. Sebaliknya, ketika lingkungan gelap atau intensitas cahaya menurun yang menandakan mendung atau hujan, nilai resistansi LDR meningkat dan dibaca oleh mikrokontroler sebagai kondisi gelap. STM32 lalu mengubah posisi servo ke arah masuk sehingga jemuran berpindah ke dalam atap untuk melindungi pakaian dari hujan. Push button pada rangkaian dapat digunakan sebagai kontrol tambahan seperti reset atau mode manual sistem.

4. Flowchart dan Listing Program [kembali]


Flowchart






Listing Program


main.h
#ifndef __MAIN_H
#define __MAIN_H

#include "stm32c0xx_hal.h"

// PIN KONFIGURASI
#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

// DEFINISI POSISI SERVO (Nilai Pulse PWM)
#define SERVO_MASUK     1000  // Posisi di dalam atap
#define SERVO_SETENGAH  1500  // Posisi setengah terbuka
#define SERVO_KELUAR    2000  // Posisi di luar atap

// DEFINISI MODE SISTEM
#define MODE_AUTO       0
#define MODE_MANUAL_IN  1
#define MODE_MANUAL_MID 2
#define MODE_MANUAL_OUT 3

// THRESHOLD LDR
#define LDR_GELAP       1500  
#define LDR_TERANG      2800  

// PROTOTYPE FUNCTION
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void MX_TIM3_Init(void);
void set_servo(uint16_t pulse);
uint16_t read_LDR(void);

#endif

main.c
#include "main.h"

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

// ================= VARIABLE =================
uint8_t system_mode = MODE_AUTO;
uint8_t last_button = 1;

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

    // ================= LDR PA0 =================
    GPIO_InitStruct.Pin = LDR_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

    HAL_GPIO_Init(LDR_PORT, &GPIO_InitStruct);

    // ================= BUTTON PB1 =================
    GPIO_InitStruct.Pin = BUTTON_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;

    HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);

    // ================= SERVO PA6 (TIM3 CH1) =================
    GPIO_InitStruct.Pin = SERVO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;

    HAL_GPIO_Init(SERVO_PORT, &GPIO_InitStruct);
}

// ================= 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;

    HAL_ADC_Init(&hadc1);
}

// ================= PWM INIT =================
void MX_TIM3_Init(void)
{
    __HAL_RCC_TIM3_CLK_ENABLE();

    htim3.Instance = TIM3;

    htim3.Init.Prescaler = 48 - 1;
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 20000 - 1;

    HAL_TIM_PWM_Init(&htim3);

    TIM_OC_InitTypeDef sConfigOC = {0};

    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = SERVO_MASUK;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

    HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}

// ================= SERVO CONTROL =================
void set_servo(uint16_t pulse)
{
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pulse);
}

// ================= 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, 10);

    return HAL_ADC_GetValue(&hadc1);
}

// ================= 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)
    {
        // ================= CEK TOMBOL MODE =================
        uint8_t current_button = HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);

        if (last_button == 1 && current_button == 0)
        {
            system_mode = (system_mode + 1) % 4;

            HAL_Delay(200);
        }

        last_button = current_button;

        // ================= EKSEKUSI LOGIKA =================
        switch (system_mode)
        {
            case MODE_AUTO:
            {
                uint16_t ldr_val = read_LDR();

                // ================= KONDISI GELAP =================
                if (ldr_val < LDR_GELAP)
                {
                    // Jemuran masuk
                    set_servo(SERVO_MASUK);
                }

                // ================= KONDISI TERANG =================
                else if (ldr_val >= LDR_TERANG)
                {
                    // Jemuran keluar
                    set_servo(SERVO_KELUAR);
                }

                // Jika nilai di antara gelap dan terang,
                // servo tetap pada posisi terakhir
            }
            break;

            // ================= MODE MANUAL MASUK =================
            case MODE_MANUAL_IN:
                set_servo(SERVO_MASUK);
                break;

            // ================= MODE MANUAL TENGAH =================
            case MODE_MANUAL_MID:
                set_servo(SERVO_SETENGAH);
                break;

            // ================= MODE MANUAL KELUAR =================
            case MODE_MANUAL_OUT:
                set_servo(SERVO_KELUAR);
                break;
        }

        HAL_Delay(50);
    }
}


5. Video Demo [kembali]

Percobaan 2



6. Kondisi [kembali]

Percobaan 2 Kondisi 1
Buatlah rangkaian dengan kondisi ketika sensor cahaya (LDR) mendeteksi lingkungan terang, maka jemuran akan berada di luar atap (servo pada posisi keluar). Sebaliknya, ketika lingkungan gelap, jemuran akan masuk ke dalam atap (servo pada posisi masuk) untuk menghindari hujan.

7. Video Simulasi [kembali]

Percobaan 2 Kondisi 1



ANALISA DAN PEMBAHASAN








8. Download File [kembali]








Comments

Popular posts from this blog

Mikroprosesor dan Mikrokontroler

UTS