LA uP uC M2P7



Percobaan 7

LED RGB, Buzzer,Soil Moisture dan Push Button

1. Prosedur[Kembali] 

Langkah-langkah percobaan :

1. Rangkai rangkaian seperti pada modul
2. Setelah rangkaian selesai, konfigurasi program dengan mikroprosesor STM32 melalui STM32Cube
3. Hubungan rangkaian dengan program menggunakan STlink
4. Lakukan percobaan untuk mengukur kelembapan tanah

2. Hardware dan Diagram Blok[Kembali]

      A. Hardware 
1. STM32



2. LED RGB





3. Buzzer


4. Soil Moisture Sensor



5. Push Button


          B. Blok Diagram



3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]

Rangkaian Percobaan:



Prinsip Kerja Rangkaian:

Prinsip kerja rangkaian berdasarkan flowchart tersebut menggambarkan suatu sistem monitoring kelembapan tanah yang terintegrasi dengan komponen visual (LED RGB), komponen audio (buzzer), serta input manual berupa push button. Sistem ini dirancang untuk memberikan notifikasi berdasarkan kondisi kelembapan tanah.

Proses dimulai dari tahap inisialisasi, di mana seluruh komponen yang digunakan dalam sistem diaktifkan dan disiapkan untuk bekerja. Komponen yang dimaksud antara lain adalah sensor kelembapan tanah yang berfungsi untuk membaca kadar air di dalam tanah, push button yang berfungsi sebagai input manual dari pengguna, buzzer sebagai alat pemberi peringatan suara, serta LED RGB yang digunakan untuk memberikan indikator visual terhadap status kelembapan tanah.

Setelah inisialisasi selesai, sistem langsung melanjutkan ke tahap deteksi oleh sensor kelembapan tanah. Sensor ini akan membaca tingkat kelembapan tanah dan mengkategorikannya ke dalam tiga kondisi utama: tanah kering, tanah normal, dan tanah basah. Masing-masing kondisi ini akan memicu respon yang berbeda dari sistem.

Jika sensor mendeteksi tanah dalam kondisi kering, maka LED RGB akan menyala dengan warna hijau sebagai tanda bahwa kelembapan tanah berada di bawah ambang batas minimum dan memerlukan penyiraman. Namun, karena ini belum kondisi darurat, buzzer tetap dalam keadaan mati untuk menghindari alarm yang tidak perlu. Di sisi lain, jika tanah terdeteksi dalam kondisi normal, LED RGB akan menyala dengan warna biru sebagai penanda bahwa kelembapan tanah berada pada tingkat yang optimal. Sama seperti kondisi sebelumnya, buzzer tidak diaktifkan karena tidak diperlukan tindakan.

Namun, apabila sensor mendeteksi bahwa tanah dalam kondisi terlalu basah—misalnya akibat penyiraman berlebihan atau hujan deras—maka sistem akan menganggap ini sebagai kondisi yang tidak ideal dan mungkin berisiko bagi pertumbuhan tanaman. Sebagai respon, LED RGB akan berubah menjadi warna merah sebagai tanda visual adanya masalah, dan buzzer akan diaktifkan untuk memberikan peringatan audio kepada pengguna agar segera melakukan tindakan, misalnya menghentikan penyiraman atau memperbaiki sistem drainase.

Pada tahap ini, sistem kemudian menunggu interaksi dari pengguna melalui push button. Push button berfungsi sebagai alat untuk mematikan buzzer ketika pengguna telah menyadari adanya kondisi tanah yang terlalu basah dan telah mengambil tindakan yang diperlukan. Jika pengguna menekan push button, maka sistem akan merespon dengan mematikan buzzer sebagai tanda bahwa peringatan telah diterima dan ditangani. Sebaliknya, jika push button tidak ditekan, maka buzzer akan tetap aktif, terus memberikan sinyal peringatan hingga pengguna memberikan respon.

Proses ini kemudian berakhir setelah push button ditekan dan buzzer dimatikan, atau tetap berada dalam keadaan aktif jika tidak ada intervensi pengguna. Dengan demikian, sistem ini memberikan solusi monitoring tanah yang tidak hanya otomatis dan responsif, tetapi juga memungkinkan kontrol manual

