Tugas Pendahuluan 2

 




1. Prosedur [Kembali]

1. Buka web WOKWI.COM dan cari STM 32 NUCLEO C031C6

2. Rangkai komponen sesuai dengan gambar rangkaian di modul

3. Klik pada Library Manager untuk membuat file baru yang bernama main.h dan main.c

4. Masukan program yang telah di buat sesuai kondisi pada kedua file tersebut

5. Simulasikan

2. Hardware [Kembali]

  • STM32 NUCLEO-G474RE

  • Float Switch

  • Infrared Sensor
  • LED


  • Motor servo 



  • Push button

Diagram blog



3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]





Prinsip Kerja :

    1. Sensor LDR digunakan untuk mendeteksi intensitas cahaya di lingkungan sekitar.
    2. Pin VCC sensor LDR dihubungkan ke pin 5V pada board STM32 Nucleo-C031C6 dan pin GND dihubungkan ke GND mikrokontroler.
    3. Pin output sensor LDR dihubungkan ke pin input analog mikrokontroler, misalnya PA0 (ADC).
    4. Sensor LDR menghasilkan nilai tegangan yang berubah sesuai kondisi cahaya:
      • Saat terang → nilai ADC berubah sesuai intensitas cahaya tinggi.
      • Saat gelap → nilai ADC berubah menjadi lebih rendah/lebih tinggi tergantung modul.
    5. Mikrokontroler membaca nilai ADC dari pin PA0 secara terus-menerus.
    6. Program membandingkan nilai cahaya dengan nilai batas tertentu untuk menentukan kondisi terang atau gelap.
    7. Servo motor dihubungkan ke:
      • VCC servo → 5V
      • GND servo → GND
      • Pin sinyal servo → pin PWM mikrokontroler, misalnya D9/PA8.
    8. Jika sensor LDR mendeteksi kondisi terang, maka mikrokontroler mengirim sinyal PWM ke servo untuk memutar servo ke sudut membuka.
    9. Servo bergerak sehingga jemuran keluar agar pakaian terkena sinar matahari.
    10. Jika sensor LDR mendeteksi kondisi gelap, maka mikrokontroler mengubah sinyal PWM sehingga servo bergerak ke posisi sebaliknya.
    11. Servo menarik jemuran masuk untuk melindungi pakaian dari kondisi gelap atau hujan.
    12. Push button pada rangkaian dapat digunakan sebagai kontrol manual atau reset sesuai program yang dibuat.



Listing Program
#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   // batas terang / gelap

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

    // 1 us tick (48 MHz clock)
    htim3.Init.Prescaler = 48 - 1;
    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;
    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)
    {
        // Servo masuk ke dalam atap
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000);
    }
    else
    {
        // Servo keluar dari atap
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000);
    }
}

// ================= 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, 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;
            HAL_Delay(50);
        }

        last_button = button;

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

            // TERANG -> jemuran keluar
            if(ldr > LDR_THRESHOLD)
            {
                posisi_servo = 1; // keluar
            }
            // GELAP -> jemuran masuk
            else
            {
                posisi_servo = 0; // masuk
            }

            set_servo(posisi_servo);
        }

        HAL_Delay(100);
    }
}

5. Video Demo [Kembali]





6. Kondisi [Kembali]

M2 P2 K1: 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]

  • Rangkaian Simulasi [Klik]
  • Video Simulasi [Klik]






 

Komentar

Postingan populer dari blog ini