LAPORAN AKHIR



1. Prosedur [kembali]

  1. Buka aplikasi STM32CubeIDE lalu pilih open projects
  2. Setelah itu masukkan file projects sesuai dengan gambar rangkaian di modul
  3. Atur ioc sesuai arahan dari asisten
  4. Masukan program main.c dan main.h
  5. Hubungkan laptop dengan rangkaian yang telah dirangkai
  6. Selesai

2. Hardware dan Diagram Blok [kembali]

  • Hardware 

        a) Mikrokontroler STM32 NUCLEO-G474RE


         b) OLED

         c) Motor Servo


         d) Resistor



         e) Infrared Sensor

        
        f) Breadboard 

         g) Jamper

3. Rangkaian Simulasi dan Prinsip Kerja [kembali]



Prinsip Kerja:
Sistem parkir otomatis bekerja menggunakan dua board Nucleo sebagai master dan slave yang saling berkomunikasi melalui UART. Sistem bekerja dengan memanfaatkan sensor IR untuk mendeteksi kendaraan yang masuk dan keluar area parkir. Saat kendaraan masuk terdeteksi oleh sensor pada Nucleo master, servo akan membuka palang masuk secara otomatis dan jumlah slot parkir pada OLED akan berkurang. Sebaliknya, ketika kendaraan keluar terdeteksi oleh sensor pada Nucleo slave, servo palang keluar akan terbuka dan data dikirim ke master sehingga jumlah slot parkir kembali bertambah. Sistem ini memungkinkan pemantauan kapasitas parkir secara otomatis, real-time, dan lebih efisien tanpa perlu pencatatan manual.

4. Flowchart dan Listing Program [kembali]

  • Flowchart
  • Listing Program

Nucleo 1 (Master/pintu masuk)

#include "main.h"

#define SSD1306_INCLUDE_FONT_7x10

#include "ssd1306.h"

#include "ssd1306_fonts.h"

#include <stdio.h>

#include <string.h>

#define MAX_PARKIR 10

COM_InitTypeDef BspCOMInit;

I2C_HandleTypeDef hi2c1;

TIM_HandleTypeDef htim2;

UART_HandleTypeDef huart1;

UART_HandleTypeDef huart2;


uint8_t sisa_parkir = MAX_PARKIR;

uint8_t kendaraan_masuk = 0;

uint8_t uart_rx_buffer[1];


void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_I2C1_Init(void);

static void MX_TIM2_Init(void);

static void MX_USART1_UART_Init(void);

static void MX_USART2_UART_Init(void);


void Update_Display(void);

void Servo_Buka(void);

void Servo_Tutup(void);


int main(void)

{

    HAL_Init();

    SystemClock_Config();


    MX_GPIO_Init();

    MX_I2C1_Init();

    MX_TIM2_Init();

    MX_USART1_UART_Init();

    MX_USART2_UART_Init();


    BSP_LED_Init(LED_GREEN);

    BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI);


    BspCOMInit.BaudRate = 115200;

    BspCOMInit.WordLength = COM_WORDLENGTH_8B;

    BspCOMInit.StopBits = COM_STOPBITS_1;

    BspCOMInit.Parity = COM_PARITY_NONE;

    BspCOMInit.HwFlowCtl = COM_HWCONTROL_NONE;


    if (BSP_COM_Init(COM1, &BspCOMInit) != BSP_ERROR_NONE) {

        Error_Handler();

    }


    ssd1306_Init();


    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

    htim2.Instance->CCR1 = 1000;


    HAL_UART_Receive_IT(&huart1, uart_rx_buffer, 1);


    printf("=== MASTER PARKING READY ===\r\n");

    printf("Slot tersedia: %d/%d\r\n", sisa_parkir, MAX_PARKIR);


    Update_Display();


    while (1)

    {

        uint8_t ir = !HAL_GPIO_ReadPin(MASTER_IR_SENSOR_GPIO_Port,

                                       MASTER_IR_SENSOR_Pin);


        printf("IR: %d | Sisa: %d\r\n", ir, sisa_parkir);


        if (ir && sisa_parkir > 0 && !kendaraan_masuk) {

            HAL_Delay(50);


            ir = !HAL_GPIO_ReadPin(MASTER_IR_SENSOR_GPIO_Port,

                                   MASTER_IR_SENSOR_Pin);


            if (ir) {

                Servo_Buka();


                sisa_parkir--;

                kendaraan_masuk = 1;


                Update_Display();


                printf(">> MASUK! Sisa: %d/%d\r\n", sisa_parkir, MAX_PARKIR);


                HAL_UART_Transmit(&huart1, (uint8_t *)"M", 1, 100);

            }

        }


        if (ir && sisa_parkir == 0 && !kendaraan_masuk) {

            printf(">> PARKIR PENUH!\r\n");

            BSP_LED_Toggle(LED_GREEN);

            HAL_Delay(200);

        }


        if (!ir && kendaraan_masuk) {

            HAL_Delay(50);


            ir = !HAL_GPIO_ReadPin(MASTER_IR_SENSOR_GPIO_Port,

                                   MASTER_IR_SENSOR_Pin);


            if (!ir) {

                Servo_Tutup();

                kendaraan_masuk = 0;

                printf(">> Palang ditutup\r\n");

            }

        }


        HAL_Delay(100);

    }

}


void Update_Display(void)

