Tugas Pendahuluan 2



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

b. Hardware dan Diagram Blok [Kembali]

  • Hardware

 1. STM32 NUCLEO-G474RE



2. PIR Sensor




3. LDR Sensor

4. Driver Motor L298



5. Resistor 1k ohm



6. LED 

7. Push Button
  • Diagram Blog





c. Rangkaian Simulasi dan Prinsip Kerja [Kembali]



        Prinsip kerja sistem pencahayaan pintar ini berpusat pada pembacaan intensitas cahaya sekitar menggunakan sensor LDR yang terhubung ke pin ADC mikrokontroler STM32. Secara terus-menerus, mikrokontroler akan membaca nilai tegangan analog dari LDR dan membandingkannya dengan nilai ambang batas (threshold) yang telah ditetapkan, yaitu 2000. Ketika lingkungan berada dalam kondisi terang (siang hari), sensor LDR akan menghasilkan nilai pembacaan ADC di bawah ambang batas tersebut (ldr < 2000).

        Saat mikrokontroler mendeteksi kondisi terang ini, program akan mengeksekusi instruksi di dalam blok logika khusus siang hari. Mikrokontroler akan langsung menjalankan fungsi set_LED(LED_OFF) yang mengirimkan sinyal PWM (Pulse Width Modulation) dengan nilai siklus kerja 0 ke pin PA6, sehingga lampu LED akan mati sepenuhnya. Karena struktur program ini menggunakan percabangan if-else di mana evaluasi kondisi LDR ditempatkan sebagai prioritas (di dalam blok if pertama), mikrokontroler akan secara otomatis melompati atau mengabaikan seluruh blok kode else yang berisi logika pembacaan sensor gerak PIR. Akibatnya, terlepas dari apakah sensor PIR mendeteksi pergerakan atau tidak, sistem sama sekali tidak akan memproses sinyal tersebut dan LED dipastikan akan tetap padam. Selain itu, pada kondisi terang ini, mikrokontroler juga akan mereset data waktu pergerakan terakhir (last_motion_time), guna mencegah lampu tiba-tiba menyala akibat "sisa" memori gerakan ketika kondisi lingkungan berangsur berubah menjadi gelap (malam hari).

d. Flowchart dan Listing Program [Kembali]

  • Flowchart


  • 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 (EXTI0_1)

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

 

    // ===== KONDISI SIANG (CAHAYA TERANG) =====

    // (Ganti tanda '<' menjadi '>' jika nilai ADC LDR Anda naik saat terang)

    if (ldr < LDR_THRESHOLD)

    {

      set_LED(LED_OFF); // Matikan LED sepenuhnya

     

      // Reset timer agar gerakan terakhir tidak tersimpan ke malam hari

      last_motion_time = HAL_GetTick() - MOTION_TIMEOUT;

    }

    else

    {

      // ===== KONDISI MALAM (CAHAYA GELAP) =====

      if (pir == GPIO_PIN_SET)

      {

        last_motion_time = HAL_GetTick();

      }

 

      if (HAL_GetTick() - last_motion_time < MOTION_TIMEOUT)

      {

        set_LED(LED_FULL); // Ada gerakan -> Nyala Penuh

      }

      else

      {

        set_LED(LED_DIM);  // Tidak ada gerakan -> Redup

      }

    }

 

    HAL_Delay(100);

  }  

}

 

e. Video Demo [Kembali]


f. Kondisi [Kembali]

Kondisi 10 : Buatlah rangkaian seperti pada gambar percobaan 4 dengan kondisi ketika LDR mendeteksi cahaya terang, maka LED akan mati sepenuhnya terlepas dari apakah PIR mendeteksi gerakan atau tidak.

g. Video Simulasi [Kembali]



h. Download File [Kembali]

File Tugas Pendahuluan(Zip) [Download]

Video Simulasi [Download]

Download Datasheet Pir Sensor [Download]

Download Datasheet Resistor [Download]

Download Datasheet LED [Download]

Download Datasheet STM32 Nucleo G474RE [Download]

Download Datasheet LDR Sensor [Download]

Download Datasheet Push Button [Download]

Kembali ke Halaman Atas

 


Komentar

Postingan populer dari blog ini