TP M2 P2 K2



1. Prosedur[Kembali]

1. Buka Wokwi dengan mengunjungi https://wokwi.com.

2. Tambahkan komponen.

3. Hubungkan komponen sesuai kondisi

4. Tambahkan atau ketik Program yang sesuai dengan kondisi rangkaian

5. Jalankan program simulasi

2. Hardware dan Diagram Blok[Kembali]

• STM32 Nucleo G474RE 

Mengupload: 906526 dari 906526 byte diupload.


• LDR Sensor 



 • Push Button 



 • Motor Servo 



 • Breadboard 



 • Adaptor



3. Rangkaian Simulasi[Kembali]

  • Sebelum di running


  • Setelah di running

Prinsip kerja

Prinsip kerja sistem ini dimulai ketika mikrokontroler STM32 NUCLEO C031C6 dihidupkan dan melakukan inisialisasi seluruh peripheral yang digunakan, yaitu GPIO sebagai input dan output, serta PWM (timer) untuk mengendalikan motor servo. Setelah proses inisialisasi selesai, sistem akan mulai bekerja secara terus-menerus dalam loop utama.

Sensor yang digunakan pada rangkaian ini merupakan sensor analog (modul dengan pin AO) yang berfungsi untuk mendeteksi suatu kondisi fisik tertentu (misalnya cahaya, api, atau parameter lainnya tergantung jenis modul). Sensor tersebut menghasilkan sinyal analog yang kemudian dibaca oleh mikrokontroler melalui pin ADC. Nilai analog ini dikonversi menjadi data digital dengan resolusi 12-bit (0–4095) sehingga dapat diproses oleh sistem.

Selain sensor, terdapat push button yang berfungsi sebagai input tambahan untuk mengaktifkan atau memberikan kontrol terhadap sistem. Ketika tombol ditekan, mikrokontroler akan membaca perubahan logika pada pin input (HIGH/LOW) sebagai sinyal untuk menjalankan aksi tertentu sesuai program.

Nilai hasil pembacaan sensor kemudian dibandingkan dengan nilai ambang batas (threshold) yang telah ditentukan sebelumnya. Berdasarkan hasil perbandingan tersebut, sistem akan menentukan kondisi dan memberikan respon berupa pergerakan motor servo.

Motor servo dikendalikan menggunakan sinyal PWM dari mikrokontroler. Lebar pulsa (pulse width) yang dihasilkan menentukan sudut putar servo. Sebagai contoh, pulsa dengan lebar tertentu akan menggerakkan servo ke posisi 0 derajat, posisi tengah (sekitar 90 derajat), atau posisi maksimum (sekitar 180 derajat). Dengan demikian, perubahan nilai sensor akan mempengaruhi posisi servo secara otomatis.

Jika nilai sensor memenuhi kondisi tertentu (misalnya melewati threshold), maka mikrokontroler akan mengirimkan sinyal PWM yang menggerakkan servo ke posisi tertentu. Sebaliknya, jika kondisi tidak terpenuhi, servo akan kembali ke posisi awal atau posisi lainnya sesuai logika program.

Proses ini berlangsung secara terus-menerus dengan jeda waktu tertentu agar pembacaan lebih stabil. Dengan demikian, sistem mampu merespons perubahan kondisi sensor secara real-time dan mengendalikan posisi servo secara otomatis, baik berdasarkan pembacaan sensor maupun input dari push button.




4. Flowchart dan Listing Program[Kembali]

  • Flowchart


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

/* ================= 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 = LDR_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  HAL_GPIO_Init(LDR_PORT, &GPIO_InitStruct);

  // BUTTON PB1
  GPIO_InitStruct.Pin = BUTTON_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);

  // SERVO PA6
  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);
}

/* ================= 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 ================= */
void MX_TIM3_Init(void)
{
  __HAL_RCC_TIM3_CLK_ENABLE();

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 48 - 1;      // 1 us
  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; // tengah awal
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

  HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}

/* ================= SERVO CONTROL ================= */
void set_servo(uint8_t posisi)
{
  switch(posisi)
  {
    case 0:
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000); // dalam atap
      break;

    case 1:
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1500); // setengah
      break;

    case 2:
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000); // luar atap
      break;
  }
}

/* ================= READ 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)
  {
    /* ===== BUTTON TOGGLE ===== */
    uint8_t button = HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);

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

      if (ldr < LDR_LOW)
      {
        posisi_servo = 0; // dalam atap
      }
      else if (ldr >= LDR_LOW && ldr < LDR_MEDIUM)
      {
        posisi_servo = 1; // setengah
      }
      else
      {
        posisi_servo = 2; // luar atap
      }

      set_servo(posisi_servo);
    }

    HAL_Delay(100);
  }
}

5. Kondisi[Kembali]

Buatlah rangkaian dengan kondisi ketika sensor cahaya (LDR) mendeteksi cahaya rendah, maka jemuran berada di dalam atap. Jika cahaya meningkat ke tingkat sedang, jemuran berada pada posisi aman (setengah terbuka). Jika cahaya sangat terang, jemuran berada di luar atap.

6. Video Simulasi[Kembali]

  



7. Download File[Kembali]

File zip [Download]



























Komentar

Postingan populer dari blog ini