lap akhir 2 modul 2


[menuju akhir]

1. Prosedur [Kembali ke Atas]

Langkah-langkah percobaan :

1. Siapkan alat dan bahan yaitu dengan komponen utama STM32 NUCLEO-G474RE, ldr sensor, Push Button, motor servo

2. Rangkai sesuai gambar percobaan

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

4. Masukkan program yang telah dibuat sesuai percobaan

5. Jalankan

2. Hardware dan Diagram Blok [Kembali ke Atas]

a. Hardware

1. STM32 NUCLEO-G474RE

2. LDR Sensor

3. Resistor

4. Push Button

5. Motor Servo

        6. Push Button

b. Diagram Blok


3. Rangkaian Simulasi dan Prinsip Kerja [Kembali ke Atas]

Sistem jemuran otomatis ini bekerja dengan memanfaatkan sensor LDR untuk membaca intensitas cahaya lingkungan yang datanya kemudian diproses oleh mikrokontroler STM32 Nucleo-C031C6. Saat cahaya terdeteksi tinggi (kondisi cerah), mikrokontroler akan mengirim sinyal PWM agar servo motor berputar menggerakkan lengan jemuran ke area terbuka di luar atap. Sebaliknya, jika cahaya meredup karena mendung atau malam hari, sistem secara otomatis memerintahkan servo untuk menarik jemuran kembali ke bawah atap guna memberikan perlindungan. Selain itu, terdapat push button yang berfungsi sebagai kendali manual, sehingga pengguna tetap bisa mengatur posisi jemuran secara instan tanpa harus menunggu perubahan sensor cahaya.
4. Flowchart dan Listing Program [Kembali ke Atas]

a. Flowchart

b. Listing Program

#include "main.h"

/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;

/* USER CODE BEGIN PV */
#define LDR_THRESHOLD 2000

uint8_t manual_mode = 0;
uint8_t posisi_servo = 0;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM3_Init(void);

/* USER CODE BEGIN 0 */

// ================= SERVO =================
void set_servo(uint8_t state)
{
  if (state == 0)
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000);
  else
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000);
}

// ================= ADC =================
uint16_t read_LDR(void)
{
  HAL_ADC_Start(&hadc1);
  HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
  return HAL_ADC_GetValue(&hadc1);
}

/* USER CODE END 0 */

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)
  {
    /* MODE OTOMATIS */
    if (!manual_mode)
    {
      uint16_t ldr = read_LDR();

      if (ldr < LDR_THRESHOLD)
        posisi_servo = 0; // gelap → masuk
      else
        posisi_servo = 1; // terang → keluar

      set_servo(posisi_servo);
    }

    HAL_Delay(100);
  }
}

/* ================= CALLBACK INTERRUPT ================= */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_1)
  {
    HAL_Delay(50); // debounce

    manual_mode = !manual_mode;
    posisi_servo = !posisi_servo;

    set_servo(posisi_servo);
  }
}

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

  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV4;
  RCC_OscInitStruct.PLL.PLLN = 85;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;

  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
                              | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
}

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

  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc1.Init.ContinuousConvMode = DISABLE;

  HAL_ADC_Init(&hadc1);

  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;

  HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

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

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 169;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 19999;

  HAL_TIM_PWM_Init(&htim3);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 1500;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

  HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);

  HAL_TIM_MspPostInit(&htim3);
}

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

  __HAL_RCC_GPIOA_CLK_ENABLE();

  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI1_IRQn);
}

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

5. Video Demo [Kembali ke Atas]

6. Analisa [Kembali ke Atas]


7. Download File [Kembali ke Atas]


Komentar

Postingan Populer