TP MODUL 2 P4K5



Percobaan 4 kondisi 5

1. Prosedur[Kembali]

    1. Buat rangkaian sesuai dengan kondisi percobaan
    2. Buat program 
    4. Jalankan simulasinya 
    5. Selesai.

2. Hardware dan Diagram Blok[Kembali]

Hardware :

  • STM32 Nucleo G474RE

  • LDR Sensor

  • PIR Sensor

  • Push Button

  • Jumper 
  • Resistor

  • Breadboard 

Diagram Blok

3. Rangkaian Simulasi[Kembali]

  • Rangkaian sebelum di running
  • Rangkaian setelah di running
  • Prinsip Kerja 

Prinsip kerja rangkaian ini berpusat pada efisiensi energi otomatis melalui pengolahan data sensor LDR dan PIR. Selama emergency mode tidak aktif, STM32 akan memproses nilai analog dari LDR, jika kondisi terdeteksi gelap (melewati ambang batas 2000), sistem akan memerintahkan lampu untuk menyala.

Keunikan program ini terletak pada pengaturan kecerahannya: saat sensor PIR mendeteksi gerakan, lampu akan menyala dengan intensitas penuh (LED_FULL). Namun, jika tidak ada aktivitas selama 5 detik, mikrokontroler akan menurunkan sinyal PWM ke tingkat redup (LED_DIM), yaitu sekitar 15% dari daya maksimal. Hal ini bertujuan untuk menjaga penerangan minimal di ruangan sekaligus menghemat penggunaan energi listrik secara efektif.


4. Flowchart dan Listing Program[Kembali]

  • Flowchart

  • Listing Program
#include "main.h"

/* Handle Peripherals */
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;

/* Variables */
volatile uint8_t emergency_mode = 0;
uint32_t last_motion_time = 0;
uint8_t last_button_state = 1;

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

#define LED_OFF   0          
#define LED_DIM   150        
#define LED_FULL  1000      

/* Prototypes */
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void MX_TIM3_Init(void);
uint16_t read_LDR(void);
void set_LED(uint16_t value);

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

  /* Urutan inisialisasi */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_TIM3_Init();

  /* Jalankan PWM */
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

  while (1)
  {
    // 1. CEK TOMBOL (PB1)
    uint8_t current_button = HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);
    if (last_button_state == 1 && current_button == 0)
    {
      emergency_mode = !emergency_mode;
      HAL_Delay(50);
    }
    last_button_state = current_button;

    // 2. LOGIKA UTAMA
    if (emergency_mode)
    {
      set_LED(LED_OFF);
    }
    else
    {
      uint16_t ldr_val = read_LDR();
      uint8_t pir_val = HAL_GPIO_ReadPin(PIR_PORT, PIR_PIN);

      // Jika Terang (Nilai ADC kecil) -> Matikan
      if (ldr_val < LDR_THRESHOLD)
      {
        set_LED(LED_OFF);
      }
      // Jika Gelap
      else
      {
        if (pir_val == GPIO_PIN_SET)
        {
          set_LED(LED_FULL);
          last_motion_time = HAL_GetTick();
        }
        else
        {
          // Jika Gelap + Tidak ada gerakan -> REDUP
          if (HAL_GetTick() - last_motion_time >= MOTION_TIMEOUT)
          {
            set_LED(LED_DIM);
          }
        }
      }
    }
    HAL_Delay(20);
  }
}

// --- FUNGSI PEMBANTU ---

uint16_t read_LDR(void)
{
  HAL_ADC_Start(&hadc1);
  if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
  {
    uint16_t val = HAL_ADC_GetValue(&hadc1);
    HAL_ADC_Stop(&hadc1);
    return val;
  }
  HAL_ADC_Stop(&hadc1);
  return 0;
}

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

// --- INISIALISASI PERIPHERAL ---

void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  // PIR (PA1 sesuai main.h)
  GPIO_InitStruct.Pin = PIR_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN; // Sensor PIR biasanya butuh pulldown
  HAL_GPIO_Init(PIR_PORT, &GPIO_InitStruct);

  // BUTTON (PB1 sesuai main.h)
  GPIO_InitStruct.Pin = BUTTON_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);

  // LED PWM (PA6 sesuai main.h)
  GPIO_InitStruct.Pin = LED_PIN;
  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(LED_PORT, &GPIO_InitStruct);

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

void MX_ADC1_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};
  __HAL_RCC_ADC_CLK_ENABLE();

  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  HAL_ADC_Init(&hadc1);

  // SEKARANG MENGGUNAKAN CHANNEL 0 (PA0) SESUAI MAIN.H
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_12CYCLES_5;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

void MX_TIM3_Init(void)
{
  TIM_OC_InitTypeDef sConfigOC = {0};
  __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);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}

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;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
}

5. 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

6. Video Simulasi[Kembali]

 



7. Download File[Kembali]

Rangkaian [Download] 
Listing Program [Download]
Video Simulasi [Download]  




Komentar

Postingan populer dari blog ini

Modul 1 General Input dan Output

Sub chapter 7.6

Modul 1 Sistem Digital