M2 LA 1




Percobaan 7
1. Prosedur
[Kembali]
  1. Siapkan alat dan bahan: STM32F103C8, LED RGB + resistor, buzzer, sensor kelembaban tanah, push button, potensiometer, kabel jumper, breadboard, dan sumber daya 3.3V.

  2. Rakit rangkaian sesuai gambar:

  • LED RGB ke PB12, PB13, PB14 via resistor.

  • Buzzer ke PA2.

  • Sensor kelembaban ke PA0, VCC, GND.

  • Push button ke PB0.

  • Potensiometer untuk mengatur sensitivitas sensor.

  • 3. Program mikrokontroler untuk:

    • Membaca kelembaban tanah.

    • Mengatur warna LED RGB berdasarkan kelembaban.

    • Mengaktifkan buzzer saat tanah kering.

    • Menggunakan tombol (PB0) untuk memulai/ubah status sistem.

  • 4. Lakukan uji coba:

    • Tekan PB0 untuk memulai.

    • Amati perubahan warna LED dan bunyi buzzer saat kelembaban berubah.

    • Sesuaikan potensiometer untuk menguji respon sistem.

  • 5. Lakukan evaluasi:

    • Pastikan LED dan buzzer bekerja sesuai kondisi.

    • Cek fungsi tombol PB0.



  • 2. Hardware dan Diagram Blok [Kembali]
    • STM32
    STM32 adalah keluarga mikrokontroler berbasis arsitektur ARM Cortex yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini memiliki performa tinggi, konsumsi daya rendah, serta fitur periferal yang lengkap, seperti ADC (Analog to Digital Converter), komunikasi serial (UART, SPI, I2C), dan GPIO yang dapat dikonfigurasi sesuai kebutuhan. STM32 sering digunakan dalam sistem tertanam (embedded systems) untuk berbagai aplikasi, termasuk otomasi, robotika, dan perangkat IoT.
    • LED RGB
    LED RGB (Red, Green, Blue) adalah jenis LED yang mampu menghasilkan berbagai warna cahaya dengan mengatur intensitas dari tiga warna dasar: merah, hijau, dan biru. Dengan menggabungkan ketiga warna ini dalam berbagai tingkat kecerahan, LED RGB dapat menghasilkan spektrum warna yang luas. Komponen ini sering digunakan dalam pencahayaan dekoratif, tampilan visual interaktif, dan sistem indikator dalam berbagai perangkat elektronik.
    • Buzzer

    Buzzer adalah komponen elektronik yang digunakan untuk menghasilkan suara dalam berbagai frekuensi. Buzzer dapat bekerja berdasarkan prinsip piezoelektrik atau elektromagnetik untuk mengubah sinyal listrik menjadi getaran suara. Dalam sistem tertanam, buzzer sering digunakan sebagai alarm, notifikasi audio, atau indikator peringatan dalam perangkat elektronik seperti jam tangan, sistem keamanan, dan mesin industri.

    • Soil Moisture Sensor



    Sensor kelembaban tanah adalah alat yang digunakan untuk mengukur kadar kelembaban (kandungan air) dalam tanah. Sensor ini bekerja dengan cara mendeteksi resistansi listrik yang terjadi di dalam tanah. Ketika kelembaban tanah tinggi, resistansi akan rendah, dan sebaliknya, ketika tanah kering, resistansi akan tinggi. Fungsi utama dari sensor kelembaban tanah adalah untuk memberikan informasi mengenai tingkat kelembaban tanah pada suatu lokasi. Data ini digunakan dalam sistem otomatisasi pertanian, seperti pengaturan penyiraman tanaman. Ketika kelembaban tanah mencapai tingkat yang rendah, sensor ini dapat mengaktifkan sistem penyiraman atau memberikan peringatan.
    • Breadboard


    • Breadboard adalah sebuah papan yang digunakan untuk merancang dan menguji rangkaian elektronik secara sementara tanpa perlu menyolder komponen. Breadboard memungkinkan perakitan rangkaian secara cepat dan mudah, sehingga sangat berguna dalam prototyping dan eksperimen elektronik.

    • Jumper male to male


    • Kabel jumper Male to Male adalah kabel yang memiliki konektor jantan (male) di kedua ujungnya. Kabel ini biasanya digunakan untuk menghubungkan pin pada board elektronik, seperti Raspberry Pi, Arduino, atau breadboard, dengan komponen lainnya. Kabel jumper male to male sering digunakan dalam rangkaian prototyping atau percobaan karena fleksibilitas dan kemudahannya untuk digunakan.

    • Push Button
    Push button adalah saklar atau tombol yang digunakan untuk menghubungkan atau memutuskan sirkuit listrik. Tombol ini biasanya bersifat sementara (momentary), yang berarti ketika tombol ditekan, arus listrik akan mengalir, dan ketika tombol dilepaskan, arus listrik akan terputus. Fungsi utama push button adalah untuk memberikan input atau perintah ke sistem. Dalam rangkaian ini, push button dapat digunakan untuk mengaktifkan atau mengubah status sistem, seperti memulai pembacaan sensor kelembaban tanah atau mengubah mode kerja rangkaian.


    • Resistor

    Resistor adalah komponen elektronik yang digunakan untuk membatasi atau mengatur aliran arus listrik dalam suatu rangkaian. Resistor bekerja dengan cara menambah hambatan pada rangkaian, yang bergantung pada nilai resistansi yang diberikan (dalam ohm). Resistor berfungsi untuk mengatur arus listrik yang mengalir pada komponen lain, seperti LED RGB atau sensor. Dalam rangkaian ini, resistor digunakan untuk melindungi LED RGB dari aliran arus yang berlebihan, serta untuk menyesuaikan sinyal yang diterima oleh sensor kelembaban tanah.
    • Blok diagram



    3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
    Rangkaian :


    Prinsip Kerja Rangkaian:

    Rangkaian ini dirancang untuk memantau kelembaban tanah menggunakan sensor soil moisture yang terhubung ke pin analog PA0 pada mikrokontroler STM32F103C8. Nilai kelembaban yang dibaca dari sensor akan diproses oleh mikrokontroler untuk mengendalikan LED RGB dan buzzer sebagai indikator visual dan audio.

    Dalam kondisi tanah normal, mikrokontroler akan menyalakan LED biru (pin PB14 aktif). Jika sensor mendeteksi tanah dalam kondisi kering (kelembaban rendah), maka LED hijau (PB13) akan menyala dan buzzer (pada pin PA2) kondisi mati. Sebaliknya, jika tanah dalam kondisi basah (kelembaban tinggi), LED merah (PB12) akan menyala dan buzzer tetap aktif untuk memberi tanda bahwa kelembaban terlalu tinggi. Tombol tekan (PB0) digunakan untuk memulai atau mereset sistem. Nilai ambang kelembaban dapat diatur menggunakan potensiometer (RV2) yang mempengaruhi input ke sensor, sehingga sistem dapat dikalibrasi sesuai kebutuhan.



    4. Flowchart dan Listing Program [Kembali]

    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




    5. Video Demo [Kembali]






    6. Analisa [Kembali]







    7. Download File [Kembali]

    Download Video Demo Disini

    Tidak ada komentar:

    Posting Komentar