M2 Tugas Pendahuluan 1

  

 Tugas Pendahuluan 1



 Percobaan 2 Kontrol Jemuran Otomatis

a. 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
    • Sedang → servo setengah
    • Terang → servo keluar
  8. Mengulangi pengujian untuk berbagai nilai lux
  9. Menganalisis apakah sistem bekerja sesuai perintah soal

b. Hardware dan Diagram Blok [Kembali]

A. Hardware


Rangkaian ini terdiri dari beberapa komponen esensial yang saling terintegrasi:
  • STM32 Nucleo C031C6
    • Berfungsi sebagai mikrokontroler utama
    • Mengolah data dari sensor dan mengendalikan output
  • Sensor LDR (Light Dependent Resistor)
    • Mendeteksi intensitas cahaya lingkungan
    • Mengubah cahaya menjadi tegangan analog
  • Motor Servo
    • Berfungsi sebagai aktuator
    • Menggerakkan posisi jemuran (masuk / setengah / keluar)
  • Push Button (opsional)
    • Digunakan untuk kontrol manual (jika diperlukan)
  • Sumber Tegangan (VCC & GND)
    • Menyediakan daya untuk seluruh rangkaian

B. Diagram Blok


c. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

  • Rangkaian Simulasi


  • Prinsip Kerja

Sistem jemuran otomatis ini bekerja menggunakan sensor cahaya (LDR), mikrokontroler STM32, dan motor servo. Sensor LDR membaca intensitas cahaya kemudian mengubahnya menjadi nilai ADC yang dibaca STM32 melalui pin PA0. Pada program, nilai ADC dibagi menjadi tiga kondisi, yaitu nilai di atas 2800 dianggap cahaya sangat rendah atau gelap, nilai antara 1500–2800 dianggap cahaya sedang, dan nilai di bawah 1500 dianggap cahaya terang. Jika nilai ADC > 2800, STM32 akan menggerakkan servo ke posisi masuk menggunakan pulsa PWM sebesar 1000 µs sehingga jemuran masuk ke dalam atap. Jika nilai ADC berada di antara 1500–2800, servo bergerak ke posisi tengah dengan PWM 1500 µs sehingga jemuran berada pada posisi setengah terbuka. Sedangkan jika nilai ADC < 1500, servo bergerak ke posisi keluar dengan PWM 2000 µs sehingga jemuran keluar dari atap untuk mendapatkan cahaya matahari maksimal.

Selain bekerja otomatis berdasarkan sensor cahaya, sistem juga dilengkapi push button sebagai kontrol manual. Tombol menggunakan sistem pull-up, sehingga saat tidak ditekan bernilai HIGH dan saat ditekan bernilai LOW. Ketika tombol ditekan, STM32 langsung memerintahkan servo menuju posisi masuk (1000 µs) tanpa memperhatikan kondisi cahaya dari LDR. Setelah tombol dilepas, sistem kembali bekerja otomatis mengikuti pembacaan sensor cahaya. Servo dikendalikan menggunakan sinyal PWM dari STM32 melalui pin PA6 (TIM3 Channel 1) dengan frekuensi 50 Hz sehingga posisi jemuran dapat bergerak secara stabil dan presisi sesuai kondisi cahaya yang terdeteksi.


d. Flowchart dan Listing Program [Kembali]

  • Flowchart

  • Listing Program

Program Main C
#include "main.h"

/* HANDLE */
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;

/* ============================================================
   BATAS ADC LDR UNTUK WOKWI
   ------------------------------------------------------------
   Pada LDR Wokwi:
   - Cahaya sangat rendah / gelap = ADC tinggi
   - Cahaya terang                = ADC rendah

   Jika nilai ADC:
   > 2800          = gelap
   1500 - 2800     = cahaya sedang
   < 1500          = terang
   ============================================================ */
#define BATAS_SEDANG   1500
#define BATAS_GELAP    2800
#define JUMLAH_SAMPLE  10

/* POSISI SERVO */
#define SERVO_MASUK    1000   // Jemuran masuk ke dalam atap
#define SERVO_TENGAH   1500   // Jemuran setengah terbuka
#define SERVO_KELUAR   2000   // Jemuran keluar atap

/* DEKLARASI FUNGSI */
uint16_t read_LDR(void);
uint16_t read_LDR_average(void);
void set_servo_us(uint16_t pulse_us);

/* ============================================================
   PROGRAM UTAMA
   ============================================================ */
