Bagian Bang Nugi

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 10

Gambar 1 Alat pendeteksi banjir dengan Ultrasonic

1. Task dan Scheduling

Tabel 5.1 Task


Task Keterangan Prioritas
1 Sensor Ultrasonic Real time
Membaca Jarak
2 LCD Menampilkan Real time
Jarak
3 Buzzer Berbunyi Saat Real time
Jarak Ketinggian Air
Berada Di level Banjir
4 Push Button High
Menginterupsi Buzzer
Agar Berhenti

Tabel 5.2 Port


No Komponen Port Pada Port Pada STM32
Komponen
1 HCSR-04 VCC 5V
GND GND
TRIG A2
ECHO A1
2 I2C LCD VCC 5V
GND GND
SCL B6
SDA B7
3 BUZZER VCC 5V
GND GND
I/O B5
4 BUTTON I/O B4
VCC 5V
GND GND
LAMPIRAN

A. Aktifitas Anggota Kelompok


Nama Pembagian Kerja
Juli Faer
Nugraha Triokta Putra Ulil Amri Merangkai dan memprogram alat kemudian
mengimplementasikan
Siti Andari

B. Link Video Presentasi Implementasi Sistem

Kode /* USER CODE BEGIN Header */


Progra /**
m
Main. ************************************************************
c ******************
* @file : main.c
* @brief : Main program body

************************************************************
******************
* @attention
*
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause
license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*

************************************************************
******************
*/
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "tim.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/


/* USER CODE BEGIN Includes */
#include "i2c-lcd.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/


/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/


/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/


/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/


void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/


/* USER CODE BEGIN 0 */

/****** microsecond delay using TIMER1


* timer is running at 72MHz **********/
void delay (uint32_t us)
{
__HAL_TIM_SET_COUNTER(&htim1, 0);
while ((__HAL_TIM_GET_COUNTER(&htim1))<us);
}

/************** PIN DEFINITION **************/


#define Trig_Pin GPIO_PIN_1
#define Trig_Port GPIOA
#define Echo_Pin GPIO_PIN_2
#define Echo_Port GPIOA

uint32_t local_time, sensor_time;


uint32_t distance;
uint32_t hcsr04_read (void)
{
local_time=0;
HAL_GPIO_WritePin(Trig_Port, Trig_Pin,
GPIO_PIN_RESET); // pull the TRIG pin HIGH
delay(2); // wait for 2 us

HAL_GPIO_WritePin(Trig_Port, Trig_Pin, GPIO_PIN_SET); //


pull the TRIG pin HIGH
delay(10); // wait for 10 us
HAL_GPIO_WritePin(Trig_Port, Trig_Pin,
GPIO_PIN_RESET); // pull the TRIG pin low

// read the time for which the pin is high

while (!(HAL_GPIO_ReadPin(Echo_Port, Echo_Pin))); // wait for


the ECHO pin to go high
while (HAL_GPIO_ReadPin(Echo_Port, Echo_Pin)) // while the
pin is high
{
local_time++; // measure time for which the pin is high
delay (1);
}
return local_time;
}

/* USER CODE END 0 */

/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */

/* 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();
MX_I2C1_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */

HAL_TIM_Base_Start(&htim1);

lcd_init();

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

sensor_time = hcsr04_read();
distance = sensor_time * .034/2;

lcd_send_cmd(0x80);
lcd_send_string("T AIR ");
lcd_send_data((distance/100)+48); // 100 position
lcd_send_data(((distance%100)/10)+48); // 10 position
lcd_send_data((distance%10)+48); // 1 position

HAL_Delay(200);
}
/* USER CODE END 3 */
}

/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** Initializes the CPU, AHB and APB busses clocks


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

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return
state */

/* USER CODE END Error_Handler_Debug */


}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line
number,
tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line)
*/
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END


OF FILE****/
Kode
Progra /** Put this in the src folder **/
m i2c-
lcd.c #include "i2c-lcd.h"
extern I2C_HandleTypeDef hi2c1; // change your handler here
accordingly

#define SLAVE_ADDRESS_LCD 0x4E // change this according to ur


setup

void lcd_send_cmd (char cmd)


{
char data_u, data_l;
uint8_t data_t[4];
data_u = (cmd&0xf0);
data_l = ((cmd<<4)&0xf0);
data_t[0] = data_u|0x0C; //en=1, rs=0
data_t[1] = data_u|0x08; //en=0, rs=0
data_t[2] = data_l|0x0C; //en=1, rs=0
data_t[3] = data_l|0x08; //en=0, rs=0
HAL_I2C_Master_Transmit (&hi2c1, SLAVE_ADDRESS_LCD,
(uint8_t *) data_t, 4, 100);
}

void lcd_send_data (char data)


{
char data_u, data_l;
uint8_t data_t[4];
data_u = (data&0xf0);
data_l = ((data<<4)&0xf0);
data_t[0] = data_u|0x0D; //en=1, rs=0
data_t[1] = data_u|0x09; //en=0, rs=0
data_t[2] = data_l|0x0D; //en=1, rs=0
data_t[3] = data_l|0x09; //en=0, rs=0
HAL_I2C_Master_Transmit (&hi2c1, SLAVE_ADDRESS_LCD,
(uint8_t *) data_t, 4, 100);
}

void lcd_clear (void)


{
lcd_send_cmd (0x80);
for (int i=0; i<70; i++)
{
lcd_send_data (' ');
}
}

void lcd_put_cur(int row, int col)


{
switch (row)
{
case 0:
col |= 0x80;
break;
case 1:
col |= 0xC0;
break;
}

lcd_send_cmd (col);
}

void lcd_init (void)


{
// 4 bit initialisation
HAL_Delay(50); // wait for >40ms
lcd_send_cmd (0x30);
HAL_Delay(5); // wait for >4.1ms
lcd_send_cmd (0x30);
HAL_Delay(1); // wait for >100us
lcd_send_cmd (0x30);
HAL_Delay(10);
lcd_send_cmd (0x20); // 4bit mode
HAL_Delay(10);

// dislay initialisation
lcd_send_cmd (0x28); // Function set --> DL=0 (4 bit mode), N = 1
(2 line display) F = 0 (5x8 characters)
HAL_Delay(1);
lcd_send_cmd (0x08); //Display on/off control --> D=0,C=0, B=0
---> display off
HAL_Delay(1);
lcd_send_cmd (0x01); // clear display
HAL_Delay(1);
HAL_Delay(1);
lcd_send_cmd (0x06); //Entry mode set --> I/D = 1 (increment
cursor) & S = 0 (no shift)
HAL_Delay(1);
lcd_send_cmd (0x0C); //Display on/off control --> D = 1, C and B
= 0. (Cursor and blink, last two bits)
}

void lcd_send_string (char *str)


{
while (*str) lcd_send_data (*str++);
}
Kode #include "stm32f1xx_hal.h"
Progra
m i2c- void lcd_init (void); // initialize lcd
lcd.h
void lcd_send_cmd (char cmd); // send command to the lcd

void lcd_send_data (char data); // send data to the lcd

void lcd_send_string (char *str); // send string to the lcd

void lcd_clear (void); // clear the LCD

You might also like