LA M2 PERCOBAAN 7





LAPORAN AKHIR M2 PERCOBAAN 7

1. Prosedur [kembali]

Percobaan 7 : Led RGB, Buzzer, Soil Moisture, & Push Button 
  • Persiapan Alat dan Bahan:

    • Pastikan Anda memiliki semua komponen yang tertera pada gambar rangkaian, yaitu:

      • Microcontroller STM32F103C8

      • LED RGB

      • Buzzer

      • Sensor Kelembaban Tanah (Soil Moisture Sensor)

      • Push Button

      • Resistor (R1, R2, R3) sebesar 100 

      • Potensiometer

      • kabel jumper

      • Breadboard

  • Koneksi Rangkaian:

    • Microcontroller STM32F103C8:

      • Sambungkan pin I/O sesuai dengan gambar rangkaian.

    • LED RGB:

      • Sambungkan pin R, G, B dari LED RGB ke resistor (R1, R2, R3) dan hubungkan ke pin I/O dari microcontroller sesuai dengan gambar(PB12,PB13,PB14).

    • Buzzer:

      • Sambungkan buzzer (BUZ1) ke pin yang sesuai pada microcontroller STM32F103C8 (PA2).

    • Sensor Kelembaban Tanah:

      • Sambungkan pin test, A0, GND, dan VCC sensor kelembaban tanah ke pin yang sesuai pada rangkaian (PA0).

    • Push Button:

      • Sambungkan push button ke pin I/O pada microcontroller (PB0).

  • Penyesuaian Variabel:

    • Atur nilai pada variabel resistor (RV2) untuk mengubah nilai yang dibaca oleh sensor kelembaban tanah.

  • Pengaturan Sumber Daya:

    • Pastikan sumber daya 3.3V tersedia dan disambungkan dengan benar ke rangkaian.

  • Pemrograman Microcontroller:

    • Programkan microcontroller STM32F103C8 untuk membaca nilai dari sensor kelembaban tanah dan menyalakan LED RGB sesuai dengan tingkat kelembaban tanah.

    • Buatkan program agar buzzer menyala ketika kelembaban tanah di bawah ambang batas tertentu.

    • Program tombol tekan (PB0) untuk mengubah status sistem atau memulai pembacaan sensor.

  • Uji Coba:

    • Tekan tombol (PB0) untuk memulai atau mengubah status pembacaan sensor kelembaban tanah.

    • Amati perubahan pada LED RGB berdasarkan nilai kelembaban tanah yang dibaca sensor.

    • Jika kelembaban tanah rendah, buzzer akan menyala sebagai tanda peringatan.

    • Sesuaikan nilai RV2 untuk melihat perubahan respons pada LED RGB dan buzzer.

  • Pengamatan dan Evaluasi:

    • Amati dan catat perubahan pada LED RGB yang sesuai dengan kelembaban tanah.

    • Pastikan buzzer berfungsi saat kelembaban tanah berada di bawah ambang batas yang telah ditentukan.

    • Evaluasi apakah tombol tekan (PB0) mengubah status sistem dengan benar.

  • Kesimpulan:

    • Tentukan apakah rangkaian berfungsi sesuai harapan dengan LED RGB, buzzer, dan sensor kelembaban tanah.

    • Periksa apakah pengaturan variabel dan pemrograman microcontroller sudah sesuai dengan kebutuhan eksperimen.

2. Hardware dan Diagram Blok [kembali]
  • 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 bekerja berdasarkan pembacaan sensor kelembaban tanah yang mengukur tingkat kelembaban tanah, kemudian mengendalikan LED RGB dan buzzer sesuai dengan kondisi tersebut. Push button digunakan untuk mengubah atau mengaktifkan status sistem. Berikut adalah prinsip kerja secara rinci:

1. Pembacaan Kelembaban Tanah oleh Sensor (Soil Moisture Sensor):

  • Sensor kelembaban tanah terhubung ke pin analog pada microcontroller STM32F103C8.

  • Sensor ini mengukur kadar kelembaban tanah berdasarkan resistansi yang terjadi antara dua elektroda yang ada pada sensor.

  • Jika tanah dalam kondisi basah, resistansi rendah, dan sensor mengirimkan sinyal yang menunjukkan kelembaban tinggi.

  • Sebaliknya, jika tanah dalam kondisi kering, resistansi tinggi, dan sensor mengirimkan sinyal yang menunjukkan kelembaban rendah.

2. Pengolahan Sinyal oleh Microcontroller (STM32F103C8):

  • Microcontroller menerima sinyal analog dari sensor kelembaban tanah melalui pin A0.

  • Microcontroller mengkonversi sinyal analog tersebut menjadi nilai digital menggunakan ADC (Analog-to-Digital Converter).

  • Berdasarkan nilai kelembaban yang terbaca, microcontroller menentukan tindakan yang akan dilakukan.

3. Pengendalian LED RGB Berdasarkan Kelembaban:

  • Berdasarkan nilai kelembaban yang diterima oleh microcontroller, LED RGB akan diaktifkan dengan warna tertentu untuk menunjukkan status kelembaban tanah:

    • Warna Merah: Menunjukkan kelembaban tanah rendah (tanah kering).

    • Warna Hijau: Menunjukkan kelembaban tanah tinggi (tanah basah).

    • Warna Biru: Menunjukkan status normal atau indikator lainnya sesuai dengan kondisi kelembaban yang diinginkan.

  • LED RGB dihubungkan ke pin I/O dari microcontroller dan diberi resistor (R1, R2, R3) untuk mengatur arus yang mengalir ke masing-masing pin warna (Red, Green, Blue).

4. Pengendalian Buzzer Berdasarkan Kelembaban Tanah:

  • Jika kelembaban tanah terdeteksi sangat lembab, microcontroller akan mengaktifkan buzzer.

5. Fungsi Push Button:

  • Push button digunakan untuk memberikan input manual ke sistem. Saat tombol ditekan, pin input pada microcontroller menerima sinyal dan mengubah status sistem.

  • Push button terhubung ke pin PB0 pada microcontroller dan akan berfungsi sebagai saklar untuk mengaktifkan atau menonaktifkan buzzer (sebagai interrupt).



4. Flowchart dan Listing Program [kembali]
  • Listing Program pada STM32

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

  • Flowchart




5. Video Demo [kembali]


6. Analisa [kembali]



7. Download file [kembali]

Komentar

Postingan populer dari blog ini

KELEBIHAN DAN KEKURANGAN MENJADI SEORANG PEMIMPIN

KOMITMEN TERHADAP KESELAMATAN DAN RESIKO DALAM PEKERJAAN