Percobaan
7
Led
RGB, Buzzer, Soil Moisture, & Push Button
1. Prosedur [Kembali]
- Rangkai semua komponen
- Buat program di STM32 CubeIDE
- Jalankan program dan cobakan sesuai kondisi
- Rangkaian
- Listing Program
#include "stm32f1xx_hal.h"// HandlerADC_HandleTypeDef hadc1;TIM_HandleTypeDef htim2;// Variabeluint8_t sound_pattern = 0;// Define pin#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// Threshold ADC#define ADC_THRESH_HIGH 3000#define ADC_THRESH_MID 1500// Array frekuensi PWM (periode)const uint32_t pwm_periods[] = {1000, 50000, 719999};// Deklarasi fungsivoid 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);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};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();}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();}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);}static void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_
TIDAK ADA SOAL ANALISA
HTML [Download] Rangkaian [Download]
Tidak ada komentar:
Posting Komentar