Kamis, 08 Mei 2025

Laporan Akhir Modul 2 Percobaan 1 Praktikum Mikroprosesor dan Mikrokontroler






1. Prosedur [kembali]

    Langkah-langkah percobaan :

a. Tentukan percobaan dan kondisi yang akan dilakukan (Kondisi 6)

b. Siapakan alat dan bahan yang akan digunakan

c. Rangkai Rangkaian pada Board sesuai gambar percobaan 7 dengan komponen 1 input soil moisture capasitive, push button, STM32F103C8, 3 Resistor 220 Ohm, 1 Motor DC dam 1 Buzzer  hubungkan menggunakan jumper. 

d. Buatlah program  pada software STM32Cube IDE dengan konfigurasi Pin Input dan Output berdasarkan pada Pin GPIO STM32 yang telah dirangkai di simulasi sebelumnya.

e. Kemudian, buatlah program untuk menghasilkan Output LED-RGB dan Buzzer sesuai kondisi yang telah ditentukan.

f.  Hubungkan Laptop dengan STM32F103C8 dengan STlink 

g. Run Program, dan lihat output yang dihasilkan ketika push button ditekan



2. Hardware dan Diagram Blok [kembali]
        A. Hardware
            1. STM32F103C8



            2. Push Button



            3. LED-RGB


            4. Jumper

            5. Resistor



            6. Laptop


        B. Software
            1. STM32Cube IDE


       C. Blok Diagram



3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
           A. Rangkaian Simulasi


            B. Rangkaian Percobaan





            C. Prinsip Kerja

  1. Mulai (Start):
    Sistem dinyalakan dan mulai menjalankan proses utama.

  2. Inisialisasi Komponen:
    Semua komponen seperti sensor kelembapan tanah, push button, buzzer, dan LED RGB diatur/dikonfigurasi terlebih dahulu agar siap digunakan.

  3. Pembacaan Sensor Kelembapan:
    Sistem membaca nilai kelembapan tanah dari sensor dan mengevaluasi hasilnya ke dalam tiga kategori kondisi:

    • Tanah Normal:
      Jika nilai sensor menunjukkan bahwa kelembapan tanah berada pada tingkat normal, maka LED RGB akan menyala biru dan buzzer dalam kondisi mati.

    • Tanah Kering:
      Jika nilai kelembapan rendah (tanah kering), maka LED RGB menyala hijau sebagai tanda peringatan, dan buzzer tetap mati.

    • Tanah Basah:
      Jika nilai sensor menunjukkan tanah terlalu basah (kelembapan tinggi), maka LED RGB menyala merah dan buzzer akan aktif (berbunyi) sebagai alarm.

  4. Cek Status Push Button:
    Dalam kondisi tanah terlalu basah, buzzer berbunyi dan sistem menunggu aksi dari pengguna. Di sini, sistem akan memeriksa apakah push button ditekan atau tidak:

    • Jika Ditekan:
      Tombol dianggap sebagai respon pengguna untuk menghentikan alarm, maka buzzer akan dimatikan.

    • Jika Tidak Ditekan:
      Maka buzzer tetap aktif, artinya sistem masih memberikan peringatan karena belum ada respon dari pengguna.

  5. Selesai:
    Alur proses satu siklus selesai. Setelah ini, sistem biasanya akan mengulang pembacaan sensor secara berkala (walau tidak digambarkan eksplisit di flowchart).

  • Sensor kelembapan biasanya menghasilkan tegangan analog yang bisa dikonversi ke nilai digital dengan ADC, tergantung platform (misal: Arduino, STM32, atau Raspberry Pi Pico).

  • LED RGB dikontrol untuk menghasilkan warna berbeda dengan mengatur level PWM pada masing-masing channel (merah, hijau, biru).

  • Push button perlu diprogram agar dapat mendeteksi status tekan (biasanya menggunakan interrupt atau polling).

  • Buzzer dapat berupa buzzer aktif (langsung nyala saat diberi tegangan) atau buzzer pasif (butuh sinyal PWM untuk menghasilkan suara).

    
        

4. Flowchart dan Listing Program [kembali]
        A. Flowchart




        B. Listing Program  

#include "stm32f1xx_hal.h"

ADC_HandleTypeDef hadc1;

TIM_HandleTypeDef htim2;

uint8_t sound_pattern = 0;

#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};

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_SET) {

__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_IC_MspInit(&htim2);

}

static void MX_GPIO_Init(void) {

GPIO_InitTypeDef GPIO_InitStruct = {0};

__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();

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

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) {}

}


    

5. Analisa [kembali]
       








6. Video Demo [kembali]



7. Download file [kembali]

Tidak ada komentar:

Posting Komentar

LAPORAN AKHIR DEMO PROJECT PRAKTIKUM MIKROPROSESOR & MIKROKONTROLER

[KEMBALI KE MENU SEBELUMNYA] DAFTAR ISI 1. Pendahuluan 2. Tujuan 3. Alat dan Komponen 4. Landasan Teori 5. Flowchart dan ...