Prinsip Kerja Program:

Prinsip kerja kode program berbasis STM32 ini adalah untuk mengimplementasikan sistem monitoring kelembapan tanah dengan umpan balik berupa indikator LED RGB dan buzzer yang dikontrol oleh sensor kelembapan (berbasis ADC) dan tombol tekan (push button). Sistem ini dirancang agar dapat memberikan notifikasi visual dan audio sesuai dengan tingkat kelembapan tanah yang terdeteksi oleh sensor analog yang terhubung ke kanal ADC mikrokontroler.

Pada awal eksekusi program, dilakukan inisialisasi seluruh periferal utama, yaitu ADC1 untuk pembacaan nilai kelembapan tanah, GPIO untuk konfigurasi input dan output (termasuk LED, push button, dan buzzer), serta TIM2 sebagai penghasil sinyal PWM untuk buzzer. Setelah inisialisasi, sistem memulai pembacaan kelembapan tanah melalui ADC yang dikonfigurasi sebagai konversi perangkat lunak satu kali (single conversion, software trigger).

Nilai ADC yang dibaca merepresentasikan tingkat kelembapan tanah, di mana dua ambang batas digunakan untuk menentukan kondisi tanah: ADC_THRESH_HIGH (3000) dan ADC_THRESH_MID (1500). Nilai ini kemudian digunakan dalam fungsi update_leds_and_buzzer() untuk menyalakan LED dengan warna tertentu dan mengatur keadaan buzzer berdasarkan kondisi berikut:

  1. Tanah Kering (ADC ≥ 3000): LED RGB menyala hijau menandakan tanah kering, buzzer mati karena belum dalam kondisi kritis.

  2. Tanah Normal (1500 ≤ ADC < 3000): LED menyala biru menandakan tanah dalam kelembapan normal, buzzer tetap tidak aktif.

  3. Tanah Basah (ADC < 1500): LED menyala merah menandakan tanah terlalu basah. Dalam kondisi ini, buzzer akan aktif, menghasilkan suara PWM pada kanal 3 dari TIM2. Namun, buzzer ini hanya akan aktif apabila push button belum ditekan (logika low/GPIO_PIN_RESET).

Push button berperan sebagai alat interaksi manual dari pengguna untuk mematikan bunyi buzzer. Jika tombol ditekan ketika tanah dalam kondisi basah, maka PWM pada buzzer dimatikan (set compare = 0). Sebaliknya, selama tombol tidak ditekan, buzzer akan terus aktif memberikan notifikasi.

Selain itu, terdapat fungsi change_sound_pattern() yang digunakan untuk mengganti pola suara buzzer. Fungsi ini bekerja dengan mengubah nilai autoreload register (ARR) dari timer untuk menghasilkan variasi frekuensi PWM (bunyi berbeda). Pola suara akan berubah setiap 1 detik jika kondisi tanah tetap basah dan tombol tidak ditekan. Hal ini bertujuan agar notifikasi suara tidak monoton dan bisa memberikan indikasi tingkat perhatian yang berbeda.

Secara keseluruhan, kode ini menggabungkan sistem pembacaan sensor analog, pengendalian output digital (LED), PWM untuk buzzer, dan interaksi pengguna melalui push button dalam satu kesatuan yang responsif terhadap perubahan kondisi lingkungan. Sistem ini cocok digunakan dalam sistem pemantauan tanaman otomatis atau smart irrigation yang sederhana, namun cukup efektif untuk memberikan notifikasi berdasarkan status kelembapan tanah.

 

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


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







6. Analisa[Kembali]





7. Download File[Kembali]


Download File HTML Klik Disini
Download File Video  Klik Disini
Download File Program Klik Disini
Download File Datasheet Raspberry Pi Pico Klik Disini












Tidak ada komentar:

Posting Komentar

Home

  BAHAN PRESENTASI UNTUK MATAKULIAH                                                 ELEKTRONIKA 2022 Nama: Hafizh Qisthi Bakri NIM: 22109530...