TUGAS PENDAHULUAN 2

                                              [KEMBALI KE MENU SEBELUMNYA]



Tugas Pendahuluan 2 Modul 2
Percobaan 4 Kondisi 6

1. Prosedur
 [Kembali]
  • Rangkai semua komponen 
  • Buat program di website wokwi
  • Jalankan program dan cobakan sesuai kondisi

2. Hardware dan Diagram Blok [Kembali]

Hardware:

1. STM32 NUCLEO-G474RE




2. LED

3. Resistor



4. Push Button

5. Buzzer



6. Sensor LDR


7. Sensor PIR






Diagram Blok:


3. Rangkaian Simulasi Dan Prinsip Kerja [Kembali]

Rangkaian Simulasi :

Prinsip Kerja :

Rangkaian pada simulasi Wokwi ini menggunakan papan mikrokontroler STM32 Nucleo C031C6 sebagai pusat kendali, dengan sensor cahaya LDR (Light Dependent Resistor) dan sensor gerak PIR Sensor sebagai input, serta LED sebagai output.Mikrokontroler terus membaca nilai analog dari LDR untuk mengetahui intensitas cahaya lingkungan dan sinyal digital dari PIR untuk mendeteksi gerakan. Ketika LDR mendeteksi kondisi gelap (nilai resistansi tinggi sehingga tegangan yang dibaca menunjukkan cahaya rendah) dan pada saat yang sama PIR mendeteksi adanya gerakan (logika HIGH), mikrokontroler akan mengaktifkan LED dengan kecerahan maksimum, biasanya melalui sinyal PWM dengan duty cycle tinggi. LED tersebut akan tetap menyala sangat terang selama sekitar 5 detik sesuai dengan pengaturan waktu dalam program, kemudian mikrokontroler mematikan kembali LED jika tidak ada kondisi pemicu lanjutan, sehingga rangkaian bekerja sebagai sistem lampu otomatis berbasis gerakan yang hanya aktif saat gelap.


4. Flowchart dan Listing Program [Kembali]
Flowchart:


Listing Program:
#include "main.h"
#include <stdio.h>

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

// ================= VARIABLE =================
volatile uint8_t emergency_mode = 0;

uint32_t last_motion_time = 0;

uint8_t last_button_state = 1;

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

// ================= UART =================
void MX_USART2_UART_Init(void)
{
    __HAL_RCC_USART2_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // PA2 = TX
    GPIO_InitStruct.Pin =
        GPIO_PIN_2;

    GPIO_InitStruct.Mode =
        GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pull =
        GPIO_NOPULL;

    GPIO_InitStruct.Speed =
        GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate =
        GPIO_AF1_USART2;

    HAL_GPIO_Init(
        GPIOA,
        &GPIO_InitStruct
    );

    huart2.Instance =
        USART2;

    huart2.Init.BaudRate =
        115200;

    huart2.Init.WordLength =
        UART_WORDLENGTH_8B;

    huart2.Init.StopBits =
        UART_STOPBITS_1;

    huart2.Init.Parity =
        UART_PARITY_NONE;

    huart2.Init.Mode =
        UART_MODE_TX_RX;

    HAL_UART_Init(
        &huart2
    );
}

// Redirect printf ke UART
int __io_putchar(int ch)
{
    HAL_UART_Transmit(
        &huart2,
        (uint8_t *)&ch,
        1,
        HAL_MAX_DELAY
    );
    return ch;
}

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

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // PIR → 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_INPUT;

    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
    );
}

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

// ================= 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 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();
    MX_USART2_UART_Init();

    HAL_TIM_PWM_Start(
        &htim3,
        TIM_CHANNEL_1
    );

    printf("Sistem Monitoring LDR dan PIR Aktif\r\n");

    while (1)
    {
        // ===== BUTTON =====

        uint8_t current_button =
            HAL_GPIO_ReadPin(
                BUTTON_PORT,
                BUTTON_PIN
            );

        if (
            last_button_state == 1 &&
            current_button == 0
        )
        {
            emergency_mode =
                !emergency_mode;

            printf("Emergency Mode Toggle\r\n");

            HAL_Delay(50);
        }

        last_button_state =
            current_button;

        // ===== EMERGENCY MODE =====

        if (emergency_mode)
        {
            printf("Emergency Mode Aktif - LED Mati\r\n");

            set_LED(LED_OFF);

            HAL_Delay(500);

            continue;
        }

        uint16_t ldr =
            read_LDR();

        uint8_t pir =
            HAL_GPIO_ReadPin(
                PIR_PORT,
                PIR_PIN
            );

        printf("Nilai LDR: %d\r\n", ldr);

        // ===== GELAP =====

        if (ldr >= LDR_THRESHOLD)
        {
            printf("Kondisi Gelap\r\n");

            if (pir == GPIO_PIN_SET)
            {
                printf("Gerakan Terdeteksi\r\n");

                last_motion_time =
                    HAL_GetTick();

                set_LED(LED_FULL);

                printf("LED Menyala Sangat Terang Selama 5 Detik\r\n");
            }

            if (
                HAL_GetTick() -
                last_motion_time
                >= MOTION_TIMEOUT
            )
            {
                set_LED(LED_OFF);

                printf("LED Mati Kembali\r\n");
            }
        }

        else
        {
            printf("Kondisi Terang - LED Mati\r\n");

            set_LED(LED_OFF);
        }

        HAL_Delay(1000);
    }
}                                                                                                                                                                 

5. Kondisi [Kembali]

Buatlah rangkaian seperti pada gambar percobaan 4 dengan kondisi ketika LDR mendeteksi kondisi gelap dan PIR mendeteksi adanya gerakan, maka LED menyala sangat terang selama 5 detik lalu kembali mati,

6. Video Simulasi [Kembali]

Percobaan 4 kondisi 6


7. Link Download [Kembali]











Tidak ada komentar:

Posting Komentar

                                            BAHAN PRESENTASI UNTUK MATA KULIAH  ELEKTRONIKA 2024   Nama : Muhammad Fadhil Dwi Kesuma NIM : 2...