LAPORAN AKHIR
1. Prosedur [kembali]
- Buka aplikasi STM32CubeIDE lalu pilih open projects
- Setelah itu masukkan file projects sesuai dengan gambar rangkaian di modul
- Atur ioc sesuai arahan dari asisten
- Masukan program main.c dan main.h
- Hubungkan laptop dengan rangkaian yang telah dirangkai
- Selesai
2. Hardware dan Diagram Blok [kembali]
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
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]
6. Analisa [kembali]
- Download Video Demo (klik disini)
- Datasheet Mikrokontroler STM32 NUCLEO (klik disini)
- Download Datasheet Resistor (klik disini)
- Download Datasheet LED (klik disini)
.jpg)
.jpg)

Komentar
Posting Komentar