Judul :
Automatic Bottle Filler
Tujuan :
- - Mampu menyusun user requirement untuk sebuah fungsi
pengisi minuman dalam botol,
- - Mampu melakukan identifikasi unit input dan output
pada alamat PORT sesuai konfigurasi pada board
- - Mampu menyusun, menjalankan dan melakukan debugging
program sesuai dengan permasalahan berbasis Bahasa pemrograman C
dengan menggunakan Keil uVisonAlat : Personal Computer, modul MCU, PCB Modul, kabel USB,
ST Link downloader
A.Problem :
Akan dibuat sebuah sistem untuk mengisi botol dengan bahan minuman
secara otomatis berdasar lama waktu buka katup solenoid [SV] jika tombol start
ditekan, dengan syarat ada botol yang menyentuh sensor botol [SB] dan bahan
cairanminuman tidak kosong pada reservoir atas dengan melihat sensor level
[SL]. Katup SV
tidak membuka untuk mengisi botol jika tidak ada botol dan cairan habis dan
belum ditekan tombol start. Saat botol diletakkan pada meja dan menyentuh
SB maka lampu ready menyala, dan saat katup membuka untuk mengisi
cairan ke botol maka lampu fill menyala dan saat reservoir atas tidak ada cairan
maka sistem berhenti dan lampu empty menyala.
1. Plant Layout:
SB (sensor botol) dan SL (sensor
Level) = ON, maka SV (katup) bisa buka. Saat SB ready led menyala, saat SL
menyalakan lampu fill cairan mengisi ke botol dan saat SL kosong lampu empty
menyala.
B. User Requirement
- Pada saat sensor botol
bekerja, LED menyala . saat Sensor Level bekerja, Lampu fill menyala. System
siap digunakan SV bisa dibuka dan bisa mengisi botol
- Pada saat sensor botol dan
sensor level tidak bekerja SV tidak buka (tutup)
- Kemudian ketika tangki air
kosong yaitu ditandai dengan lampu empty menyala
|
|
|
|
PB9
|
PA8
|
PB7
|
PB6
|
Ready
|
fill
|
close
|
empty
|
STM32F103C8
|
D. I/O Table
Input
No
|
Device
|
Address
|
note
|
1
|
Sensor botol
|
PA4
|
Mengetahui kondisi botol
|
2
|
Sensor level
|
PA5
|
Mengetahui kondisi cairan
pada wadah
|
3
|
otomatis
|
PA6
|
Cairan berjalan secara
otomatis menuju botol
|
4
|
Push button
Reset
|
PA3
|
Mereset ulang atau
terdapat botol lain yang mau diisi
|
5
|
Push button
start
|
PA1
|
Mengisi dan memulai air ke
botol secara manual
|
6
|
Push button
stop
|
PA2
|
Memberhentikan air yang
menuju ke botol
|
Output
no
|
Device
|
address
|
note
|
1
|
LED Ready
|
PB9
|
- Akan
menyala apabila saat SB dan SL memenuhi syarat atau
berlogic = 1
- Akan mati
apabila tidak memenuhi syarat SB dan SL yaitu berlogic = 1
|
2
|
LED Fill
|
PB8
|
- Akan
menyala apabila saat push button Start dan otomatis
berlogic 1
|
3
|
LED Close
|
PB7
|
- Akan
menyala apabila saat push button stop berlogic 1
|
4
|
LED Empty
|
PB6
|
- Akan
menyala apabila SB dan SL tidak memenuhi syarat
|
F. Flowchart
G. Source Code
#include "main.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
/* USER CODE BEGIN 1 */
int SB,SL,SV,start,stop,otomatis,reset;
/* USER CODE END 1 */
/* MCU
Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the
Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
if (HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)&&HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5))
{ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,
GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,
GPIO_PIN_RESET);
SV = 1;
if (HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6))
{ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,
GPIO_PIN_SET);
HAL_Delay(5000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,
GPIO_PIN_RESET);
}
if (HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1))
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8, GPIO_PIN_SET);
if (HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2))
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
}
}
if
(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3))
{ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
}
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,
GPIO_PIN_RESET);
}
else
{ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,
GPIO_PIN_SET);
}
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType =
RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) !=
HAL_OK)
{
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(RELAY_GPIO_Port, RELAY_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, EMPTY_Pin|CLOSED_Pin|FILL_Pin|READY_Pin,
GPIO_PIN_RESET);
/*Configure GPIO pins : start_Pin stop_Pin SB_Pin SL_Pin
auto_Pin */
GPIO_InitStruct.Pin = start_Pin|stop_Pin|SB_Pin|SL_Pin
|auto_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : RELAY_Pin */
GPIO_InitStruct.Pin = RELAY_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(RELAY_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : EMPTY_Pin CLOSED_Pin FILL_Pin READY_Pin */
GPIO_InitStruct.Pin = EMPTY_Pin|CLOSED_Pin|FILL_Pin|READY_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void Error_Handler(void)
#ifdef
USE_FULL_ASSERT
void assert_failed(uint8_t *file,
uint32_t line)
H. running test procedure
1. pada saat portA4 && portA5 ditekan LED Ready menyala dan LED
empty (0)
2.Pada
saat portA6 (otomatis) ditekan LED fill menyala dengan delay 5s dan setelah itu
LED fill mati
3
pada saat push button portA1 (start) ditekan maka LED fill menyala dan pada
saat push button ditekan LED close nyala
4.
pada saat push button 3 (reset) ditekan maka LED fill dan close Mati
5. pada saat Sensor botol (SB) / portA4 atau portA5
ada yang tidak aktif maka
I.Integration
Result
Link Video on you tube
J. Excellence
of Design
Kelebihan pada sistem ini yaitu sistem
ini bisa menggunakan pengisian cairan secara otomatis dan
manual, yang mana otomatis bisa dilakukan tanpa menunngu air hanya dengan
menunggu air selama 5 second botol sudah terisi dengan air, jika terdapat botol
yang dengan ukuran yang lebih besar ataupun lebih kecil bisa menggunakan
pengisian secara manual yang mana diawali dengan start dan diakhiri dengan
stop, pada system ini juga ada tombol reset yang mana jika terjadi kesalahan
pengisian secara otomatis ataupun secara manual bisa tekan reset yang mana
system akan mengulang oada kondisi pemilihan otomatis ataupun manual.
K. Lack of Design
kekurangan pada sistem ini yaitu sistem ini bekerja tanpa melihat debit cairan yang ada
ditangki cairan.
L. Conclusion
Pada system ini sangat
berguna untuk seseorang mengisi botol baik secara otomais maupun secara manual.
No comments:
Post a Comment