Laporan Akhir 2 (P7)



Modul 2 Percobaan 2

Led RGB, Buzzer, Soil Moisture, & Push Button


1. Prosedur [Kembali]

  1. Siapkan komponen dan alat yang diperlukan seperti LED RGB, soil sensor, push button, buzzer dan STM32F103C8.
  2. Rangkailah komponen seperti gambar percobaan di modul.
  3. Jika komponen sudah selesai dirangkai, buatlah program dengan konfigurasi pin input dan output berdasarkan pada pin GP STM32 yang telah dirangkai sebelumnya. Kemudian buatlah program untuk menghasilkan output LED RGB sesuai kondisi yang telah ditentukan
  4. Inputkan listring program ke dalam STM32.
  5. Simulasikan rangkaian.

2. Hardware dan Diagram Blok[Kembali]

  • Hardware :
  1. Soil Sensor 



  2. LED RGB

  3. Push Button 



  4. Resistor 
  5. STM32 

  6. Buzzer



  • Diagram Blok : 



3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]

  • Rangkaian Simulasi


  • Prinsip Kerja :
    Rangkaian ini bekerja dengan sebuah Sensor Soil Moisture sebagai input dan LED RGB serta buzzer sebagai output. Ketika sensor soil moisture mendeteksi basah maka buzzer akan berbunyi dan LED RGB akan berwarna merah, lalu ketika sensor soil moisture mendeteksi kering maka buzzer tidak berbunyi dan LED RGB mati.


4. Flowchart dan Listing Program[Kembali]

  • Flowchart : 



  • Listing Program :
#include "stm32f1xx_hal.h"

 

// Handle untuk ADC dan Timer

ADC_HandleTypeDef hadc1;

TIM_HandleTypeDef htim2;

 

// Variabel Global

uint8_t sound_pattern = 0;

 

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

 

// Periode PWM untuk buzzer

const uint32_t pwm_periods[] = {1000, 50000, 719999};

 

// Function Prototype

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);

 

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_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();

 

    // LED Pins

    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 Pin

    GPIO_InitStruct.Pin = BUTTON_PIN;

    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);

}

 

void Error_Handler(void) {

    __disable_irq();

    while (1) {}

}











Percobaan 7
Buatlah Rangkaian seperti gambar pada percobaan 7, Buatlah ketika soil moisture sensor mendeteksi kelembapan tanah kering maka LED RGB akan menampilkan warna Hijau dan ketika kelembapan tanah normal maka LED RGB menampilkan warna kuning dan ketika kelembapanya basah maka LED RGB akan menampilkan warna merah dan Buzzer aktif. ketika push button ditekan maka buzzer akan mati.


7. Download File[Kembali]

 

 

 

 



 

Tidak ada komentar:

Posting Komentar

  BAHAN PRESENTASI UNTUK MATA KULIAH   ELEKTRONIKA    Oleh : Yuningsih Vebhy Selvania 2210953042 Elektronika (A)     Dosen Pengampu : Dr.  D...