[menuju akhir]


Langkah-langkah percobaan :

1. Siapkan alat dan bahan yaitu dengan komponen utama STM32F103C8, touch sensor, PIR sensor, Resistor, LED, Buzzer

2. Rangkai sesuai gambar percobaan

3. Rancang kerja rangkaian sesuai flowchart 

4. Inisialisasi STM32F103C8 dengan aplikasi STM32CUBE ID

5. Setelah dapat file hex nya, masukkan file hex ke dalam stm pada proteus

4. Tekan tombol “Play” untuk menjalankan simulasi


2. Hardware dan Diagram Blok [Kembali]
a. Hardware
1. STM32F103C8
TM32F103C8 adalah mikrokontroler berbasis ARM Cortex-M3 yang  dikembangkan oleh STMicroelectronics. Mikrokontroler ini sering digunakan dalam pengembangan sistem tertanam karena kinerjanya yang baik, konsumsi daya yang rendah, dan kompatibilitas dengan berbagai protokol komunikasi. Pada praktikum ini, kita menggunakan STM32F103C8 yang dapat diprogram menggunakan berbagai  metode, termasuk komunikasi serial (USART), SWD (Serial Wire Debug), atau JTAG untuk berhubungan dengan komputer maupun perangkat lain.

2. Touch Sensor

Touch sensor adalah sensor yang dapat mendeteksi sentuhan atau kontak dari jari manusia (atau objek lain) dan kemudian mengubahnya menjadi sinyal listrik.

3. PIR Sensor
PIR sensor (Passive Infrared Sensor) adalah sensor yang digunakan untuk mendeteksi pergerakan manusia atau makhluk hidup berdasarkan perubahan radiasi inframerah di sekitarnya.

4. LED

LED adalah dioda semikonduktor yang dapat memancarkan cahaya ketika dialiri arus listrik. LED digunakan dalam berbagai aplikasi seperti indikator elektronik, pencahayaan, dan display. LED hanya bekerja pada arah bias maju dan memiliki berbagai warna yang ditentukan oleh material semikonduktornya.

5. Buzzer
Buzzer adalah suatu komponen elektronika yang berfungsi untuk mengubah energi listrik menjadi energi suara (bunyi) melalui mekanisme getaran. Komponen ini termasuk dalam kategori output device karena digunakan untuk memberikan respon berupa suara terhadap suatu kondisi atau perintah dalam rangkaian elektronik.

6. Resistor 

Resistor adalah komponen elektronik pasif yang berfungsi untuk membatasi arus listrik dalam suatu rangkaian. Resistor bekerja berdasarkan hukum Ohm, yang menyatakan bahwa tegangan (V) = arus (I) × resistansi (R). Resistor memiliki satuan Ohm (Ω) dan digunakan dalam berbagai aplikasi seperti pembagian tegangan, kontrol arus, dan proteksi rangkaian elektronik.

b. Diagram Blok



3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]


Prinsip Kerja :

Prinsip kerja rangkaian kontrol lampu lorong dengan program tersebut dimulai ketika sistem diberi catu daya, di mana mikrokontroler STM32 akan melakukan inisialisasi melalui fungsi HAL, konfigurasi clock, serta pengaturan pin GPIO sebagai input (sensor PIR dan touch) dan output (LED dan buzzer). Setelah inisialisasi selesai, sistem akan masuk ke dalam loop utama yang berjalan terus-menerus untuk membaca kondisi kedua sensor tersebut secara real-time.

Pada kondisi awal, sistem berada dalam mode otomatis dengan variabel system_enable bernilai 0, sehingga pengendalian lampu sepenuhnya bergantung pada sensor PIR. Ketika sensor PIR mendeteksi adanya gerakan, sinyal HIGH akan dikirim ke mikrokontroler dan sistem akan langsung menyalakan LED sebagai lampu lorong. Selain itu, pada deteksi pertama, buzzer akan berbunyi singkat sebagai indikator adanya aktivitas. Bersamaan dengan itu, sistem akan mencatat waktu deteksi menggunakan fungsi HAL_GetTick() ke dalam variabel pir_timer. Waktu ini menjadi acuan untuk perhitungan waktu tunda (delay).

Selanjutnya, selama masih berada dalam rentang waktu tunda yang telah ditentukan (5 detik), LED akan tetap menyala. Hal yang menjadi inti dari sistem ini adalah ketika terjadi gerakan berulang sebelum waktu tunda habis, maka setiap deteksi baru dari sensor PIR akan meng-update nilai pir_timer ke waktu saat itu. Dengan demikian, perhitungan waktu tunda akan di-reset kembali dari awal, sehingga LED tidak akan pernah mati selama masih ada aktivitas yang terdeteksi secara berulang dalam interval waktu tersebut. Inilah yang menyebabkan lampu lorong tetap menyala terus menerus selama ada pergerakan.

