Senin, 27 April 2026

TUGAS PENDAHULUAN MODUL 2 PERCOBAAN 4



KONDISI 4 PERCOBAAN 4

MODUL 2 PWM, ADC, INTERRUPT


1. Prosedur [Kembali]

1.    1. Buka software proteus lalu rangkai komponen sesuai dengan gambar yang ada di modul

2.    2. Buka software STM32CubeIDE lalu lakukan konfigurasi pin pada STM untuk 

           menentukan GPIO input dan GPIO output

3.    3. Masukan Program ke dalam software STM32CubeIDE lalu build untuk mendapatkan 

            file.hex

4.     4. Masukan file .hex ke dalam file library STM32F103C8 pada proteus

5.     5. Simulasikan rangkaian

2. Hardware dan Diagram Blok [Kembali]

  • ST-LINK 
  • STM32NUCLEO  
  • PIR Sensor  
  • Breadboard
  • LDR Sensor 
  • Buzzer  
  • LED RGB
  • Resistor 220 OHM 

3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

Rangkaian Simulasi Di Wokwi



Prinsip kerja :

        Rangkaian ini menggunakan sensor LDR untuk mendeteksi intensitas cahaya dan sensor PIR untuk mendeteksi gerakan, yang keduanya diolah oleh mikrokontroler STM32 Nucleo. LDR disusun sebagai pembagi tegangan sehingga menghasilkan sinyal analog yang berubah sesuai kondisi cahaya dan dibaca oleh ADC. Saat lingkungan gelap, nilai tegangan dari LDR meningkat. Sementara itu, PIR memberikan sinyal digital, dimana HIGH menandakan ada gerakan dan LOW menandakan tidak ada gerakan.

            Mikrokontroler memproses kedua input tersebut untuk mengatur LED menggunakan PWM. Ketika LDR mendeteksi kondisi gelap dan PIR tidak mendeteksi gerakan, LED akan menyala redup karena diberikan duty cycle rendah. Hal ini bertujuan untuk memberikan pencahayaan minimum sekaligus menghemat energi. Jika kondisi berubah, seperti adanya gerakan atau lingkungan menjadi terang, maka intensitas LED akan disesuaikan atau dimatikan sesuai logika sistem.

4. Flowchart dan Listing Program [Kembali]

Flowchart program :




Listing Program:

#include "main.h"

// ================= HANDLE =================
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;

// ================= VARIABLE =================
volatile uint8_t emergency_mode = 0;
uint32_t last_motion_time = 0;

// fallback tombol
uint8_t last_button_state = 1;

// ================= PARAMETER =================
#define LDR_THRESHOLD 2000
#define MOTION_TIMEOUT 5000

#define LED_OFF   0
#define LED_DIM   100
#define LED_FULL  1000

// ================= 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};

  // PIR → PA1
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  // BUTTON → PB1 (PULL-UP + INTERRUPT)
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  // LED PWM → PA6
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  // IRQ untuk PB1
  HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
}

// ================= 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;
  hadc1.Init.ContinuousConvMode = DISABLE;

  HAL_ADC_Init(&hadc1);

  ADC_ChannelConfTypeDef sConfig = {0};
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_REGULAR_RANK_1;

  HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

// ================= PWM =================
void MX_TIM3_Init(void)
{
  __HAL_RCC_TIM3_CLK_ENABLE();

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 64;
  htim3.Init.Period = 1000;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;

  HAL_TIM_PWM_Init(&htim3);

  TIM_OC_InitTypeDef sConfigOC = {0};
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;

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

// ================= INTERRUPT =================
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_1)
  {
    emergency_mode = !emergency_mode;
  }
}

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

void set_LED(uint16_t value)
{
  __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, value);
}

// ================= 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)
  {
    // ===== FALLBACK BUTTON =====
    uint8_t current_button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);

    if (last_button_state == 1 && current_button == 0)
    {
      emergency_mode = !emergency_mode;
      HAL_Delay(50);
    }

    last_button_state = current_button;

    // ===== MODE DARURAT =====
    if (emergency_mode)
    {
      set_LED(LED_OFF);
      continue;
    }

    uint16_t ldr = read_LDR();
    uint8_t pir = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);

    // SIANG
    if (ldr < LDR_THRESHOLD)
    {
      set_LED(LED_OFF);
    }
    else
    {
      // MALAM
      if (pir == GPIO_PIN_SET)
      {
        last_motion_time = HAL_GetTick();
      }

      if (HAL_GetTick() - last_motion_time < MOTION_TIMEOUT)
      {
        set_LED(LED_FULL);
      }
      else
      {
        set_LED(LED_DIM);
      }
    }

    HAL_Delay(100);
  }
}

5. Video Demo [Kembali]

6. Kondisi [Kembali]

Percobaan 4 Kondisi 5

Buatlah rangkaian seperti pada gambar percobaan 4 dengan kondisi ketika LDR mendeteksi keadaan gelap dan PIR tidak mendeteksi gerakan, maka LED menyala redup

7. Video Simulasi [Kembali]




8. Download File [Kembali]

0 komentar:

Posting Komentar