Tugas Pendahuluan 2



MODUL 2 PERCOBAAN 2


1. Prosedur [Kembali]

Untuk menjalankan dan memvalidasi simulasi rangkaian pada platform seperti Wokwi, prosedur berikut harus dilakukan secara berurutan:

  1. Menyiapkan platform simulasi menggunakan Wokwi
  2. Menambahkan komponen:
    • STM32 Nucleo C031C6
    • Sensor LDR
    • Motor Servo
    • Push Button (opsional)
  3. Menghubungkan rangkaian:
    • LDR → pin analog PA0
    • Servo → pin PWM PA6
    • Button → pin digital PB1 (opsional)
  4. Menuliskan program pada file main.c:
    • Inisialisasi sistem (clock, GPIO, ADC, PWM)
    • Membaca nilai ADC dari LDR
    • Membandingkan nilai ADC dengan threshold
    • Mengatur posisi servo sesuai kondisi cahaya
  5. Meng-upload / menjalankan program pada simulasi
  6. Mengatur nilai lux pada sensor LDR di Wokwi
  7. Mengamati respon servo:
    • Gelap → servo masuk
    • Terang → servo keluar
  8. Mengulangi pengujian untuk berbagai nilai lux
  9. Menganalisis apakah sistem bekerja sesuai perintah soal


2. Hardware dan Diagram Blok [Kembali]

 

Instrumentasi / Alat

    1. Breadboard— Papan prototyping untuk merangkai komponen tanpa solder.
  1. Adaptor — Sumber daya eksternal untuk rangkaian.

Komponen / Bahan

  1. STM32 NUCLEO-G474RE — Development board berbasis ARM Cortex-M4F dengan 51 GPIO pin dan clock speed hingga 170 MHz, dilengkapi ST-LINK onboard.

    Spesifikasi:

    • Microcontroller : STM32G474RE (ARM Cortex-M4F)
    • Operating Voltage : 3.3V
    • Input Voltage (recommended) : 5V via USB atau 7–12V via VIN
    • Input Voltage (limit) : 4.5V – 15V
    • Digital I/O Pins : ±51 GPIO
    • PWM Digital I/O Pins : Hingga 24 channel (termasuk HRTIM)
    • Analog Input Pins : Hingga 24 channel ADC (12-bit / 16-bit dengan oversampling)
    • DC Current per I/O Pin : Maks. 20 mA (disarankan ≤ 8 mA)
    • DC Current for 3.3V Pin : Hingga ±500 mA
    • Flash Memory : 512 KB
    • SRAM : 128 KB (termasuk CCM RAM)
    • Clock Speed : Hingga 170 MHz
    • Onboard Debugger : ST-LINK V3
    • Komunikasi : USART, SPI, I²C, USB, CAN FD
  2. Sensor LDR



    Spesifikasi Sensor Cahaya LDR

     

    1. Supply : 3.3 V – 5 V (arduino available)

    2. Output Type: Digital Output (0 and 1) 

    3. Inverse output

    4. Include IC LM393 voltage comparator

    5. Sensitivitasnya dapat diatur 

    6. Dimensi PCB size: 3.2 cm x 1.4 cm

  3. Motor Servo



  4. Push Button


    Spesifikasi Teknis Push Button Switch

    Karakteristik Listrik

    • Rating Tegangan (Voltage): Menunjukkan batas maksimum tegangan yang bisa ditangani, misalnya 12V DC atau 250V AC.

    • Rating Arus (Current): Menunjukkan seberapa besar arus yang bisa dialirkan tanpa merusak kontak, biasanya berkisar antara 1A hingga 5A.

    • Tipe Kontak: Bisa NO (Normally Open), NC (Normally Closed), atau kombinasi keduanya (SPDT / Single Pole Double Throw).


Diagram Blok





3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]



Prinsip kerja rangkaian jemuran otomatis ini adalah memanfaatkan sensor cahaya LDR sebagai pendeteksi kondisi terang dan gelap pada lingkungan sekitar. Sensor LDR dihubungkan ke pin analog PA0 pada board NUCLEO C031C6, sehingga perubahan intensitas cahaya akan dibaca oleh ADC mikrokontroler dalam bentuk nilai digital. Nilai ADC dari LDR tidak langsung digunakan satu kali pembacaan, tetapi dirata-ratakan sebanyak 10 sampel agar hasil pembacaan lebih stabil dan tidak mudah berubah karena gangguan kecil. Setelah sistem aktif, mikrokontroler menjalankan pembacaan sensor secara terus-menerus, kemudian membandingkan nilai LDR dengan batas yang sudah ditentukan pada program.

