TP 2 M2



1. Prosedur [kembali]

  1. Menyiapkan alat dan bahan.
  2. Merangkai komponen pada breadboard sesuai dengan gambar rangkaian percobaan.
  3. Menghubungkan masing masing pin input output.
  4. Mengunggah program menggunakan ST-LINK ke mikrokontroler.
  5. Jalankan Rangkaian

2. Hardware dan Diagram Blok [kembali]

  • STM32 Nucleo 
  • G474RE  
  • LDR Sensor 
  • Push Button 
  • Motor Servo 
  • Breadboard 
  • Adaptor

3. Rangkaian Simulasi dan Prinsip Kerja [kembali]







Pada simulasi di Wokwi, sistem bekerja dengan memanfaatkan sensor LDR (Light Dependent Resistor) sebagai pendeteksi tingkat pencahayaan di lingkungan sekitar. LDR memiliki karakteristik resistansi yang berubah-ubah sesuai intensitas cahaya yang diterima. Saat kondisi lingkungan terang, nilai resistansi LDR akan menurun, sedangkan ketika kondisi gelap resistansinya meningkat. Perubahan resistansi tersebut menghasilkan perubahan tegangan pada rangkaian pembagi tegangan yang kemudian dibaca oleh mikrokontroler sebagai sinyal analog.

Mikrokontroler selanjutnya melakukan pengolahan terhadap nilai analog yang diterima dari sensor. Nilai tersebut dibandingkan dengan batas tertentu (threshold) untuk menentukan kondisi lingkungan, apakah terang atau gelap. Jika intensitas cahaya terdeteksi tinggi, sistem menganggap cuaca dalam keadaan cerah sehingga mikrokontroler menghasilkan sinyal PWM (Pulse Width Modulation) untuk mengendalikan motor servo agar bergerak ke posisi keluar. Posisi ini memungkinkan pakaian mendapatkan sinar matahari secara maksimal.

Sebaliknya, ketika sensor mendeteksi intensitas cahaya rendah yang menandakan kondisi mendung atau hujan, mikrokontroler akan mengubah sinyal PWM yang dikirim ke motor servo. Akibatnya, servo bergerak ke posisi masuk agar jemuran berada di bawah pelindung dan terhindar dari air hujan.

Melalui mekanisme tersebut, sistem jemuran otomatis dapat bekerja secara mandiri tanpa pengoperasian manual dari pengguna. Penggunaan sensor cahaya, mikrokontroler, dan motor servo membuat proses penjemuran menjadi lebih praktis, efisien, dan mampu memberikan perlindungan otomatis terhadap pakaian saat cuaca berubah.

4. Flowchart dan Listing Program [kembali]




Flowchart

Listing Program:

#include "main.h"

// HANDLE
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;

// VARIABLE MODE
uint8_t system_mode = 0; // 0: Auto, 1: Manual Dalam, 2: Manual Setengah, 3: Manual Luar
uint8_t last_button = 1;

// THRESHOLD LDR
#define LDR_GELAP  1500  
#define LDR_TERANG 2800  

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

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 48 - 1;
  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 = 1000;
  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 atap
  }
  else if (state == 1)
  {
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1500); // Setengah
  }
  else if (state == 2)
  {
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000); // Keluar
  }
}

// ================= 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 =====
    uint8_t button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);

    if (last_button == 1 && button == 0)
    {
      system_mode++;
      if (system_mode > 3) system_mode = 0;
      HAL_Delay(250);
    }
    last_button = button;

    // ===== MODE =====
    if (system_mode == 0)
    {
      // MODE AUTO (SUDAH DIBALIK SESUAI SOAL)
      uint16_t ldr = read_LDR();
     
      if (ldr < LDR_GELAP)
      {
        set_servo(2); // GELAP → keluar
      }
      else if (ldr >= LDR_GELAP && ldr < LDR_TERANG)
      {
        set_servo(1); // sedang
      }
      else
      {
        set_servo(0); // TERANG → masuk
      }
    }
    else if (system_mode == 1)
    {
      set_servo(0); // Manual masuk
    }
    else if (system_mode == 2)
    {
      set_servo(1); // Manual setengah
    }
    else if (system_mode == 3)
    {
      set_servo(2); // Manual keluar
    }

    HAL_Delay(50);
  }
}



MAIN H

#ifndef __MAIN_H
#define __MAIN_H

#include "stm32c0xx_hal.h"

// PIN
#define LDR_PIN     GPIO_PIN_0
#define LDR_PORT    GPIOA

#define BUTTON_PIN  GPIO_PIN_1
#define BUTTON_PORT GPIOB

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

#endif


5. Video Demo [kembali]



6. Kondisi [kembali]

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]









Komentar

Postingan Populer