int main(void)
{
    HAL_Init();

    SystemClock_Config();
    MX_GPIO_Init();
    MX_ADC1_Init();
    MX_TIM3_Init();

    /* Servo menggunakan PA6 / TIM3 Channel 1 */
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

    /* Posisi awal jemuran setengah terbuka */
    set_servo_us(SERVO_TENGAH);

    while (1)
    {
        /* ====================================================
           BACA PUSH BUTTON
           ----------------------------------------------------
           Tombol menggunakan pull-up:
           - Tidak ditekan = HIGH / 1
           - Ditekan       = LOW / 0

           Jika tombol ditekan, jemuran langsung masuk.
           Jika tombol dilepas, jemuran kembali otomatis
           berdasarkan sensor LDR.
           ==================================================== */
        uint8_t button = HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);

        if (button == GPIO_PIN_RESET)
        {
            /*
              Push button ditekan.
              Jemuran langsung masuk ke dalam atap.
            */
            set_servo_us(SERVO_MASUK);
        }
        else
        {
            /*
              Push button tidak ditekan.
              Sistem otomatis membaca sensor LDR.
            */
            uint16_t nilai_ldr = read_LDR_average();

            if (nilai_ldr > BATAS_GELAP)
            {
                /*
                  Cahaya sangat rendah / gelap.
                  Pada Wokwi, gelap menghasilkan ADC tinggi.
                  Maka jemuran masuk ke dalam atap.
                */
                set_servo_us(SERVO_MASUK);
            }
            else if (nilai_ldr >= BATAS_SEDANG && nilai_ldr <= BATAS_GELAP)
            {
                /*
                  Cahaya sedang.
                  Jemuran berada pada posisi setengah terbuka.
                */
                set_servo_us(SERVO_TENGAH);
            }
            else
            {
                /*
                  Cahaya terang.
                  Pada Wokwi, terang menghasilkan ADC rendah.
                  Maka jemuran keluar dari atap.
                */
                set_servo_us(SERVO_KELUAR);
            }
        }

        HAL_Delay(100);
    }
}

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

    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        Error_Handler();
    }

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |
                                  RCC_CLOCKTYPE_SYSCLK;

    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();
    }
}

/* ============================================================
   KONFIGURASI GPIO
   ------------------------------------------------------------
   PA0 = LDR
   PB1 = Push button
   PA6 = Servo PWM TIM3_CH1
   ============================================================ */
void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    /* PA0 sebagai input analog LDR */
    GPIO_InitStruct.Pin = LDR_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(LDR_PORT, &GPIO_InitStruct);

    /* PB1 sebagai input push button */
    GPIO_InitStruct.Pin = BUTTON_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);

    /* PA6 sebagai output PWM servo TIM3_CH1 */
    GPIO_InitStruct.Pin = SERVO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
    HAL_GPIO_Init(SERVO_PORT, &GPIO_InitStruct);
}

/* ============================================================
   KONFIGURASI 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();
    }

    /* PA0 = ADC_CHANNEL_0 */
    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();
    }
}

/* ============================================================
   KONFIGURASI TIMER 3 UNTUK PWM SERVO
   ------------------------------------------------------------
   Servo standar:
   - Frekuensi PWM = 50 Hz
   - Periode = 20 ms
   - 1000 us = masuk
   - 1500 us = tengah
   - 2000 us = keluar
   ============================================================ */
void MX_TIM3_Init(void)
{
    TIM_OC_InitTypeDef sConfigOC = {0};

    __HAL_RCC_TIM3_CLK_ENABLE();

    htim3.Instance = TIM3;

    /*
      Prescaler 48 - 1 menghasilkan tick 1 us
      jika clock timer 48 MHz.
    */
    htim3.Init.Prescaler = 48 - 1;
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 20000 - 1;
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

    if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
    {
        Error_Handler();
    }

    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = SERVO_TENGAH;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

    if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
    {
        Error_Handler();
    }
}

/* ============================================================
   FUNGSI MEMBACA LDR SEKALI
   ============================================================ */
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;
}

/* ============================================================
   FUNGSI MEMBACA RATA-RATA LDR
   ------------------------------------------------------------
   Dibaca beberapa kali agar nilai lebih stabil.
   ============================================================ */
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 total / JUMLAH_SAMPLE;
}

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

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

    while (1)
    {
    }
}
Program Main h
#ifndef __MAIN_H
#define __MAIN_H

#include "stm32c0xx_hal.h"

/* PIN LDR */
#define LDR_PIN        GPIO_PIN_0
#define LDR_PORT       GPIOA

/* PIN PUSH BUTTON */
#define BUTTON_PIN     GPIO_PIN_1
#define BUTTON_PORT    GPIOB

/* PIN SERVO */
#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);
void Error_Handler(void);

#endif

e. Video Demo [Kembali]


f. Kondisi [Kembali]

Percobaan 2 kondisi 7

Buatlah rangkaian dengan kondisi ketika sensor cahaya (LDR) mendeteksi cahaya sangat rendah, maka jemuran akan segera masuk ke dalam atap. Jika cahaya sedang, jemuran berada pada posisi setengah terbuka, dan jika terang, jemuran berada di luar atap.

g. Video Simulasi [Kembali]



h. Download File [Kembali]

File TP [Klik disini]

Video Simulasi [Disini]



Kembali ke Halaman Atas


Tidak ada komentar:

Posting Komentar

  BAHAN PRESENTASI UNTUK MATA KULIAH  ELEKTRONIKA     Oleh : Farhan Hamid 2310951007     Dosen Pengampu : Darwison, M.T.     Darwison, 2010,...