Pada coding, terdapat dua batas pembanding, yaitu BATAS_GELAP_MASUK = 2520 dan BATAS_GELAP_KELUAR = 2480. Jika nilai LDR lebih besar dari 2520, maka kondisi dianggap gelap, sehingga STM32 memberikan sinyal PWM ke servo agar bergerak ke posisi masuk. Kondisi ini menggambarkan jemuran ditarik masuk ke dalam atap untuk menghindari hujan atau kondisi malam hari. Sebaliknya, jika nilai LDR lebih kecil dari 2480, maka kondisi dianggap terang, sehingga servo bergerak ke posisi keluar. Kondisi ini menggambarkan jemuran berada di luar atap agar pakaian dapat terkena cahaya matahari.

Servo dikendalikan melalui sinyal PWM dari TIM3 Channel 1 pada pin PA6. Pada program, nilai SERVO_MASUK = 1000 digunakan untuk mengatur posisi servo masuk, sedangkan SERVO_KELUAR = 2000 digunakan untuk mengatur posisi servo keluar. Sistem juga menggunakan konsep hysteresis, yaitu penggunaan dua batas nilai yang berbeda agar servo tidak bergerak bolak-balik secara cepat ketika nilai cahaya berada di sekitar ambang batas. Dengan demikian, rangkaian dapat bekerja lebih stabil: saat terang jemuran keluar, sedangkan saat gelap jemuran masuk secara otomatis.





Listing Program :

#include "main.h"

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

/* ===================== KONSTANTA ===================== */
#define BATAS_GELAP_MASUK    2520
#define BATAS_GELAP_KELUAR   2480
#define JUMLAH_SAMPLE         10

#define SERVO_MASUK          1000
#define SERVO_KELUAR         2000

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

uint16_t read_LDR(void);
uint16_t read_LDR_average(void);
void set_servo_us(uint16_t pulse_us);

/* ===================== MAIN ===================== */
int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_ADC1_Init();
    MX_TIM3_Init();

    /* Start PWM servo */
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

    /* Posisi awal = keluar */
    set_servo_us(SERVO_KELUAR);

    uint8_t servo_state = 0; // 0=keluar, 1=masuk

    while(1)
    {
        uint16_t nilai_ldr = read_LDR_average();

        /* Hysteresis */
        if(nilai_ldr > BATAS_GELAP_MASUK && servo_state == 0)
        {
            set_servo_us(SERVO_MASUK);
            servo_state = 1;
        }
        else if(nilai_ldr < BATAS_GELAP_KELUAR && servo_state == 1)
        {
            set_servo_us(SERVO_KELUAR);
            servo_state = 0;
        }

        HAL_Delay(200);
    }
}

/* ===================== BACA ADC ===================== */
uint16_t read_LDR(void)
{
    uint16_t adc_value = 0;
    HAL_ADC_Start(&hadc1);
    if(HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
        adc_value = HAL_ADC_GetValue(&hadc1);
    HAL_ADC_Stop(&hadc1);
    return adc_value;
}

/* ===================== FILTER RATA-RATA ===================== */
uint16_t read_LDR_average(void)
{
    uint32_t total = 0;
    for(uint8_t i=0;i<JUMLAH_SAMPLE;i++)
    {
        total += read_LDR();
        HAL_Delay(2);
    }
    return (uint16_t)(total / JUMLAH_SAMPLE);
}

/* ===================== SERVO ===================== */
void set_servo_us(uint16_t pulse_us)
{
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pulse_us);
}

/* ===================== SYSTEM CLOCK ===================== */
void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    // HSI ON, no PLL untuk STM32C0
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) Error_Handler();

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) Error_Handler();
}

/* ===================== GPIO ===================== */
void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOA_CLK_ENABLE();

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

    // PA6 = Servo PWM
    GPIO_InitStruct.Pin = GPIO_PIN_6;
    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(GPIOA, &GPIO_InitStruct);
}

/* ===================== ADC ===================== */
void MX_ADC1_Init(void)
{
    ADC_ChannelConfTypeDef sConfig = {0};

    __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;
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    if(HAL_ADC_Init(&hadc1) != HAL_OK) Error_Handler();

    sConfig.Channel = ADC_CHANNEL_0;
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
    if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) Error_Handler();
}

/* ===================== TIMER PWM ===================== */
void MX_TIM3_Init(void)
{
    TIM_OC_InitTypeDef sConfigOC = {0};

    __HAL_RCC_TIM3_CLK_ENABLE();

    htim3.Instance = TIM3;
    htim3.Init.Prescaler = 48-1; // 1 MHz timer
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 20000-1;  // 20 ms (50 Hz)
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    if(HAL_TIM_PWM_Init(&htim3) != HAL_OK) Error_Handler();

    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = SERVO_KELUAR;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    if(HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) Error_Handler();
}

/* ===================== ERROR HANDLER ===================== */
void Error_Handler(void)
{
    __disable_irq();
    while(1) {}
}

5. Video Demo [Kembali]



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]



8. Download File [Kembali]

Download library STM32F103C8 klik disini

Download rangkaian STM32 Nucleo C031C6 klik disini

Datasheet STM32 NUCLEO-G474RE disini

Datasheet Heartbeat Sensor disini

Datasheet Resistor disini


Komentar

Postingan Populer