MA2 LA2





Percobaan 7
Led RGB, Buzzer, Soil Moisture, & Push Button


1. Prosedur [kembali]
    Langkah-langkah percobaan :
1. Rangkai rangkaian seperti pada modul
2. Setelah rangkaian selesai, konfigurasi program dengan mikroprosesor STM32 melalui STM32Cube
3. Hubungan rangkaian dengan program menggunakan STlink
4. Lakukan percobaan untuk mengukur kelembapan tanah

    


2. Hardware dan Diagram Blok [kembali]
        A. Hardware 
1. STM32



2. LED RGB





3. Buzzer


4. Soil Moisture Sensor



5. Push Button


          B. Blok Diagram




3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
           A. Rangkaian Simulasi




  Prinsip Kerja 

Rangkaian ini bekerja dengan prinsip utama pembacaan sensor kelembaban tanah untuk menentukan tingkat kelembaban, yang kemudian digunakan untuk mengendalikan LED RGB dan buzzer sesuai kondisi yang terdeteksi. Push button berfungsi sebagai input manual yang memungkinkan pengguna mengubah atau mengaktifkan status sistem. Sensor kelembaban tanah terhubung ke pin analog pada mikrokontroler STM32F103C8 dan mengukur kadar kelembaban berdasarkan resistansi antara dua elektroda. Saat tanah basah, resistansi rendah dan sensor menunjukkan kelembaban tinggi; sebaliknya, resistansi tinggi menandakan tanah kering dan kelembaban rendah. Sinyal analog dari sensor diterima oleh mikrokontroler melalui pin A0, lalu dikonversi menjadi nilai digital menggunakan ADC (Analog-to-Digital Converter). Berdasarkan nilai ini, mikrokontroler mengatur LED RGB untuk menyala dengan warna tertentu: merah menunjukkan tanah kering, hijau menunjukkan tanah basah, dan biru sebagai indikator status normal atau kondisi lainnya. LED ini dihubungkan ke pin I/O mikrokontroler dengan resistor pengatur arus untuk setiap warna. Selain itu, jika kelembaban terdeteksi sangat tinggi, buzzer akan diaktifkan oleh mikrokontroler sebagai peringatan. Push button yang terhubung ke pin PB0 berfungsi sebagai saklar manual dan dapat digunakan untuk mengaktifkan atau menonaktifkan sistem buzzer, serta berperan sebagai interrupt pada sistem.


4. Flowchart dan Listing Program [kembali]
        A. Flowchart





        B. Listing Program  

#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[] = {1000, 50000, 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_RESET && (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_RESET) { __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. Analisa [kembali]

1. Analisa kenapa LED RGB pada percobaan tidak menyala dengan maksimal 

Jawab : Pada percobaan, LED RGB tidak menyala dengan maksimal dapat disebabkan oleh kurangnya arus dan tegangan yang dihasilkan oleh sensor soil moisture yang berfungsi kurang baik atau pada saat konfigurasi pada STM32 yang dapat menyebabkan sensor tidak dapat menghasilkan arus dengan cukup untuk menghidupkan LED RGB, selain itu penggunaan resistor pada percobaan juga terdapat ketidak kesesuaian pada breadboard yang menyebabkan resistor goyang dan arus mengalir terlalu besar melebih batas dari LED RGB

2. Analisa faktor apa saja yang menyebabkan hal itu terjadi 

Jawab : 

a. Jenis LED RGB, pada percobaan jenis LED RGB yang digunakan adalah LED RGB CC dimana untuk kaki katoda dihubungkan langsung ke ground dan kaki RGB berlogika high. 

b. Tegangan suplai yang rendah, selisih tegangan setelah melewati resistor bisa saja lebih rendah dibandingkan batas terima LED RGB yang mana untuk warna hijau dan biru membutuhkan tegangan yang lebih tinggi. 

c. Selain itu, konfigurasi STM32 juga dapat menjadi faktor penyebab karena jika konfigurasi yang dilakukan salah, makan LED RGB tidak dapat hidup dengan maksimal


3. Analisa bagaimana cara kerja sensor Soil moisture kapasitif dan Resistif

Jawab :

a. Sensor Soil Moisture resistif

Sensor resistif bekerja berdasarkan perubahan resistansi listrik antara dua elektroda logam yang ditanam ke dalam tanah. Ketika tanah dalam keadaan basah, air yang mengandung ion-ion elektrolit akan meningkatkan konduktivitas listrik, sehingga resistansi antara dua pin menjadi lebih rendah. Sebaliknya, saat tanah kering, konduktivitas menurun dan resistansinya menjadi tinggi. Semakin basah tanah, semakin besar arus yang bisa mengalir maka nilai ADC meningkat. Semakin kering tanah, semakin kecil arus maka nilai ADC menurun.

b. Sensor Soil Moisture kasitif

Sensor kapasitif bekerja berdasarkan perubahan kapasitansi antara dua pelat konduktor dalam sensor. Kapasitansi ini berubah sesuai dengan konstanta dielektrik tanah yang dipengaruhi oleh kadar air. Air memiliki konstanta dielektrik jauh lebih tinggi daripada udara atau partikel tanah, sehingga saat tanah basah, nilai kapasitansi meningkat. Saat dimasukkan ke tanah, kapasitansi antar pelat berubah tergantung kelembaban tanah. Semakin basah tanah, tegangan keluarannya meningkat.


6. Video Simulasi [kembali]



7. Download file [kembali]

HTML klik disini
Download Video Demo klik disini
DataSheet STM32 Klik Disini 
DataSheet Sensor Soil Moisture Klik Disini 
DataSheet LED RGB Klik disini
DataSheet Resistor Klik disini
Datasheet push button klik disini