Tugas Pendahuluan 2



 1. Prosedur[kembali]

 Prosedur
  1. Pahami terlebih dahulu kondisi yang akan digunakan
  2. Buka web Wokwi
  3. Persiapkan alat dan bahan
  4. Buat rangkaian sesuai dengan kondisi dan modul
  5. Buat kode program untuk mengoperasikan rangkaian tersebut sesuai dengan kondisi 
  6. Jalankan simulasi rangkaian.  
  7. Proses selesai

 2. Hardware [kembali]

  • Hardware
  • 1. STM32 NUCLEO-G474RE



    2. PIR Sensor



    3. Infrared Sensor


    4. Resistor


    5. Buzzer



    6. LED 

    7. Push Button
    • Diagram Blog





     3. Rangkaian Simulasi Dan Prinsip Kerja [kembali]



    • A. Kondisi Gelap (LDR = 1)

      • Sensor mengirim logika HIGH (1) ke STM32
      • Mikrokontroler membaca kondisi ini sebagai trigger
      • Maka sistem akan:
        1. Menyalakan LED
        2. Menjalankan delay selama 5 detik
        3. Setelah 5 detik → LED mati kembali

      B. Kondisi Terang (LDR = 0)

      • Sensor mengirim logika LOW (0)
      • STM32:
        • Tidak mengaktifkan LED
        • LED tetap mati

     4. Flowchart dan Listing Program [kembali]       

    • Flowchart

     


    • #include "main.h"

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

      // ================= VAR =================
      uint32_t adc_value = 0;
      uint8_t triggered = 0;

      // ====== PARAMETER ======
      #define ADC_THRESHOLD 2000
      #define LED_BRIGHT    1000
      #define LED_OFF       0

      // ================= PROTOTYPE =================
      void SystemClock_Config(void);
      static void MX_GPIO_Init(void);
      static void MX_ADC1_Init(void);
      static void MX_TIM3_Init(void);

      // ================= FUNCTION =================
      uint32_t Read_ADC(void)
      {
        HAL_ADC_Start(&hadc1);
        HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
        return HAL_ADC_GetValue(&hadc1);
      }

      // ================= 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)
        {
          adc_value = Read_ADC();

          uint8_t pir_active = 1; // PIR selalu aktif
          uint8_t isDark = (adc_value > ADC_THRESHOLD);

          if (isDark && pir_active)
          {
            if (!triggered)
            {
              triggered = 1;

              // LED terang
              __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, LED_BRIGHT);

              // delay 5 detik
              HAL_Delay(5000);

              // LED mati
              __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, LED_OFF);
            }
          }
          else
          {
            // kondisi terang → reset
            triggered = 0;
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, LED_OFF);
          }

          HAL_Delay(100);
        }
      }

      // ================= ADC =================
      static void MX_ADC1_Init(void)
      {
        ADC_ChannelConfTypeDef sConfig = {0};

        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.EOCSelection = ADC_EOC_SINGLE_CONV;
        hadc1.Init.ContinuousConvMode = DISABLE;
        hadc1.Init.NbrOfConversion = 1;
        hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;

        if (HAL_ADC_Init(&hadc1) != HAL_OK)
        {
          Error_Handler();
        }

        sConfig.Channel = ADC_CHANNEL_0; // PA0
        sConfig.Rank = ADC_REGULAR_RANK_1;
        sConfig.SamplingTime = ADC_SAMPLETIME_160CYCLES_5;

        if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
        {
          Error_Handler();
        }
      }

      // ================= TIM3 PWM =================
      static void MX_TIM3_Init(void)
      {
        TIM_OC_InitTypeDef sConfigOC = {0};

        htim3.Instance = TIM3;
        htim3.Init.Prescaler = 47;        // 48MHz → 1MHz
        htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
        htim3.Init.Period = 1000;         // duty 0–1000
        htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

        if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
        {
          Error_Handler();
        }

        sConfigOC.OCMode = TIM_OCMODE_PWM1;
        sConfigOC.Pulse = 0;
        sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

        if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
        {
          Error_Handler();
        }
      }

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

        __HAL_RCC_GPIOA_CLK_ENABLE();

        // PA0 → LDR (ADC)
        GPIO_InitStruct.Pin = GPIO_PIN_0;
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        // PA6 → LED (TIM3 CH1)
        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);
      }

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

        if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
        {
          Error_Handler();
        }

        RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |
                                      RCC_CLOCKTYPE_SYSCLK |
                                      RCC_CLOCKTYPE_PCLK1;

        RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
        RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
        RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

        if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
        {
          Error_Handler();
        }
      }

      // ================= ERROR =================
      void Error_Handler(void)
      {
        __disable_irq();
        while (1) {}
      }


     5. Vidio Demo [kembali]


     6. Video Simulasi [kembali]



     7. Download File [kembali]

    Download proteus rangkaian simulasi klik disini















    Comments

    Popular posts from this blog