Modul 2 - Laporan Akhir 2



Percobaan 7

 Led RGB, Buzzer, Soil Moisture, & Push Button  

1. Prosedur[Kembali]

  1. Membuat rangkaian sesuai dengan percobaan 2
  2. Masukkan input dan output dari rangkaian di software  STM32.
  3. Setelah input output selesai disesuaikan pada software STM32 sesuai pada modul, ubah menjadi code 
  4. Code yang diperoleh dari software STM32 dapat diaplikasikan pada software Proteus untuk diterapkan pada STM32f103C8 di dalam Proteus
  5. Selesai.


2. Hardware dan Diagram Blok[Kembali]

Hardware:


  • STM32
STM32 adalah keluarga mikrokontroler berbasis arsitektur ARM Cortex yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini memiliki performa tinggi, konsumsi daya rendah, serta fitur periferal yang lengkap, seperti ADC (Analog to Digital Converter), komunikasi serial (UART, SPI, I2C), dan GPIO yang dapat dikonfigurasi sesuai kebutuhan. STM32 sering digunakan dalam sistem tertanam (embedded systems) untuk berbagai aplikasi, termasuk otomasi, robotika, dan perangkat IoT.
  • LED RGB
LED RGB (Red, Green, Blue) adalah jenis LED yang mampu menghasilkan berbagai warna cahaya dengan mengatur intensitas dari tiga warna dasar: merah, hijau, dan biru. Dengan menggabungkan ketiga warna ini dalam berbagai tingkat kecerahan, LED RGB dapat menghasilkan spektrum warna yang luas. Komponen ini sering digunakan dalam pencahayaan dekoratif, tampilan visual interaktif, dan sistem indikator dalam berbagai perangkat elektronik.
  • Buzzer

Buzzer adalah komponen elektronik yang digunakan untuk menghasilkan suara dalam berbagai frekuensi. Buzzer dapat bekerja berdasarkan prinsip piezoelektrik atau elektromagnetik untuk mengubah sinyal listrik menjadi getaran suara. Dalam sistem tertanam, buzzer sering digunakan sebagai alarm, notifikasi audio, atau indikator peringatan dalam perangkat elektronik seperti jam tangan, sistem keamanan, dan mesin industri.

  • Soil Moisture Sensor



Sensor kelembaban tanah adalah alat yang digunakan untuk mengukur kadar kelembaban (kandungan air) dalam tanah. Sensor ini bekerja dengan cara mendeteksi resistansi listrik yang terjadi di dalam tanah. Ketika kelembaban tanah tinggi, resistansi akan rendah, dan sebaliknya, ketika tanah kering, resistansi akan tinggi. Fungsi utama dari sensor kelembaban tanah adalah untuk memberikan informasi mengenai tingkat kelembaban tanah pada suatu lokasi. Data ini digunakan dalam sistem otomatisasi pertanian, seperti pengaturan penyiraman tanaman. Ketika kelembaban tanah mencapai tingkat yang rendah, sensor ini dapat mengaktifkan sistem penyiraman atau memberikan peringatan.
  • Breadboard


  • Breadboard adalah sebuah papan yang digunakan untuk merancang dan menguji rangkaian elektronik secara sementara tanpa perlu menyolder komponen. Breadboard memungkinkan perakitan rangkaian secara cepat dan mudah, sehingga sangat berguna dalam prototyping dan eksperimen elektronik.

  • Jumper male to male


  • Kabel jumper Male to Male adalah kabel yang memiliki konektor jantan (male) di kedua ujungnya. Kabel ini biasanya digunakan untuk menghubungkan pin pada board elektronik, seperti Raspberry Pi, Arduino, atau breadboard, dengan komponen lainnya. Kabel jumper male to male sering digunakan dalam rangkaian prototyping atau percobaan karena fleksibilitas dan kemudahannya untuk digunakan.

  • Push Button
Push button adalah saklar atau tombol yang digunakan untuk menghubungkan atau memutuskan sirkuit listrik. Tombol ini biasanya bersifat sementara (momentary), yang berarti ketika tombol ditekan, arus listrik akan mengalir, dan ketika tombol dilepaskan, arus listrik akan terputus. Fungsi utama push button adalah untuk memberikan input atau perintah ke sistem. Dalam rangkaian ini, push button dapat digunakan untuk mengaktifkan atau mengubah status sistem, seperti memulai pembacaan sensor kelembaban tanah atau mengubah mode kerja rangkaian.


  • Resistor

Resistor adalah komponen elektronik yang digunakan untuk membatasi atau mengatur aliran arus listrik dalam suatu rangkaian. Resistor bekerja dengan cara menambah hambatan pada rangkaian, yang bergantung pada nilai resistansi yang diberikan (dalam ohm). Resistor berfungsi untuk mengatur arus listrik yang mengalir pada komponen lain, seperti LED RGB atau sensor. Dalam rangkaian ini, resistor digunakan untuk melindungi LED RGB dari aliran arus yang berlebihan, serta untuk menyesuaikan sinyal yang diterima oleh sensor kelembaban tanah.

  • Blok diagram



3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]

Rangkaian Simulasi:









Prinsip Kerja:

Rangkaian ini dirancang untuk memantau kelembaban tanah menggunakan sensor kelembaban tanah, kemudian mengendalikan LED RGB dan buzzer berdasarkan kondisi kelembaban yang terdeteksi. Sebuah push button juga disertakan untuk mengubah atau mengaktifkan status sistem secara manual. Sensor kelembaban tanah dihubungkan ke pin analog pada mikrokontroler STM32F103C8, dan bekerja dengan mengukur resistansi antara dua elektroda; resistansi yang rendah menunjukkan tanah basah, sedangkan resistansi yang tinggi menandakan tanah kering. Mikrokontroler membaca sinyal analog dari sensor melalui pin A0, kemudian mengubahnya menjadi nilai digital menggunakan ADC (Analog-to-Digital Converter) untuk menentukan tindakan yang tepat.

Berdasarkan hasil pembacaan tersebut, LED RGB akan menyala dengan warna tertentu sebagai indikator tingkat kelembaban tanah. Warna merah menandakan tanah dalam kondisi kering, hijau menunjukkan tanah yang basah, dan biru digunakan untuk menunjukkan kondisi normal atau sesuai dengan parameter yang ditentukan. LED RGB ini dihubungkan ke pin I/O mikrokontroler melalui resistor untuk membatasi arus ke masing-masing komponen warna. Selain itu, jika kelembaban tanah terdeteksi sangat tinggi, buzzer akan diaktifkan sebagai alarm peringatan. Sistem juga dilengkapi dengan push button yang terhubung ke pin PB0, berfungsi sebagai input manual untuk mengaktifkan atau menonaktifkan buzzer, biasanya digunakan melalui fitur interrupt pada mikrokontroler. Dengan demikian, rangkaian ini memungkinkan pemantauan dan respon otomatis terhadap kondisi kelembaban tanah, serta kontrol manual bila diperlukan.

4. Flowchart dan Listing Program[Kembali]

Flowchart:







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 */





6. Analisa[Kembali]




7. Download File[Kembali]

Download Video Demo [Download]
Download Datasheet STM32F103C8 [Download]
Download Datasheet Sensor PIR [Download]
Download Datasheet Sensor Touch [Download]
Download Datasheet RGB LED [Download]















Tidak ada komentar:

Posting Komentar

  BAHAN PRESENTASI UNTUK MATA KULIAH   ELEKTRONIKA   Oleh : Aulia Riska Farasi 2210953045     Dosen Pengampu : Darwison, M.T.   Darwison, 20...