Percobaan 4 Kondisi 4




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 [Kembali]

  • STM32F103C8

  • Touch Sensor

  • PIR Sensor
  • LED


  • Buzzer
  • Resistor 
  • Heart Beat Sensor

Diagram blog

                            


3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]






  • Prinsip Kerja Sistem Lampu Jalan Otomatis 

    1. Inisialisasi Sistem:

      • Mikrokontroler STM32 (misalnya STM32F4) melakukan inisialisasi pada pin GPIO yang terhubung ke sensor PIR (sebagai input digital), sensor LDR atau Potensiometer yang mensimulasikan LDR (sebagai input analog pada kanal ADC), dan LED (sebagai output).

    2. Pembacaan Sensor:

      • Secara real-time, mikrokontroler membaca data dari sensor LDR/Potensiometer melalui kanal ADC untuk menentukan kondisi cahaya lingkungan.

      • Secara bersamaan, mikrokontroler membaca status sinyal digital dari sensor PIR untuk mendeteksi keberadaan gerakan.

    3. Logika Pengendalian Berdasarkan Kondisi Cahaya Terang:

      • Jika hasil pembacaan LDR/Potensiometer menunjukkan kondisi cahaya terang (tegangan input analog berada di bawah ambang batas tertentu), sistem masuk ke mode siang hari.

    4. Respon Terhadap Gerakan (Selama Cahaya Terang):

      • Dalam kondisi cahaya terang tersebut, jika sensor PIR mendeteksi adanya gerakan, mikrokontroler akan segera mengirimkan sinyal logika rendah (low) ke pin output LED.

      • Akibatnya, LED akan mati atau tetap mati. Sinyal low ini akan terus dipertahankan selama sensor PIR masih mendeteksi adanya gerakan (misalnya, orang yang lewat tersebut berhenti di depan sensor).

    5. Pemulihan Kondisi (Gerakan Hilang):

      • Setelah sensor PIR tidak lagi mendeteksi adanya gerakan (orang tersebut sudah lewat dan menjauh), mikrokontroler mendeteksi perubahan sinyal input PIR dari high menjadi low (aktif rendah pada banyak modul PIR).

      • Mikrokontroler kemudian akan kembali mengirimkan sinyal logika tinggi (high) ke pin output LED, sehingga LED akan kembali menyala.

  • Flowchart



    • Listing Program
    main.h:

    #ifndef __MAIN_H // Mencegah double include

    #define __MAIN_H

    #include "stm32c0xx_hal.h" // Library utama HAL STM32

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

    // LDR (ADC)

    #define LDR_PORT GPIOA

    #define LDR_PIN GPIO_PIN_0 // PA0 sebagai input analog (LDR)

    // PIR SENSOR

    #define PIR_PORT GPIOA

    #define PIR_PIN GPIO_PIN_1 // PA1 sebagai input digital (PIR)

    // PUSH BUTTON (INTERRUPT)

    #define BUTTON_PORT GPIOB

    #define BUTTON_PIN GPIO_PIN_1 // PB1 sebagai tombol interrupt

    // LED PWM

    #define LED_PORT GPIOA

    #define LED_PIN GPIO_PIN_6 // PA6 sebagai output PWM (TIM3_CH1)

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

    void SystemClock_Config(void); // Konfigurasi clock sistem

    void MX_GPIO_Init(void); // Inisialisasi GPIO

    void MX_ADC1_Init(void); // Inisialisasi ADC

    void MX_TIM3_Init(void); // Inisialisasi Timer PWM

    #endif


    main.c:

    #include "main.h" // Memanggil header utama

    // ================= HANDLE =================

    ADC_HandleTypeDef hadc1; // Handle untuk ADC

    TIM_HandleTypeDef htim3; // Handle untuk Timer PWM

    // ================= VARIABLE =================

    volatile uint8_t emergency_mode = 0; // Mode darurat (toggle dari tombol)

    uint32_t last_motion_time = 0; // Waktu terakhir deteksi gerakan

    // fallback tombol (manual polling)

    uint8_t last_button_state = 1;

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

    #define LDR_THRESHOLD 2000 // Ambang terang/gelap (ADC)

    #define MOTION_TIMEOUT 5000 // Delay waktu gerakan (tidak dipakai di logika baru)

    #define LED_OFF 0 // PWM = 0 → LED mati

    #define LED_DIM 100 // LED redup (opsional)

    #define LED_FULL 1000 // LED terang maksimal

    // ================= CLOCK =================

    void SystemClock_Config(void)

    {

    RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Struktur konfigurasi oscillator

    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // Struktur konfigurasi clock

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; // Gunakan HSI

    RCC_OscInitStruct.HSIState = RCC_HSI_ON; // Aktifkan HSI

    HAL_RCC_OscConfig(&RCC_OscInitStruct); // Terapkan konfigurasi

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK;

    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // Sumber clock dari HSI

    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // Tanpa pembagi

    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); // Terapkan

    }

    // ================= GPIO =================

    void MX_GPIO_Init(void)

    {

    __HAL_RCC_GPIOA_CLK_ENABLE(); // Aktifkan clock GPIOA

    __HAL_RCC_GPIOB_CLK_ENABLE(); // Aktifkan clock GPIOB

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // ===== PIR → PA1 =====

    GPIO_InitStruct.Pin = GPIO_PIN_1; // Pin PA1

    GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // Input digital

    GPIO_InitStruct.Pull = GPIO_NOPULL; // Tanpa pull resistor

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    // ===== BUTTON → PB1 =====

    GPIO_InitStruct.Pin = GPIO_PIN_1;

    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // Interrupt saat ditekan

    GPIO_InitStruct.Pull = GPIO_PULLUP; // Pull-up internal

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    // ===== LED PWM → PA6 =====

    GPIO_InitStruct.Pin = GPIO_PIN_6;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // Alternate function (PWM)

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate = GPIO_AF1_TIM3; // Hubungkan ke TIM3

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    // ===== ENABLE INTERRUPT =====

    HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0, 0); // Prioritas interrupt

    HAL_NVIC_EnableIRQ(EXTI0_1_IRQn); // Aktifkan interrupt

    }

    // ================= ADC =================

    void MX_ADC1_Init(void)

    {

    __HAL_RCC_ADC_CLK_ENABLE(); // Aktifkan clock ADC

    hadc1.Instance = ADC1; // Gunakan ADC1

    hadc1.Init.Resolution = ADC_RESOLUTION_12B; // Resolusi 12-bit

    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // Data rata kanan

    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; // Single channel

    hadc1.Init.ContinuousConvMode = DISABLE; // Tidak kontinu

    HAL_ADC_Init(&hadc1);

    ADC_ChannelConfTypeDef sConfig = {0};

    sConfig.Channel = ADC_CHANNEL_0; // PA0

    sConfig.Rank = ADC_REGULAR_RANK_1;

    HAL_ADC_ConfigChannel(&hadc1, &sConfig);

    }

    // ================= PWM =================

    void MX_TIM3_Init(void)

    {

    __HAL_RCC_TIM3_CLK_ENABLE(); // Aktifkan clock timer

    htim3.Instance = TIM3;

    htim3.Init.Prescaler = 64; // Pembagi clock

    htim3.Init.Period = 1000; // Resolusi PWM

    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;

    HAL_TIM_PWM_Init(&htim3);

    TIM_OC_InitTypeDef sConfigOC = {0};

    sConfigOC.OCMode = TIM_OCMODE_PWM1; // Mode PWM

    sConfigOC.Pulse = 0; // Awal mati

    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) // Jika tombol ditekan

    {

    emergency_mode = !emergency_mode; // Toggle mode darurat

    }

    }

    // ================= HELPER =================

    uint16_t read_LDR(void)

    {

    HAL_ADC_Start(&hadc1); // Mulai ADC

    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); // Tunggu selesai

    return HAL_ADC_GetValue(&hadc1); // Ambil nilai

    }

    void set_LED(uint16_t value)

    {

    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, value); // Set PWM

    }

    // ================= MAIN =================

    int main(void)

    {

    HAL_Init(); // Inisialisasi HAL

    SystemClock_Config(); // Setup clock

    MX_GPIO_Init(); // Setup GPIO

    MX_ADC1_Init(); // Setup ADC

    MX_TIM3_Init(); // Setup PWM

    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // Start PWM

    while (1)

    {

    // ===== FALLBACK BUTTON =====

    uint8_t current_button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1); // Baca tombol

    if (last_button_state == 1 && current_button == 0) // Deteksi tekan

    {

    emergency_mode = !emergency_mode; // Toggle

    HAL_Delay(50); // Debounce

    }

    last_button_state = current_button;

    // ===== MODE DARURAT =====

    if (emergency_mode)

    {

    set_LED(LED_OFF); // Paksa LED mati

    continue;

    }

    // ===== BACA SENSOR =====

    uint16_t ldr = read_LDR(); // Baca LDR

    uint8_t pir = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1); // Baca PIR

    // ===== LOGIKA UTAMA =====

    if (ldr < LDR_THRESHOLD) // KONDISI TERANG

    {

    if (pir == GPIO_PIN_SET)

    {

    // ADA GERAKAN → LED MATI

    set_LED(LED_OFF);

    }

    else

    {

    // TIDAK ADA GERAKAN → LED MENYALA

    set_LED(LED_FULL);

    }

    }

    else // KONDISI GELAP

    {

    // LED MATI (sesuai permintaan percobaan)

    set_LED(LED_OFF);

    }

    HAL_Delay(100); // Delay loop

    }

    }

5. Video Demo [Kembali]



6. Kondisi [Kembali]

M2 P4 K4: Buatlah rangkaian seperti pada gambar percobaan 4 dengan kondisi ketika LDR mendeteksi cahaya terang, PIR mendeteksi ada gerakan orang lewat, maka LED akan mati selama ada gerakan dan kembali menyala.

7. Video Simulasi [Kembali]


                                      

8. Download File [Kembali]

  • Rangkaian Simulasi [Klik]
  • Video Simulasi [Klik]





 

Komentar