MODUL 2

TUGAS PENDAHULUAN 2


1. Prosedur [Kembali]

  1. Rangkai komponen sesuai gambar pada modul menggunakan platform Wokwi.com.

  2. Buka STM32CubeIDE, kemudian pilih opsi New STM32 Project.

  3. Pada menu BOARD SELECTOR, cari dan pilih papan STM32 Nucleo G474RE.

  4. Atur konfigurasi pin pada file .ioc sesuai kebutuhan rangkaian yang telah dirancang.

  5. Lakukan Generate Code, lalu masukkan kode program yang diperlukan ke dalam file main.c dan main.h.

  6. Klik Build Project untuk mengkompilasi proyek.

  7. Ambil file main.c dan main.h yang telah selesai di-generate, lalu masukkan kedua file tersebut ke dalam komponen STM32 Nucleo G474RE di Wokwi.

  8. Jalankan simulasi rangkaian dengan menekan tombol Run di Wokwi.


2. Hardware dan Diagram Blok [Kembali]

A. Hardware
  • STM32 NUCLEO-G474RE


  • LDR Sensor 


  • Buzzer 


  • LED


  • Switch 


  • Adaptor 


  • Breadboard




  • Motor Servo


  • Resistor  

B. Diagram Blok



3. Rangkaian Simulasi dan Prinsip Kerja  [Kembali]

A. Rangkaian Simulasi




B. Prinsip Kerja

Sistem ini menggunakan mikrokontroler NUCLEO-C031C6 yang dilengkapi dengan sensor LDR (Light Dependent Resistor) untuk membaca intensitas cahaya di sekitarnya, serta servo motor sebagai aktuator yang bergerak membuka atau menutup berdasarkan tingkat kecerahan. Prinsip kerja sistem dimulai ketika LDR yang terhubung ke pin PA0 mendeteksi intensitas cahaya. Nilai analog dari LDR ini kemudian dikonversi menjadi data digital menggunakan ADC1 (Analog to Digital Converter) internal STM32 dengan resolusi 12-bit, sehingga menghasilkan nilai antara 0 hingga 4095.

Selanjutnya, mikrokontroler membandingkan nilai ADC yang terbaca dengan dua ambang batas yang telah ditentukan, yaitu 1500 untuk kondisi gelap dan 3000 untuk kondisi sedang. Jika nilai ADC kurang dari 1500, sistem menganggap kondisi GELAP, sehingga servo digerakkan ke posisi tutup penuh dengan sinyal PWM 1000 mikrodetik. Jika nilai ADC berada di antara 1500 hingga 3000, kondisi SEDANG terdeteksi, dan servo bergerak ke posisi setengah terbuka dengan sinyal PWM 1500 mikrodetik. Sedangkan jika nilai ADC di atas atau sama dengan 3000, kondisi TERANG terdeteksi, sehingga servo bergerak ke posisi buka penuh dengan sinyal PWM 2000 mikrodetik.

Semua kendali servo dihasilkan melalui modul Timer 3 yang dikonfigurasi menghasilkan sinyal PWM 50Hz (periode 20 milidetik) pada pin PA6. Pulsa PWM yang berbeda akan menentukan sudut putaran servo, dari 0 derajat (tutup) hingga 180 derajat (buka). Proses pembacaan LDR dan pengaturan servo ini berlangsung terus-menerus dalam loop utama program dengan jeda 100 milidetik setiap siklusnya, sehingga sistem dapat merespon perubahan intensitas cahaya secara real-time dan menyesuaikan posisi servo secara otomatis.

4. Flowchart dan Listing Program  [Kembali]

A. Flowchart


B. Listing Program

#include "main.h"

// HANDLE
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;

// THRESHOLD
#define GELAP_THRESHOLD   1500
#define SEDANG_THRESHOLD  3000

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

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

  // 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;
  htim3.Init.Prescaler = 48 - 1;   // 1us
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 20000 - 1;   // 20ms (50Hz)

  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 =================
void set_servo(uint8_t state)
{
  if (state == 0)
  {
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000); // masuk penuh
  }
  else if (state == 1)
  {
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1500); // setengah terbuka
  }
  else
  {
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000); // keluar penuh
  }
}

// ================= 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)
  {
    uint16_t ldr = read_LDR();

    if (ldr < GELAP_THRESHOLD)
    {
      set_servo(0); // GELAP → masuk
    }
    else if (ldr < SEDANG_THRESHOLD)
    {
      set_servo(1); // SEDANG → setengah terbuka
    }
    else
    {
      set_servo(2); // TERANG → keluar
    }

    HAL_Delay(100);
  }
}


5. Video Demo [Kembali]



6. Kondisi  [Kembali]

Buatlah rangkaian dengan kondisi ketika sensor cahaya (LDR) mendeteksi lingkungan gelap, maka jemuran akan masuk sepenuhnya ke dalam atap. Namun, jika cahaya berada pada kondisi sedang, jemuran berada pada posisi setengah terbuka, dan jika terang, jemuran berada di luar atap.

7. Video Simulasi  [Kembali]



8. Download File  [Kembali]



Komentar

Postingan populer dari blog ini