M2_LA1



Laporan Akhir

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



1. Prosedur[Kembali]

    1. Buat rangkaian dipapan rangkaian sesuai dengan percobaan yang dilakukan pada modul.
    2. Buat program di STM32 Cube IDE.
    3. Connect STM32 dengan laptop
    4. Jalankan program
    5. Selesai.

2. Hardware dan Diagram Blok[Kembali]

Hardware :

  • STM32
  • Push button


  • LED
  • Resistor

  • Soil Moisture Sensor


3. Rangkaian Simulasi[Kembali]

  • Rangkaian 

  • Prinsip Kerja 

Rangkaian ini terdiri dari satu sensor soil moisture sebagai input dan sebuah LED serta buzzer sebagai output, yang semuanya dikendalikan menggunakan mikrokontroler STM32. Sensor soil moisture berfungsi untuk membaca tingkat kelembapan tanah dan terhubung ke salah satu pin ADC pada STM32. Data analog dari sensor kemudian diproses untuk menentukan apakah tanah berada dalam kondisi lembab atau kering.

Pada sistem ini, ketika nilai ADC menunjukkan bahwa kelembapan tanah cukup tinggi (lembab), yaitu nilai ADC berada di bawah atau sama dengan ambang batas tertentu, maka STM32 akan mengaktifkan LED dan buzzer secara bersamaan sebagai indikator bahwa tanah dalam keadaan basah. LED akan menyala dan buzzer akan berbunyi selama kondisi tersebut berlangsung. Sebaliknya, jika nilai ADC melebihi ambang batas tersebut (menunjukkan tanah mulai mengering), maka STM32 akan mematikan LED dan buzzer.

4. Flowchart dan Listing Program[Kembali]

  • Flowchart



  • Listing Program

#include "stm32f1xx_hal.h" ADC_HandleTypeDef hadc1; TIM_HandleTypeDef htim2; uint8_t sound_pattern = 0; // Define pin and threshold constants #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 #define ADC_THRESH_HIGH 3000 #define ADC_THRESH_MID 1500 const uint32_t pwm_periods[] = {1000, 50000, 719999}; // Function declarations 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); void change_sound_pattern(void); void Error_Handler(void); // Main function 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); uint32_t last_adc_tick = 0; uint32_t last_sound_change = 0; while (1) { 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) { uint32_t adc_val = HAL_ADC_GetValue(&hadc1); update_leds_and_buzzer(adc_val, button_state); if (button_state == GPIO_PIN_RESET && adc_val < ADC_THRESH_MID) { if (HAL_GetTick() - last_sound_change > 1000) { last_sound_change = HAL_GetTick(); change_sound_pattern(); } } } } HAL_Delay(10); } } // LED and Buzzer update based on ADC and Button state void update_leds_and_buzzer(uint32_t adc_val, uint8_t btn_state) { // Turn off all LEDs 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); } } } // Sound pattern changer 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); } } // System Clock Config void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; 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(); 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(); } // ADC1 Init static void MX_ADC1_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; 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(); 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(); } // TIM2 PWM Init static void MX_TIM2_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; 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(); HAL_TIM_MspPostInit(&htim2); } // GPIO Init static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); // Output pins (LEDs) 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); // Input pin (Button) GPIO_InitStruct.Pin = BUTTON_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct); } // Error Handler void Error_Handler(void) { __disable_irq(); while (1) {} }





6. Analisa[Kembali]


Tidak ada analisa karena kondisi tidak terpenuhi

7. Download File[Kembali]

Listing Program [Download]
Video Simulasi [Download]  
  









 

Komentar

Postingan populer dari blog ini

Modul 1 Input Output

Modul 3

Tugas Besar