TUGAS PENDAHULUAN 1



                                                    Percobaan 2 Kondisi 6


1. Prosedur [kembali]

  1. Buka software proteus lalu rangkai komponen sesuai dengan gambar yang ada di modul
  2. Buka software STM32CubeIDE lalu lakukan konfigurasi pin pada STM untuk menentukan GPIO input dan GPIO output
  3. Masukan Program ke dalam software STM32CubeIDE lalu build untuk mendapatkan file .hex
  4. Masukan file .hex ke dalam file library STM32F103C8 pada proteus
  5. Simulasikan rangkaian

2. Hardware dan Diagram Blok [kembali]

  • Hardware

    1. Resistor

    2. Switch

    3. Push Button


    3. LM35 (Sensor Suhu)

    4. Fan-DC

    5. Motor Driver L298N


    Diagram Blok


3. Rangkaian Simulasi dan Prinsip Kerja [kembali]



   Prinsip kerja sistem ini adalah mikrokontroler STM32 membaca suhu dari sensor LM35 secara terus-menerus untuk mengatur kecepatan kipas pendingin secara otomatis menggunakan sinyal PWM. Saat suhu terdeteksi di bawah 27°C kipas akan mati, namun jika suhu berada di rentang 27°C hingga di bawah 35°C, kipas akan menyala dengan kecepatan yang meningkat secara linear dari 50% hingga 100% seiring naiknya suhu. Apabila suhu memanas hingga mencapai 35°C atau lebih, kipas akan berputar pada kecepatan maksimal (100%); di samping itu, keseluruhan operasional kipas ini dapat dihentikan atau diaktifkan kembali kapan saja secara instan melalui penekanan tombol (push button) yang memicu fitur interupsi pada mikrokontroler.

4. Flowchart dan Listing Program [kembali]

  • Flowchart




  • Listing Program
#include "main.h" 

ADC_HandleTypeDef hadc1; 
TIM_HandleTypeDef htim1; 

void SystemClock_Config(void); 
static void MX_GPIO_Init(void); 
static void MX_ADC1_Init(void); 
static void MX_TIM1_Init(void); 

uint32_t adcValue = 0; 
float voltage = 0; 
float temperature = 0; 
uint8_t system_on = 1; 

int main(void) 
  HAL_Init(); 
  SystemClock_Config(); 

  MX_GPIO_Init(); 
  MX_ADC1_Init(); 
  MX_TIM1_Init(); 

  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); 

  while (1) 
  { 
    // 1. Baca Sensor Suhu
    HAL_ADC_Start(&hadc1); 
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); 
    adcValue = HAL_ADC_GetValue(&hadc1); 

    // 2. Konversi ke Celcius
    voltage = (adcValue / 4095.0) * 3.3; 
    temperature = (voltage * 100.0); 

    // 3. Logika Flowchart
    if(system_on) 
    { 
      if(temperature >= 35.0) 
      { 
        // Suhu >= 35°C: Kecepatan 100%
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); 
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); 
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 65535); // PWM 100%
      } 
      else if(temperature >= 27.0 && temperature < 35.0) 
      { 
        // Suhu 27°C - 35°C: Kecepatan 50% - 100% secara linear
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); 
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); 

        // Rumus Interpolasi (Mulai dari 0.5 atau 50% hingga 1.0 atau 100%)
        // Rentang suhu = 35 - 27 = 8 derajat
        float duty = 0.5 + ((temperature - 27.0) / 8.0) * 0.5; 

        uint32_t pwm_value = (uint32_t)(duty * 65535.0);
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pwm_value); 
      } 
      else 
      { 
        // Suhu < 27°C: Kipas mati (0%)
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); 
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); 
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0); // PWM 0%
      } 
    } 
    else 
    { 
      // Sistem dimatikan via Interrupt (Push Button) -> Kipas Mati
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); 
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); 
      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0); 
    } 

    HAL_Delay(200); 
  } 

// --- BAGIAN INISIALISASI (TIDAK ADA PERUBAHAN SIGNIFIKAN) ---

void SystemClock_Config(void) 
  RCC_OscInitTypeDef RCC_OscInitStruct = {0}; 
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; 
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; 

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; 
  RCC_OscInitStruct.HSIState = RCC_HSI_ON; 
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; 
  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_HSI; 
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); 

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; 
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2; 
  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); 

static void MX_ADC1_Init(void) 
  ADC_ChannelConfTypeDef sConfig = {0};
  hadc1.Instance = ADC1; 
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; 
  hadc1.Init.ContinuousConvMode = DISABLE; 
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; 
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; 
  hadc1.Init.NbrOfConversion = 1; 
  HAL_ADC_Init(&hadc1); 

  sConfig.Channel = ADC_CHANNEL_0; 
  sConfig.Rank = ADC_REGULAR_RANK_1; 
  sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5; 
  HAL_ADC_ConfigChannel(&hadc1, &sConfig); 

static void MX_TIM1_Init(void) 
  TIM_OC_InitTypeDef sConfigOC = {0}; 

  htim1.Instance = TIM1; 
  htim1.Init.Prescaler = 0; 
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP; 
  htim1.Init.Period = 65535; 
  HAL_TIM_PWM_Init(&htim1); 

  sConfigOC.OCMode = TIM_OCMODE_PWM1; 
  sConfigOC.Pulse = 0; 
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; 
  HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); 
  HAL_TIM_MspPostInit(&htim1); 

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

  __HAL_RCC_GPIOA_CLK_ENABLE(); 

  // Pin untuk Arah Motor (IN1, IN2)
  GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; 
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; 
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 

  // Pin untuk Tombol Interrupt
  GPIO_InitStruct.Pin = GPIO_PIN_4; 
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; 
  GPIO_InitStruct.Pull = GPIO_PULLUP; 
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 

  // Mengaktifkan interupsi di sistem
  HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0); 
  HAL_NVIC_EnableIRQ(EXTI4_IRQn); 

// Callback Interupsi Tombol
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 
  if(GPIO_Pin == GPIO_PIN_4) 
  { 
    system_on = !system_on; // Toggle ON/OFF
  } 

void Error_Handler(void) 
  __disable_irq(); 
  while (1) {} 
}

5. Video Demo [kembali]





6. Kondisi [kembali]

    Percobaan 2 Kondisi 6

Buatlah rangkaian seperti pada gambar percobaan 4 dengan kondisi ketika LDR mendeteksi kondisi gelap dan PIR mendeteksi adanya gerakan, maka LED menyala sangat terang selama 5 detik lalu kembali mati,

7. Video Simulasi [kembali]

-

8. Download File [kembali]











Comments

Popular posts from this blog

MODUL 1 - General Input dan Output

Tugas Besar - Kontrol Wastafel

LPF-40