Tugas Pendahuluan 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 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




3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]





Rangkaian ini beroperasi sebagai sistem lampu otomatis cerdas yang mengutamakan efisiensi energi dengan menggabungkan sensor cahaya (LDR), sensor gerak (PIR), dan sakelar pengaman manual. Secara urutan logika, mikrokontroler pertama-tama mengecek status tombol (PB1); jika ditekan, sistem masuk ke mode darurat yang memaksa lampu mati total dan mengabaikan semua pembacaan sensor. Pada kondisi normal, sistem mengecek sensor LDR (PA0) terlebih dahulu; jika lingkungan terdeteksi siang/terang (nilai ADC < 2000), lampu dipastikan mati terlepas dari ada tidaknya orang. Namun, jika lingkungan terdeteksi malam/gelap (nilai ADC ≥ 2000), mikrokontroler baru mulai memantau sensor PIR (PA1), di mana lampu LED (PA6) hanya akan menyala penuh jika mendeteksi adanya gerakan manusia, dan mikrokontroler akan menunda pemadaman selama 5 detik sejak gerakan terakhir sebelum akhirnya mematikan lampu secara otomatis.

4. Flowchart dan Listing Program [Kembali]


Flowchart



Program Main. h


#ifndef __MAIN_H
#define __MAIN_H

#include "stm32c0xx_hal.h"

// ================= PIN DEFINITIONS =================

// LDR (ADC)
#define LDR_PORT GPIOA
#define LDR_PIN  GPIO_PIN_0   // PA0

// SENSOR GERAK (DIGANTI PUSH BUTTON UNTUK SIMULASI)
#define PIR_PORT GPIOA
#define PIR_PIN  GPIO_PIN_1   // PA1

// PUSH BUTTON MODE (EMERGENCY)
#define BUTTON_PORT GPIOB
#define BUTTON_PIN  GPIO_PIN_1  // PB1

// LED PWM
#define LED_PORT GPIOA
#define LED_PIN  GPIO_PIN_6   // PA6 (TIM3_CH1)

// ================= PARAMETER =================

// Threshold LDR (gelap)
#define LDR_THRESHOLD 2000

// LED STATE
#define LED_OFF   0
#define LED_FULL  1000

// ================= FUNCTION PROTOTYPES =================

void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void MX_TIM3_Init(void);

#endif





Program Main. c

\

#include "main.h"

// HANDLE
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;

// VARIABLE
uint32_t last_motion_time = 0;

// PARAMETER
#define LDR_THRESHOLD 2000      // batas gelap/terang
#define MOTION_DELAY 5000       // 5 detik

#define LED_OFF   0
#define LED_ON    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();

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  // PIR → PA1
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOA, &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);
}

// ================= 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; // PA0 untuk LDR
  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);
}

// ================= 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 val)
{
  __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, val);
}

// ================= 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)
  {
    uint16_t ldr = read_LDR();
    uint8_t pir = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);

    // ================= 1. CEK LDR =================
    if (ldr < LDR_THRESHOLD)
    {
      // TERANG → LAMPU OFF
      set_LED(LED_OFF);
    }
    else
    {
      // GELAP → LANJUT CEK PIR

      // ================= 2. CEK PIR =================
      if (pir == GPIO_PIN_SET)
      {
        // ADA GERAKAN
        set_LED(LED_ON);
        last_motion_time = HAL_GetTick(); // simpan waktu
      }
      else
      {
        // TIDAK ADA GERAKAN
        if (HAL_GetTick() - last_motion_time < MOTION_DELAY)
        {
          // MASIH DALAM DELAY → LAMPU ON
          set_LED(LED_ON);
        }
        else
        {
          // SUDAH LEWAT DELAY → LAMPU OFF
          set_LED(LED_OFF);
        }
      }
    }

    HAL_Delay(50);
  }
}



5. Video Demo [Kembali]


6. Kondisi [Kembali]

kondisi 3: Buatlah rangkaian seperti pada gambar percobaan 4 dengan keadaan LDR mendeteksi gelap, PIR sebelumnya mendeteksi gerakan lalu tidak lagi mendeteksi, maka lampu kembali kondisi mati

7. Video Simulasi [Kembali]



8. Download File [Kembali]



 

 

Komentar

Postingan populer dari blog ini

Elektro