Belajar mikrokontroller Automatic Bottle dengan menggunakan STM32F1 sangat mudah yiippppiiii...


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

Pages