LA M2 Percobaan 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]

1. STM32 NUCLEO-G474RE



2. Switch




3. LDR Sensor


4. Resistor


5. Buzzer



6. LED 

7. Push Button



3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]




  • Ketika Mode Otomatis aktif dan sensor LDR mendeteksi cuaca terang, maka Servo berada pada posisi keluar (menjemur pakaian)

  • Ketika Mode Otomatis aktif dan sensor LDR mendeteksi cuaca gelap, maka Servo berada pada posisi masuk (menghindari hujan)

  • Ketika Mode Manual aktif dan sensor LDR mendeteksi terang atau gelap, maka Servo bergerak sesuai penekanan tombol (mengabaikan sensor LDR)


4. Flowchart [Kembali]

  • Flowchart




  • Listing Program
  • program main.h
#ifndef __MAIN_H
#define __MAIN_H
 
#include "stm32c0xx_hal.h"
 
// ================= PIN DEFINITIONS =================
#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 PROTOTYPES =================
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void MX_TIM3_Init(void);
 
#endif /* __MAIN_H */

PROGRAM MAIN.C

#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 =================
// Sesuaikan nilai ini saat simulasi jika batas terang/gelap kurang pas
#define LDR_THRESHOLD 2000
 
// ================= 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 (Gunakan Pull-Up internal)
  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 (FIX SERVO) =================
void MX_TIM3_Init(void)
{
  __HAL_RCC_TIM3_CLK_ENABLE();
 
  htim3.Instance = TIM3;
 
  // 1us tick (asumsi clock 48MHz pada STM32C0)
  htim3.Init.Prescaler = 48 - 1;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 20000 - 1; // 20ms = 50Hz (standar sinyal servo)
 
  HAL_TIM_PWM_Init(&htim3);
 
  TIM_OC_InitTypeDef sConfigOC = {0};
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 1500; // Posisi tengah awal (90 derajat)
  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)
  {
    // Posisi Masuk Atap (Gelap/Hujan)
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000);
  }
  else
  {  
    // Posisi Keluar Atap (Terang/Jemur)
    __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 (MANUAL MODE) =====
    uint8_t button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
 
    if (last_button == 1 && button == 0)
    {
      manual_mode = !manual_mode;
      posisi_servo = !posisi_servo;
      set_servo(posisi_servo);
      HAL_Delay(50); // Debounce tombol
    }
 
    last_button = button;
 
    // ===== MODE OTOMATIS =====
    if (!manual_mode)
    {
      uint16_t ldr = read_LDR();  
     
      // LOGIKA UTAMA: Cek intensitas cahaya
      if (ldr >= LDR_THRESHOLD)
      {
        posisi_servo = 1; // Terang -> Servo Keluar (Jemur)
      }
      else
      {
        posisi_servo = 0; // Gelap/Mendung -> Servo Masuk (Amankan)
      }
 
      set_servo(posisi_servo);
    }
 
    HAL_Delay(100);
  }
}


5. Video Demo [Kembali]



6. Analisa [Kembali]

pik






cau

7. Download File [Kembali]

Rangkaian Simulasi [Klik]

Foto rangkaian [klik]

Video Demo [Klik]


Kembali ke Halaman Atas









Komentar

Postingan populer dari blog ini