1. Prosedur [Kembali]

  • Pahami terlebih dahulu kondisi yang akan digunakan
  • Buka Wokwi
  • Persiapkan alat dan bahan
  • Buat rangkaian sesuai dengan kondisi dan modul 
  • Sesuaikan konfigurasi pin
  • Buat kode program untuk mengoperasikan rangkaian tersebut sesuai dengan kondisi 
  • Jalankan simulasi rangkaian.  
  • Proses selesai

2. Hardware dan Diagram Blok[Kembali]


STM32 NUCLEO-G474RE


Motor Servo


Buzzer


Resistor

Pushbutton

3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]


Prinsip kerja rangkaian ini dimulai saat sistem dinyalakan (mulai), kemudian mikrokontroler melakukan inisialisasi semua komponen, yaitu sensor LDR, push button (interrupt), dan motor servo. Setelah itu, sistem masuk ke proses pembacaan sensor LDR untuk mendeteksi intensitas cahaya di lingkungan.

Jika LDR mendeteksi kondisi gelap, maka mikrokontroler akan memberikan sinyal ke motor servo untuk bergerak ke posisi masuk (misalnya menutup pintu/penutup). Sebaliknya, jika LDR mendeteksi kondisi terang, maka servo akan bergerak ke posisi keluar (misalnya membuka pintu/penutup).

Selain itu, terdapat push button sebagai interrupt yang dapat mengubah kondisi servo kapan saja tanpa menunggu pembacaan LDR. Artinya, ketika tombol ditekan, sistem langsung merespons dengan menggerakkan servo (baik ke posisi masuk atau keluar sesuai logika yang diprogram), sehingga berfungsi sebagai kontrol manual.

Proses ini berlangsung terus-menerus selama sistem aktif, dengan mikrokontroler selalu membaca kondisi LDR dan memantau interrupt dari push button, hingga sistem dihentikan (selesai).


4. Flowchart dan Listing Program[Kembali]



Blok Diagram




Flowchart 


#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

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

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

    // BUTTON (PB1 - active low)
    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 - TIM3 CH1)
    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 SERVO =================
void MX_TIM3_Init(void)
{
    __HAL_RCC_TIM3_CLK_ENABLE();

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

    TIM_OC_InitTypeDef sConfigOC = {0};
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 1500; // posisi tengah
    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)
    {
        // Masuk (gelap)
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000);
    }
    else
    {
        // Keluar (terang)
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000);
    }
}

// ================= READ LDR =================
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 MODE =====
        uint8_t button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);

        if (last_button == 1 && button == 0)
        {
            manual_mode = !manual_mode;

            // Saat masuk manual, langsung toggle posisi
            if (manual_mode)
            {
                posisi_servo = !posisi_servo;
                set_servo(posisi_servo);
            }

            HAL_Delay(200);
        }

        last_button = button;

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

            if (ldr > LDR_THRESHOLD)
            {
                // Cahaya tinggi → keluar
                posisi_servo = 1;
            }
            else
            {
                // Cahaya rendah → masuk
                posisi_servo = 0;
            }

            set_servo(posisi_servo);
        }

        HAL_Delay(100);
    }
}

5. Video Demo[Kembali]


6. Kondisi[Kembali]

Buatlah rangkaian dengan kondisi ketika sensor cahaya (LDR) mendeteksi cahaya tinggi, maka jemuran berada di luar atap. Sebaliknya, jika cahaya rendah, jemuran berada di dalam atap untuk perlindungan dari hujan.

7. Video Simulasi[Kembali]


8. Download File[Kembali]

Download Rangkaian Simulasi [Klik Disini]

No comments:

Post a Comment

  BAHAN PRESENTASI UNTUK MATA KULIAH  ELEKTRONIKA 2024 Nama : Muhammad Fadhlurrahman Yuzary NIM : 2310952015 Elektronika A Dosen Pengampu ; ...