Laporan Akhir : Percobaan 7
1.) Prosedur [kembali]
- Siapkan komponen-komponen yang akan dirangkai sesuai percobaan
- Rangkai komponen pada breadboard
- Buka aplikasi STM32CubeIDE pada laptop
- Masukkan Listing program
- Hubungkan rangkaian breadboard dengan laptop menggunakan driver
- Upload Listing program pada rangkaian
- Rangkaian sudah dapat dijalankan
2.) Hardware dan Diagram Blok [kembali]
A. Hardware
1. STM32F103C8
2. Resistor
Resistor atau penghambat merupakan komponen elektronik yang memiliki dua pin dan dirancang untuk mengatur tegangan listrik dan arus listrik. Resistor mempunyai nilai resistansi (tahanan) tertentu yang dapat memproduksi tegangan listrik di antara kedua pin di mana nilai tegangan terhadap resistansi tersebut berbanding lurus dengan arus yang mengalir, berdasarkan persamaan hukum Ohm:
V=I*R
3. Sensor Soil Moisture
Pada Soil Moisture Sensor, terdapat beberapa pin yang harus diperhatikan sebelum memulai proyek. Berikut penjelasan singkat mengenai macam pin yang ada soil moisture sensor:
a.VCC
Pin VCC merupakan singkatan dari voltage at the common collector atau voltage at the collector of the common colllector. Dapat diartikan sebagai penginput daya atau tegangan ke suatu perangkat elektronik. Pin VCC ini biasanya akan dihubungkan pada 5V atau 3.3V. V disini diartikan sebagai Volt. Pin VCC merupakan pin bermuatan positif (+).
b.GND
Pin GND ini adalah pin dengan muatan negatif.(-). GND merupaan kepanjangn dari Ground. Pin ini digunakan sebagai tempat untuk catu daya. Pin GND pada soil moisture sensor dapat dikoneksikan dengan Pin GND pada mikrokotroler yang sama-sama bermuatan negatif.
c.A0
Pin ini disebut juga sebagai Keluaran Analog. Fungsinya untuk memberikan input atau masukkan berupa sinya analog.
d.D0
Pin ini disebut juga sebagai Keluaran Digital. Fungsinya adalah untuk memberikan output atau keluaran dari sinyal yang memiliki nilai biner. Nilai biner merupakan nilai yang hanya terdiri dari dua komponen saja yakni 0 dan 1. Nilai 0 biasanya untuk menandai off atau low, sedangkan nilai 1 untuk menandai on atau high.
4. RGB LED