Di sisi lain, sensor touch berfungsi sebagai kontrol manual untuk mengaktifkan atau menonaktifkan mode override melalui mekanisme toggle. Ketika sensor touch disentuh, nilai system_enable akan berubah (toggle), dan jika aktif, maka sistem akan memaksa LED untuk tetap menyala tanpa memperhatikan kondisi sensor PIR maupun waktu tunda. Namun, pada kondisi yang dimaksud (sensor touch tidak disentuh), maka mode manual tidak aktif dan sistem sepenuhnya bekerja secara otomatis berdasarkan deteksi PIR.

Apabila tidak ada lagi gerakan yang terdeteksi hingga selisih waktu antara waktu sekarang dan pir_timer melebihi batas delay yang ditentukan, maka LED akan dimatikan secara otomatis selama mode manual tidak aktif. Dengan demikian, keseluruhan sistem bekerja secara adaptif, yaitu menyalakan lampu saat ada aktivitas, mempertahankan nyala lampu jika terjadi gerakan berulang sebelum waktu tunda habis, dan mematikan lampu secara otomatis ketika tidak ada aktivitas dalam periode waktu tertentu.

4. Flowchart dan Listing Program [Kembali]
a. Flowchart



b. Listing Program

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file : main.c
  * @brief : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2026 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx_hal.h"

uint8_t system_enable = 0;
uint8_t touch_last = 0;
uint8_t pir_first_trigger = 1;

uint32_t pir_timer = 0;
#define PIR_DELAY 5000 // waktu tunda 5 detik

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void Error_Handler(void);

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();

    while (1)
    {
        uint8_t pir_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
        uint8_t touch_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);

        // ===== TOUCH TOGGLE =====
        if (touch_now == GPIO_PIN_SET && touch_last == GPIO_PIN_RESET)
        {
            system_enable = !system_enable;

            if (system_enable)
            {
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
                HAL_Delay(100);
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
            }
            HAL_Delay(200);
        }
        touch_last = touch_now;

        // ===== PIR LOGIC =====
        if (pir_now == GPIO_PIN_SET)
        {
            pir_timer = HAL_GetTick(); // reset timer setiap ada gerakan

            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);

            if (pir_first_trigger)
            {
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
                HAL_Delay(100);
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
                pir_first_trigger = 0;
            }
        }
        else
        {
            pir_first_trigger = 1;
        }

        // ===== DELAY LOGIC =====
        if ((HAL_GetTick() - pir_timer) < PIR_DELAY)
        {
            // masih dalam waktu tunda → LED tetap nyala
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
        }
        else
        {
            // waktu habis → cek system enable
            if (!system_enable)
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
        }

        // ===== SYSTEM ENABLE OVERRIDE =====
        if (system_enable)
        {
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
        }
    }
}
           void SystemClock_Config(void)
           {
               RCC_OscInitTypeDef RCC_OscInitStruct = {0};
               RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

               RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
               RCC_OscInitStruct.HSIState = RCC_HSI_ON;
               RCC_OscInitStruct.HSICalibrationValue =
           RCC_HSICALIBRATION_DEFAULT;
               RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
               if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
                   Error_Handler();

               RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |
           RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
               RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
               RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
               RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
               if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) !=
           HAL_OK)
                   Error_Handler();
           }

           static void MX_GPIO_Init(void)
           {
               GPIO_InitTypeDef GPIO_InitStruct = {0};

               __HAL_RCC_GPIOA_CLK_ENABLE();
               __HAL_RCC_GPIOB_CLK_ENABLE();

               GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
               GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
               GPIO_InitStruct.Pull = GPIO_NOPULL;
               HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

               GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
               GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
               GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
               HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

               HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_RESET);
           }
           void Error_Handler(void)
           {
               __disable_irq();
               while(1)
               {
               }
           }

#ifdef USE_FULL_ASSERT
/**
  * @brief Reports the name of the source file and the source line number
  * where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
 

5. Video Demo [Kembali]


6. Kondisi [Kembali]

Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi PIR mendeteksi gerakan berulang sebelum waktu tunda habis dan sensor Touch tidak disentuh, maka LED tetap menyala 

7. Video Simulasi [Kembali]


8. Download File [Kembali]
1. Download File Rangkaian 
2. Download Video Simulasi
3. Download File HTML


Komentar

Postingan populer dari blog ini