{

    char buf[25];


    ssd1306_Fill(Black);


    ssd1306_SetCursor(2, 0);

    ssd1306_WriteString("SISTEM PARKIR", Font_7x10, White);


    ssd1306_SetCursor(2, 14);

    sprintf(buf, "Slot: %d/%d", sisa_parkir, MAX_PARKIR);

    ssd1306_WriteString(buf, Font_7x10, White);


    ssd1306_SetCursor(2, 28);


    if (sisa_parkir == 0) {

        ssd1306_WriteString(">> PENUH <<", Font_7x10, White);

    } else {

        ssd1306_WriteString(">> TERSEDIA <<", Font_7x10, White);

    }


    ssd1306_UpdateScreen();

}


void Servo_Buka(void)

{

    htim2.Instance->CCR1 = 2000;

    HAL_Delay(600);

}


void Servo_Tutup(void)

{

    htim2.Instance->CCR1 = 1000;

    HAL_Delay(600);

}


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

    if (huart->Instance == USART1) {

        if (uart_rx_buffer[0] == 'K') {

            if (sisa_parkir < MAX_PARKIR) {

                sisa_parkir++;

            }


            printf(">> KENDARAAN KELUAR DARI SLAVE\r\n");

            printf(">> Sisa: %d/%d\r\n", sisa_parkir, MAX_PARKIR);


            Update_Display();

        }


        HAL_UART_Receive_IT(&huart1, uart_rx_buffer, 1);

    }

}


void Error_Handler(void)

{

    __disable_irq();

    while (1) {}

}


#ifdef USE_FULL_ASSERT

void assert_failed(uint8_t *file, uint32_t line)

{

}

#endif

Nucleo 2 (Slave/pintu keluar)

#include "main.h"

#include <stdio.h>

#include <string.h>


COM_InitTypeDef BspCOMInit;

TIM_HandleTypeDef htim2;

UART_HandleTypeDef huart1;

UART_HandleTypeDef huart2;


uint8_t kendaraan_keluar = 0;

uint8_t uart_rx_buffer[1];


void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_TIM2_Init(void);

static void MX_USART1_UART_Init(void);

static void MX_USART2_UART_Init(void);


void Servo_Buka(void);

void Servo_Tutup(void);


int main(void)

{

    HAL_Init();

    SystemClock_Config();


    MX_GPIO_Init();

    MX_TIM2_Init();

    MX_USART1_UART_Init();

    MX_USART2_UART_Init();


    BSP_LED_Init(LED_GREEN);

    BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI);


    BspCOMInit.BaudRate = 115200;

    BspCOMInit.WordLength = COM_WORDLENGTH_8B;

    BspCOMInit.StopBits = COM_STOPBITS_1;

    BspCOMInit.Parity = COM_PARITY_NONE;

    BspCOMInit.HwFlowCtl = COM_HWCONTROL_NONE;


    if (BSP_COM_Init(COM1, &BspCOMInit) != BSP_ERROR_NONE) {

        Error_Handler();

    }


    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

    htim2.Instance->CCR1 = 1000;


    HAL_UART_Receive_IT(&huart1, uart_rx_buffer, 1);


    HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);


    printf("=== SLAVE READY - Pintu Keluar ===\r\n");


    while (1)

    {

        uint8_t ir = !HAL_GPIO_ReadPin(SLAVE_IR_SENSOR_GPIO_Port,

                                       SLAVE_IR_SENSOR_Pin);


        printf("IR: %d\r\n", ir);


        if (ir && !kendaraan_keluar) {

            HAL_Delay(50);


            ir = !HAL_GPIO_ReadPin(SLAVE_IR_SENSOR_GPIO_Port,

                                   SLAVE_IR_SENSOR_Pin);


            if (ir) {

                Servo_Buka();


                kendaraan_keluar = 1;


                HAL_UART_Transmit(&huart1, (uint8_t *)"K", 1, 100);


                HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,

                                  LED_GREEN_Pin,

                                  GPIO_PIN_SET);


                printf(">> KELUAR! Kuota +1 dikirim ke master\r\n");

            }

        }


        if (!ir && kendaraan_keluar) {

            HAL_Delay(50);


            ir = !HAL_GPIO_ReadPin(SLAVE_IR_SENSOR_GPIO_Port,

                                   SLAVE_IR_SENSOR_Pin);


            if (!ir) {

                Servo_Tutup();


                kendaraan_keluar = 0;


                HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,

                                  LED_GREEN_Pin,

                                  GPIO_PIN_RESET);


                printf(">> Palang ditutup, siap kendaraan berikutnya\r\n");

            }

        }


        HAL_Delay(100);

    }

}


void Servo_Buka(void)

{

    htim2.Instance->CCR1 = 2000;

    HAL_Delay(600);

}


void Servo_Tutup(void)

{

    htim2.Instance->CCR1 = 1000;

    HAL_Delay(600);

}


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

    if (huart->Instance == USART1) {

        if (uart_rx_buffer[0] == 'M') {

            printf(">> INFO: KENDARAAN MASUK DARI MASTER\r\n");

        }


        HAL_UART_Receive_IT(&huart1, uart_rx_buffer, 1);

    }

}


void Error_Handler(void)

{

    __disable_irq();

    while (1) {}

}


#ifdef USE_FULL_ASSERT

void assert_failed(uint8_t *file, uint32_t line)

{

}

#endif

5. Video Demo [kembali]


Video Demo Percobaan 4

6. Analisa [kembali]



7. Download File [kembali]

Komentar

Postingan populer dari blog ini

2.12 Voltage-Multiplier Circuits

Tugas Besar - Pengamanan ATM

Modul 1- Potensiometer & Tahanan Geser dan Jembatan Wheatstone