LED RGB atau “Light Emitting Diode Red Green Blue” adalah jenis LED yang mampu memancarkan cahaya dalam tiga warna dasar, yaitu merah (Red), hijau (Green), dan biru (Blue). LED RGB 4 Pin adalah LED RGB yang memiliki anoda dan katoda seperti LED biasa, hanya saja terdapat 3 anoda pada LED ini mewakili warna red, green, dan blue.
5. Push Button
Push Button Switch dapat digunakan untuk menghubungkan atau memutuskan aliran listrik dalam suatu sirkuit. Ketika tombol ditekan, kontak di dalamnya akan tertutup, memungkinkan aliran listrik melalui sirkuit. Ketika tombolnya dilepaskan, kontak akan terbuka lagi, memutus aliran listrik.
6. Buzzer
Buzzer adalah komponen elektronik yang digunakan untuk menghasilkan suara atau bip. Ini adalah perangkat output yang mengubah sinyal listrik menjadi suara. Buzzer sering digunakan dalam perangkat rumah tangga, jam alarm, komputer, dan banyak perangkat elektronik lainnya sebagai cara untuk memberikan indikasi audio kepada pengguna.
Fitur utama buzzer adalah:
- Mekanisme Penghasil Suara: Buzzer umumnya bekerja dengan menggunakan elektromagnet, piezoelektrik, atau mekanisme mekanis. Buzzer piezoelektrik, misalnya, menggunakan disk piezoelektrik yang bergetar ketika tegangan listrik diterapkan, menghasilkan suara.
- Frekuensi Suara: Buzzer menghasilkan suara dengan frekuensi tertentu, yang biasanya dinyatakan dalam Hertz (Hz). Frekuensi ini menentukan nada suara yang dihasilkan.
- Volume: Intensitas suara yang dihasilkan buzzer biasanya dinyatakan dalam desibel (dB). Volume ini bisa bergantung pada tegangan yang diterapkan dan konstruksi buzzer.
- Tipe Aktuasi: Beberapa buzzer diaktifkan secara langsung oleh tegangan (buzzer aktif), sedangkan yang lain memerlukan sirkuit pembangkit sinyal eksternal untuk menghasilkan suara (buzzer pasif).
B. Diagram Blok
3.) Rangkaian Simulasi dan Prinsip Kerja [kembali]
Prinsip Kerja:
Rangkaian diatas terdiri dari 1 buah RGB LED dan 1 buzzer yang keduanya berfungsi sebagai output dari rangkaian, 3 buah resistor dengan besar 220 ohm digunakan untuk mencegah arus lebih mengalir pada RGB LED, sebuah sensor soil moisture yang mana sensor ini berfungsi sebagai input mendeteksi kelembapan tanah, push button yang digunakan untuk menghidupkan atau mematikan buzzer ketika buzzer berbunyi , dan terdapat mikrokontroler STM32F103C8. STM32F103C8 nantinya akan diprogram sesuai listing program yang sudah ada yang mana program tersebut nantinya akan bekerja sesuai dengan perintah yang diinginkan.
Ketika sensor soil moisture mendeteksi tanah yang basah atau lembab maka sinyal akan mengirimkan sinyal analog ke STM32F103C8 dan nantinya akan memberikan sinyal berupa sinyal diskrit output berupa RGB LED akan menyala berwarna merah dan buzzer akan berbunyi, ketika sensor soil moisture mendeteksi tanah dengan kadar airnya normal, maka outputnya akan berupa lampu pada RGB LED akan berwarna biru dan buzzer akan berbunyi, sedangkan ketika ketika sensor soil moisture mendeteksi tanah kering maka output yang didapat akan berupa RGB LED akan berwana merah dan buzzer tidak akan berbunyi.
Penggunaan push button, ketika push button ditekan pada saat buzzer berbunyi maka buzzer akan mati.
4.) Flowchart dan Listing Program [kembali]
Flowchart:
#include "stm32f1xx_hal.h"
/* Global Variables */
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim2;
uint8_t sound_pattern = 0;
/* Pin Definitions */
#define LED_RED_PIN GPIO_PIN_12
#define LED_GREEN_PIN GPIO_PIN_13
#define LED_BLUE_PIN GPIO_PIN_14
#define LED_PORT GPIOB
#define BUTTON_PIN GPIO_PIN_0
#define BUTTON_PORT GPIOB
#define BUZZER_PIN GPIO_PIN_2 // TIM2_CH3 (PA2)
/* Threshold Values */
#define ADC_THRESH_HIGH 3000
#define ADC_THRESH_MID 1500
/* Frekuensi Buzzer - using uint32_t instead of uint16_t */
const uint32_t pwm_periods[] = {143999, 71999, 719999}; // 72MHz/freq - 1
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM2_Init(void);
void update_leds_and_buzzer(uint32_t adc_val, uint8_t btn_state); // Updated function signature
void change_sound_pattern(void);
void Error_Handler(void); // Explicit declaration
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM2_Init();
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0);
HAL_ADC_Start(&hadc1);
while (1) {
static uint32_t last_adc_tick = 0;
static uint32_t last_sound_change = 0;
uint8_t button_state = HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);
if (HAL_GetTick() - last_adc_tick > 200) {
last_adc_tick = HAL_GetTick();
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
update_leds_and_buzzer(HAL_ADC_GetValue(&hadc1), button_state);
}
}
if (button_state == GPIO_PIN_SET && (HAL_ADC_GetValue(&hadc1) < ADC_THRESH_MID)) {
if (HAL_GetTick() - last_sound_change > 1000) {
last_sound_change = HAL_GetTick();
change_sound_pattern();
}
}
HAL_Delay(10);
}
}
void update_leds_and_buzzer(uint32_t adc_val, uint8_t btn_state) {
HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN|LED_GREEN_PIN|LED_BLUE_PIN, GPIO_PIN_RESET);
if (adc_val >= ADC_THRESH_HIGH) {
HAL_GPIO_WritePin(LED_PORT, LED_GREEN_PIN, GPIO_PIN_SET);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0);
}
else if (adc_val >= ADC_THRESH_MID) {
HAL_GPIO_WritePin(LED_PORT, LED_BLUE_PIN, GPIO_PIN_SET);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0);
}
else {
HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN, GPIO_PIN_SET);
if (btn_state == GPIO_PIN_SET) {
__HAL_TIM_SET_AUTORELOAD(&htim2, pwm_periods[sound_pattern]);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, pwm_periods[sound_pattern]/2);
} else {
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0);
}
}
}
void change_sound_pattern(void) {
sound_pattern = (sound_pattern + 1) % 3;
if (HAL_ADC_GetValue(&hadc1) < ADC_THRESH_MID &&
HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN) == GPIO_PIN_SET) {
__HAL_TIM_SET_AUTORELOAD(&htim2, pwm_periods[sound_pattern]);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, pwm_periods[sound_pattern]/2);
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
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 buses 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();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief ADC1 Initialization Function
* @param None
* @retval None
*/
static void MX_ADC1_Init(void)
{
/* USER CODE BEGIN ADC1_Init 0 */
/* USER CODE END ADC1_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC1_Init 1 */
/* USER CODE END ADC1_Init 1 */
/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 */
/* USER CODE END ADC1_Init 2 */
}
/**
* @brief TIM2 Initialization Function
* @param None
* @retval None
*/
static void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 65535;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
/* USER CODE END TIM2_Init 2 */
HAL_TIM_MspPostInit(&htim2);
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
/* GPIO Initialization */
static void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/* LED Outputs */
GPIO_InitStruct.Pin = LED_RED_PIN|LED_GREEN_PIN|LED_BLUE_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
/* Button Input */
GPIO_InitStruct.Pin = BUTTON_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);
}
/* 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 */
__disable_irq();
while (1)
{
}
/* 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,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
5.) Video Demo [kembali]
6.) Analisa [kembali]
7.) Download File [kembali]
HTML [disini]
Datasheet STM32F103C8 [disini]
Datasheet Resistor [disini]
Datasheet RGB LED [disini]
Datasheet Soil Moisture [disini]
Datasheet Buzzer [disini]
Datasheet Push Button [disini]
Video Demo [disini]
Komentar
Posting Komentar