Modul 2 Percobaan 2



Tugas Pendahuluan 2 Modul 2
(Percobaan 2 Kondisi 1)

1. Prosedur [Kembali]

1. Rangkai rangkaian di wokwi sesuai dengan kondisi percobaan.

2. Buat program untuk mikrokontroler STM32 NUCLEO-G474RE di software STM32 CubeIDE.

3. Salin program main.c dan main.h dari STM32CubeIDE ke wokwi.

4. Setelah program selesai di upload, jalankan simulasi rangkaian pada wokwi.

5. Selesai.

2. Hardware dan Diagram Blok [Kembali]

  • Hardware
1. Mikrokontroler STM32 NUCLEO-G474RE

2. LDR Sensor

3. Buzzer

4. Power Supply

5. Motor Servo

6. Push Button

7. Adaptor

8. Breadboard

  • Diagram Blok



3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

Rangkaian Simulasi Sebelum dirunning:



Rangkaian Simulasi Setelah dirunning:



Prinsip Kerja:

    Program ini bekerja sebagai sistem otomatis jemuran berbasis sensor cahaya (LDR) dan servo menggunakan mikrokontroler STM32. Prinsip kerjanya dimulai saat sistem dinyalakan, mikrokontroler menginisialisasi clock, GPIO, ADC, dan timer PWM. Sensor LDR yang terhubung ke pin analog (PA0) akan membaca intensitas cahaya lingkungan dan menghasilkan nilai digital melalui ADC dengan resolusi 12-bit. Nilai ini kemudian dibandingkan dengan nilai ambang batas (LDR_THRESHOLD = 2000) untuk menentukan kondisi terang atau gelap.

    Pada proses utama (loop), sistem secara terus-menerus membaca nilai LDR. Jika nilai LDR lebih kecil dari threshold (menandakan kondisi gelap), maka servo akan digerakkan ke posisi 1000 µs (jemuran masuk/tertutup). Sebaliknya, jika nilai LDR lebih besar dari threshold (menandakan kondisi terang), servo akan bergerak ke posisi 2000 µs (jemuran keluar/terbuka). Pergerakan servo dikontrol menggunakan sinyal PWM dari Timer 3 dengan periode 20 ms (50 Hz), yang sesuai dengan standar kontrol servo. Proses ini diulang setiap 100 ms sehingga sistem dapat merespons perubahan cahaya secara real-time.

4. Flowchart dan Listing Program [Kembali]

  • Flowchart




  • Listing Program
a. main.c
#include "main.h"

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

/* ================= VARIABEL ================= */
uint8_t manual_mode  = 0;
uint8_t posisi_servo = 0;
uint8_t last_button  = 1;

/* ================= DEFINE ================= */
#define LDR_THRESHOLD 2000

/* ================= PROTOTYPE ================= */
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)
{
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStruct = {0};

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

    /* PB1 - Button (Digital Input, Pull-Up) */
    GPIO_InitStruct.Pin  = GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* PA6 - Servo (PWM Output, 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);
}

/* ================= TIMER PWM ================= */
void MX_TIM3_Init(void)
{
    __HAL_RCC_TIM3_CLK_ENABLE();

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

    TIM_OC_InitTypeDef sConfigOC = {0};
    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 */
}

/* ================= BACA 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)
    {
        /* ---- Deteksi tombol (falling edge) ---- */
        uint8_t button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);

        if (last_button == 1 && button == 0)
        {
            manual_mode  = !manual_mode;
            posisi_servo = !posisi_servo;
            set_servo(posisi_servo);
            HAL_Delay(50);
        }

        last_button = button;

        /* ---- Mode otomatis (LDR) ---- */
        if (!manual_mode)
        {
            uint16_t ldr = read_LDR();
            posisi_servo  = (ldr >= LDR_THRESHOLD) ? 1 : 0; /* terang → keluar, gelap → masuk */
            set_servo(posisi_servo);
        }

        HAL_Delay(100);
    }
}
b. main.h

#ifndef __MAIN_H
#define __MAIN_H

#include "stm32c0xx_hal.h"

/* ================= PIN CONFIG ================= */

/* LDR (Analog Input) */
#define LDR_PIN     GPIO_PIN_0
#define LDR_PORT    GPIOA

/* Button (Digital Input) */
#define BUTTON_PIN  GPIO_PIN_1
#define BUTTON_PORT GPIOB

/* Servo (PWM Output) */
#define SERVO_PIN   GPIO_PIN_6
#define SERVO_PORT  GPIOA

/* ================= FUNCTION PROTOTYPE ================= */
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void MX_TIM3_Init(void);

#endif /* __MAIN_H */



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

6. Video Simulasi [Kembali]





7. Download File [Kembali]

Download File Rangkaian  [klik disini]

Download Video Simulasi  [klik disini]

Datasheet Mikrokontroler STM32 NUCLEO-G474RE  [klik disini]

Datasheet Sensor LDR  [klik disini]

Datasheet Servo  [klik disini]


Kembali ke Halaman Atas



Komentar

Postingan populer dari blog ini

TUGAS BESAR

Astable Multivibrator D kecil dari 50%

MODUL 1