Tugas Pendahuluan 2

TUGAS PENDAHULUAN 2 M2P4K10




1. Prosedur [kembali]

  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 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 bekerja sebagai sistem lampu otomatis berbasis sensor cahaya dan sensor gerak menggunakan STM32 NUCLEO-C031C6. Prinsip kerja sistem dimulai dengan pembacaan intensitas cahaya oleh sensor LDR melalui ADC pada mikrokontroler. LDR memiliki prioritas utama dalam menentukan kondisi sistem, yaitu apakah lingkungan berada dalam kondisi terang atau gelap. Ketika LDR mendeteksi cahaya terang, maka program akan mematikan LED sepenuhnya menggunakan PWM, sehingga lampu tidak akan menyala walaupun sensor PIR mendeteksi adanya gerakan. Dengan kata lain, pada kondisi terang sensor PIR diabaikan karena pencahayaan ruangan sudah dianggap cukup. Namun saat kondisi gelap, PIR mulai aktif untuk mendeteksi pergerakan. Jika terdapat gerakan, LED akan menyala terang penuh, sedangkan apabila tidak ada gerakan selama beberapa detik maka LED akan berubah menjadi redup. Sistem ini dirancang untuk meningkatkan efisiensi energi karena lampu hanya aktif saat lingkungan gelap dan terdapat aktivitas manusia.

4. Flowchart dan Listing Program [kembali]

  • Flowchart





  • Listing Program
#include "main.h"

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

// =====================================================
// VARIABEL GLOBAL
// =====================================================
volatile uint8_t mode_darurat = 0;

uint32_t waktu_gerakan_terakhir = 0;

// backup pembacaan tombol
uint8_t status_tombol_lama = 1;

// =====================================================
// KONSTANTA SISTEM
// =====================================================
#define BATAS_LDR        2000
#define DELAY_GERAKAN    5000

#define PWM_MATI         0
#define PWM_REDUP        100
#define PWM_TERANG       1000

// =====================================================
// KONFIGURASI 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
    );
}

// =====================================================
// INISIALISASI GPIO
// =====================================================
void MX_GPIO_Init(void)
{
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // PIR SENSOR -> PA1
    GPIO_InitStruct.Pin = GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    // PUSH BUTTON -> PB1
    GPIO_InitStruct.Pin = GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
    GPIO_InitStruct.Pull = GPIO_PULLUP;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    // OUTPUT PWM LED -> 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);

    // AKTIFKAN INTERRUPT
    HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
}

// =====================================================
// INISIALISASI 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
    );
}

// =====================================================
// INISIALISASI PWM TIMER3
// =====================================================
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
    );
}

// =====================================================
// CALLBACK INTERRUPT BUTTON
// =====================================================
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == GPIO_PIN_1)
    {
        mode_darurat = !mode_darurat;
    }
}

// =====================================================
// MEMBACA NILAI LDR
// =====================================================
uint16_t baca_LDR(void)
{
    HAL_ADC_Start(&hadc1);

    HAL_ADC_PollForConversion(
        &hadc1,
        HAL_MAX_DELAY
    );

    return HAL_ADC_GetValue(&hadc1);
}

// =====================================================
// MENGATUR PWM LED
// =====================================================
void atur_LED(uint16_t pwm)
{
    __HAL_TIM_SET_COMPARE(
        &htim3,
        TIM_CHANNEL_1,
        pwm
    );
}

// =====================================================
// PROGRAM UTAMA
// =====================================================
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)
    {
        // =========================================
        // PEMBACAAN TOMBOL MANUAL
        // =========================================
        uint8_t tombol_sekarang =
            HAL_GPIO_ReadPin(
                GPIOB,
                GPIO_PIN_1
            );

        if (status_tombol_lama == 1 &&
            tombol_sekarang == 0)
        {
            mode_darurat =
                !mode_darurat;

            HAL_Delay(50);
        }

        status_tombol_lama =
            tombol_sekarang;

        // =========================================
        // MODE DARURAT
        // =========================================
        if (mode_darurat)
        {
            atur_LED(PWM_MATI);
            continue;
        }

        // =========================================
        // BACA SENSOR
        // =========================================
        uint16_t nilai_ldr =
            baca_LDR();

        uint8_t status_pir =
            HAL_GPIO_ReadPin(
                GPIOA,
                GPIO_PIN_1
            );

        // =========================================
        // KONDISI TERANG
        // =========================================
        if (nilai_ldr < BATAS_LDR)
        {
            atur_LED(PWM_MATI);

            waktu_gerakan_terakhir =
                HAL_GetTick() -
                DELAY_GERAKAN;
        }
        else
        {
            // =====================================
            // KONDISI GELAP
            // =====================================
            if (status_pir == GPIO_PIN_SET)
            {
                waktu_gerakan_terakhir =
                    HAL_GetTick();
            }

            if ((HAL_GetTick() -
                 waktu_gerakan_terakhir)
                 < DELAY_GERAKAN)
            {
                atur_LED(PWM_TERANG);
            }
            else
            {
                atur_LED(PWM_REDUP);
            }
        }

        HAL_Delay(100);
    }
}

5. Video Demo [kembali]

6. Kondisi [kembali]

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.

7. Video Simulasi [kembali]



8. Download File [kembali]

Rangkaian Simulasi [Klik] 

Download Datasheet Pir Sensor (klik disini)

Download Datasheet Resistor (klik disini)

Download Datasheet LED (klik disini)

Download Datasheet STM32 Nucleo G474RE [Klik Disini]

Download Datasheet LDR Sensor  [Klik Disini]

Download Datasheet Push Button [Klik Disini]

Komentar

Postingan populer dari blog ini

Tugas Besar