TP 2

Tugas Pendahuluan 1




 

1. Prosedur [kembali]

  • Menyiapkan alat dan bahan.
  • Merangkai komponen pada breadboard sesuai dengan gambar rangkaian percobaan.
  • Menghubungkan masing masing pin input output.
  • Mengunggah program menggunakan ST-LINK ke mikrokontroler.
  • Jalankan Rangkaian

2. Hardware dan Blok Diagram [kembali]

  • STM32 Nucleo G474RE
  • LED
  • LDR Sensor
  • PIR Sensor
  • Push Button
  • Breadboard
  • Jumper
  • Resistor 
 3. Rangkaian Simulasi dan Prinsip Kerja [kembali]


Prinsip Kerja :

Rangkaian ini bekerja sebagai sistem pendeteksi gerakan dan cahaya menggunakan board STMicroelectronics STM32 Nucleo C031C6 sebagai pengendali utama. Sensor PIR di bagian atas digunakan untuk mendeteksi adanya gerakan manusia berdasarkan perubahan radiasi inframerah, kemudian sinyal keluarannya dikirim ke pin input mikrokontroler. Di sisi kiri terdapat modul sensor cahaya/LDR yang mendeteksi intensitas cahaya lingkungan dan mengubahnya menjadi sinyal analog/digital ke STM32. Data dari kedua sensor diproses oleh mikrokontroler untuk menentukan kondisi output. Jika kondisi tertentu terpenuhi, misalnya terdeteksi gerakan atau cahaya di bawah ambang tertentu, maka LED akan menyala sebagai indikator. Tombol push button digunakan sebagai input manual, misalnya untuk mengaktifkan, menonaktifkan, atau mengubah mode sistem. Semua komponen mendapat suplai VCC dan terhubung ke ground bersama sehingga rangkaian dapat bekerja sebagai sistem monitoring otomatis berbasis sensor.

4. Flowchart dan Listing Program [kembali]

Main.c

#include "main.h"

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

ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;

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

volatile uint8_t emergency_mode = 0;
uint32_t last_motion_time = 0;

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

#define LDR_THRESHOLD     2000
#define MOTION_TIMEOUT    5000

#define LED_OFF           0
#define LED_FULL          1000

// ======================================================
// SYSTEM CLOCK
// ======================================================

void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    // HSI ON
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

    HAL_RCC_OscConfig(&RCC_OscInitStruct);

    // CLOCK CONFIG
    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;

    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
}

// ======================================================
// GPIO INIT
// ======================================================

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 = PIR_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(PIR_PORT, &GPIO_InitStruct);

    // ==================================================
    // BUTTON (PB1)
    // ==================================================

    GPIO_InitStruct.Pin = BUTTON_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
    GPIO_InitStruct.Pull = GPIO_PULLUP;

    HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);

    // ==================================================
    // LED PWM (PA6)
    // ==================================================

    GPIO_InitStruct.Pin = LED_PIN;
    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(LED_PORT, &GPIO_InitStruct);

    // ==================================================
    // INTERRUPT
    // ==================================================

    HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
}

// ======================================================
// ADC INIT
// ======================================================

void MX_ADC1_Init(void)
{
    __HAL_RCC_ADC_CLK_ENABLE();

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

    HAL_ADC_Init(&hadc1);

    ADC_ChannelConfTypeDef sConfig = {0};

    sConfig.Channel = ADC_CHANNEL_0;
    sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
    sConfig.SamplingTime = ADC_SAMPLETIME_39CYCLES_5;

    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

// ======================================================
// TIM3 PWM INIT
// ======================================================

void MX_TIM3_Init(void)
{
    __HAL_RCC_TIM3_CLK_ENABLE();

    htim3.Instance = TIM3;
    htim3.Init.Prescaler = 15;
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 1000;
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

    HAL_TIM_PWM_Init(&htim3);

    TIM_OC_InitTypeDef sConfigOC = {0};

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

    HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}

// ======================================================
// INTERRUPT CALLBACK
// ======================================================

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == BUTTON_PIN)
    {
        emergency_mode = !emergency_mode;
    }
}

// ======================================================
// READ LDR
// ======================================================

uint16_t read_LDR(void)
{
    HAL_ADC_Start(&hadc1);

    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);

    return HAL_ADC_GetValue(&hadc1);
}

// ======================================================
// SET LED BRIGHTNESS
// ======================================================

void set_LED(uint16_t value)
{
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, value);
}

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

int main(void)
{
    HAL_Init();

    SystemClock_Config();

    MX_GPIO_Init();
    MX_ADC1_Init();
    MX_TIM3_Init();

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

    while (1)
    {
        // ==============================================
        // MODE DARURAT
        // ==============================================

        if (emergency_mode)
        {
            set_LED(LED_OFF);

            HAL_Delay(100);

            continue;
        }

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

        uint16_t ldr_value = read_LDR();

        uint8_t pir_state =
            HAL_GPIO_ReadPin(PIR_PORT, PIR_PIN);

        // ==============================================
        // KONDISI GELAP
        // ==============================================

        if (ldr_value > LDR_THRESHOLD)
        {
            // ==========================================
            // PIR MENDETEKSI GERAKAN
            // ==========================================

            if (pir_state == GPIO_PIN_SET)
            {
                last_motion_time = HAL_GetTick();
            }

            // ==========================================
            // LED MENYALA 5 DETIK
            // ==========================================

            if ((HAL_GetTick() - last_motion_time)
                 < MOTION_TIMEOUT)
            {
                set_LED(LED_FULL);
            }
            else
            {
                set_LED(LED_OFF);
            }
        }
        else
        {
            // ==========================================
            // KONDISI TERANG
            // ==========================================

            set_LED(LED_OFF);
        }

        HAL_Delay(100);
    }
}

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
// PIR SENSOR
#define PIR_PORT GPIOA
#define PIR_PIN GPIO_PIN_1 // PA1
// PUSH BUTTON (INTERRUPT)
#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)
// ================= 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]

Percobaan 4 kondisi 2
Buatlah rangkaian seperti pada gambar percobaan 4 dengan keadaan LDR mendeteksi gelap dan PIR mendeteksi adanya gerakan, maka lampu jalan menyala terang selama beberapa detik lalu kembali mati

7. Video Simulasi [kembali]



8. Download File [kembali]
Download Rangkaian (klik disini) 
Download Datasheet Touch Sensor (klik disini)
Download Datasheet Infrared Sensor (klik disini)
Download Datasheet Resistor (klik disini)
Download Datasheet LED (klik disini)
Download Datasheet Buzzer (klik disini)









Komentar

Postingan populer dari blog ini