Modul 2 Percobaan 4 Kondisi 3




1. Prosedur [Kembali]

Langkah-langkah percobaan :

1. Buka web WOKWI.COM dan cari STM 32 NUCLEO C031C6

2. Rangkai komponen sesuai dengan modul percobaan

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


Langkah-langkah percobaan secara langsung:
  • Siapkan seluruh komponen yang dibutuhkan.
  • Rangkai komponen sesuai dengan gambar yang ada di modul.
  • Pastikan semua koneksi sudah sesuai, tidak ada kabel yang longgar atau terbalik.
  • Buka software STM32CubeIDE lalu lakukan konfigurasi pin pada STM untuk menentukan ADC, PWM, dan interrupt
  • Masukan Program ke dalam software STM32CubeIDE lalu build untuk memastikan tidak ada program yang error
  • Hubungkan board STM32 ke komputer, lalu lakukan pemrograman sesuai dengan flowchart yang telah dibuat.
  • Setelah program berhasil di-upload, silahkan run untuk memastikan logika dan rangkaian sudah benar.



  • 2. Hardware dan Diagram Blok [Kembali]

    a. Hardware
    1. STM32 NUCLEO-G474RE

    STM32 NUCLEO-G474RE adalah papan pengembangan (development board) berbasis mikrokontroler STM32 yang dirancang oleh STMicroelectronics untuk memudahkan proses pembelajaran, prototyping, dan pengembangan sistem embedded.

    Secara spesifik, board ini menggunakan mikrokontroler STM32G474RE, yang termasuk dalam keluarga STM32 seri G4. Mikrokontroler ini berbasis inti ARM Cortex-M4 dengan kemampuan pemrosesan yang cukup tinggi serta dilengkapi dengan fitur DSP (Digital Signal Processing) dan FPU (Floating Point Unit), sehingga sangat cocok untuk aplikasi yang membutuhkan perhitungan matematis cepat seperti kontrol motor, sistem tenaga, dan pengolahan sinyal.


    2. LDR Sensor



    Light Dependent Resistor (LDR) adalah sensor cahaya yang nilai resistansinya berubah sesuai intensitas cahaya yang diterimanya.

    3. PIR Sensor

    Passive Infrared Sensor (PIR) adalah sensor gerak yang digunakan untuk mendeteksi keberadaan manusia atau objek hidup berdasarkan radiasi inframerah (panas tubuh).


    4. Resistor 

    Resistor adalah komponen elektronik pasif yang berfungsi untuk membatasi arus listrik dalam suatu rangkaian. Resistor bekerja berdasarkan hukum Ohm, yang menyatakan bahwa tegangan (V) = arus (I) × resistansi (R). Resistor memiliki satuan Ohm (Ω) dan digunakan dalam berbagai aplikasi seperti pembagian tegangan, kontrol arus, dan proteksi rangkaian elektronik.

    5. LED

    LED adalah dioda semikonduktor yang dapat memancarkan cahaya ketika dialiri arus listrik. LED digunakan dalam berbagai aplikasi seperti indikator elektronik, pencahayaan, dan display. LED hanya bekerja pada arah bias maju dan memiliki berbagai warna yang ditentukan oleh material semikonduktornya.

    6. Push Button

    Push button adalah komponen input berupa saklar mekanis yang bekerja ketika ditekan (push) oleh pengguna untuk menghubungkan atau memutuskan aliran listrik dalam suatu rangkaian.

    Secara prinsip kerja, push button memiliki dua kondisi utama, yaitu Normally Open (NO) dan Normally Closed (NC). Pada tipe Normally Open, dalam kondisi tidak ditekan rangkaian berada dalam keadaan terbuka (tidak mengalirkan arus), dan ketika tombol ditekan, rangkaian menjadi tertutup sehingga arus dapat mengalir. Sebaliknya, pada tipe Normally Closed, rangkaian dalam kondisi normal tertutup dan akan terbuka saat tombol ditekan.

    7. Adaptor



    8. Jumper



    9. Breadboard



    b. Diagram Blok



    b. Diagram Blok




    3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

    Gambar rangkaian:



    Saat sistem aktif, mikrokontroler secara terus-menerus membaca nilai sensor cahaya (LDR) melalui ADC pada pin PA0 untuk mengetahui kondisi lingkungan. Jika nilai ADC menunjukkan kondisi terang, maka lampu akan dimatikan. Sebaliknya, jika terdeteksi gelap, sistem akan mengaktifkan mode siaga pencahayaan.

    Pada kondisi gelap, sistem kemudian menunggu adanya aktivitas dari sensor gerak (PIR) yang terhubung ke pin PA1. Sensor ini dapat dikonfigurasi menggunakan interrupt, sehingga ketika ada gerakan, mikrokontroler langsung merespons tanpa harus menunggu proses loop. Saat interrupt dari PIR aktif, lampu akan dinyalakan menggunakan PWM pada pin PA6, sehingga intensitas cahaya dapat diatur (misalnya langsung terang penuh atau bertahap).

    Setelah tidak ada gerakan lagi, sistem tidak langsung mematikan lampu, tetapi menunggu selama beberapa waktu (delay) untuk menjaga kenyamanan. Jika dalam waktu tersebut tidak ada interrupt baru dari PIR, maka lampu akan diredupkan atau dimatikan kembali menggunakan PWM.

    Dengan demikian, sistem ini bekerja secara otomatis: ADC menentukan kondisi terang/gelap, interrupt mendeteksi kejadian gerakan secara cepat, dan PWM mengatur tingkat kecerahan lampu, sehingga menghasilkan sistem penerangan yang efisien, responsif, dan hemat energi.

     




    4. Flowchart dan Listing Program [Kembali]

    a. Flowchart


    b. Listing 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);
      }
    }


    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


    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

    TUGAS BESAR

    Aplikasi Counter

    TUGAS BESAR