Laporan Akhir 1


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

Hardware :

  • STM32



  • Buzzer

  • Soil Moisture Sensor


  • Resistor



  • Push Button



  • LED RGB



Diagram Blok



  • Rangkaian
  • Prinsip Kerja

Sensor kelembapan tanah (Soil Moisture Sensor) digunakan untuk mendeteksi kadar air dalam tanah. Sensor ini menghasilkan tegangan analog sesuai dengan kelembapan tanah: semakin lembap tanah, semakin rendah nilai resistansinya, sehingga tegangan output sensor akan semakin tinggi. Output dari sensor ini dihubungkan ke input analog mikrokontroler STM32 (kemungkinan pada pin PA0 atau pin ADC lain yang sesuai), yang kemudian akan diubah menjadi data digital melalui ADC internal dari mikrokontroler.

Data hasil konversi ADC tersebut kemudian digunakan sebagai dasar pengambilan keputusan dalam program mikrokontroler. Jika nilai kelembapan di bawah ambang batas tertentu (yang bisa diatur melalui potensiometer RV2), maka mikrokontroler akan mengaktifkan LED (melalui transistor atau langsung via pin output digital seperti PB0) sebagai indikator visual bahwa tanah dalam kondisi kering. Selain itu, buzzer juga akan diaktifkan melalui salah satu pin output (seperti PB1) untuk memberikan peringatan suara. Buzzer ini mendapatkan sinyal dari pin mikrokontroler dan akan menyala jika logika output aktif.

Pada rangkaian juga terdapat tombol (push button) yang terhubung ke pin input digital mikrokontroler (misalnya pada PA1) yang berfungsi sebagai kendali manual atau reset alarm. Tombol ini dapat digunakan untuk mematikan buzzer setelah pengguna menyadari adanya peringatan. Kapasitor (C2) dan induktor (L2) yang terlihat pada bagian catu daya digunakan sebagai filter untuk menstabilkan tegangan dan mengurangi noise pada sistem. Regulator tegangan (LD33) memastikan sistem menerima suplai 3.3V yang stabil, yang sangat penting untuk mikrokontroler STM32.

  • Flowchart
  • Listing Program
#include "stm32f1xx_hal.h"

// Handler
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim2;

// Variabel
uint8_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 fungsi
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_


5. Video Demo [Kembali]

6. Analisa [Kembali]

TIDAK ADA SOAL ANALISA

HTML [Download]
Rangkaian [Download
Video Simulasi [Download 
Listring Program [Download 


Tidak ada komentar:

Posting Komentar

   BAHAN PRESENTASI UNTUK MATA KULIAH  ELEKTRONIKA 2023 Nama : Hadi Andhika Jafta NIM : 2210951009 Dosen Pengampu : Dr. Darwison, MT...