Tugas Pendahuluan 1



 Kontrol Lampu Lorong 


a. Prosedur [Kembali]

1. Buka software proteus lalu rangkai komponen sesuai dengan gambar yang ada di modul

2. Buka software STM32CubeIDE lalu lakukan konfigurasi pin pada STM untuk menentukan GPIO input dan GPIO output

3. Masukan Program ke dalam software STM32CubeIDE lalu build untuk mendapatkan file .hex

4. Masukan file .hex ke dalam file library STM32F103C8 pada proteus

5. Simulasikan rangkaian

b. Hardware dan Diagram Blok [Kembali]

  • Hardwere
1. STM32F103C8





2. Touch Sensor



3. PIR Sensor



4. LED



5. Buzzer



6. Resistor 


  • Diagram Blog


c. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

  • Rangkaian Simulasi


  • Prinsip Kerja

    Pada rangkaian tersebut, sensor PIR berfungsi sebagai pendeteksi gerakan, sedangkan sensor touch berfungsi sebagai input sentuhan manual tambahan. Output dari kedua sensor ini dibaca secara terus-menerus (real-time) oleh mikrokontroler (STM32) untuk mengendalikan aktuator berupa LED dan buzzer.

    Prinsip kerja utama dari sistem ini menggunakan logika pemantauan langsung terhadap status kedua sensor:

  1. Kondisi Aktif (Terdapat Aktivitas): Jika salah satu sensor aktif, baik itu sensor PIR mendeteksi adanya gerakan di lorong, ATAU sensor touch disentuh oleh pengguna maka sensor yang aktif tersebut akan mengirimkan sinyal logika HIGH ke mikrokontroler. Mikrokontroler kemudian merespons dengan menyalakan LED. Selain itu, mikrokontroler juga diprogram untuk membunyikan buzzer secara singkat (beep selama 100ms) pada saat awal gerakan atau sentuhan pertama terdeteksi sebagai indikator audio. Selama masih ada gerakan yang ditangkap PIR atau sensor touch masih ditahan, LED akan tetap dipertahankan menyala.

  2. Kondisi Pasif (Sesuai Kondisi yang Diminta): Sebaliknya, pada kondisi di mana area lorong sepenuhnya kosong yaitu sensor PIR tidak mendeteksi adanya gerakan sama sekali, DAN sensor touch juga tidak sedang disentuh maka kedua sensor secara bersamaan mengirimkan sinyal logika LOW ke mikrokontroler. Berdasarkan instruksi program, saat mikrokontroler membaca bahwa tidak ada input aktivitas dari kedua jalur tersebut, maka mikrokontroler akan langsung mematikan LED dan buzzer tetap diam. Status pemicu (trigger) juga akan di-reset pada kondisi ini, sehingga sistem siap untuk berbunyi kembali jika nanti terdeteksi aktivitas baru.


d. Flowchart dan Listing Program [Kembali]

  • Flowchart



  • Listing Program

#include "stm32f1xx_hal.h" // Memanggil library utama untuk STM32 seri F1


// Variabel untuk memastikan buzzer hanya berbunyi sekali di awal (edge-trigger)

uint8_t touch_last = 0; // Menyimpan status sentuhan sebelumnya

uint8_t pir_first_trigger = 1; // Menandai apakah ini deteksi gerak pertama kali


void SystemClock_Config(void); // Deklarasi pengaturan clock (kecepatan)

static void MX_GPIO_Init(void); // Deklarasi pengaturan pin input/output

void Error_Handler(void); // Deklarasi penanganan jika terjadi error


int main(void) // Fungsi utama yang pertama kali dijalankan

{

HAL_Init(); // Memulai sistem HAL (wajib di awal)

SystemClock_Config(); // Mengatur kecepatan mikrokontroler

MX_GPIO_Init(); // Menyiapkan pin-pin yang akan dipakai


while (1) // Looping program utama (berjalan terus-menerus)

{

// Membaca status sensor dari pin

uint8_t touch_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1); // Baca Touch Sensor di PA1

uint8_t pir_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2); // Baca PIR Sensor di PA2


// KONDISI AMAN: Tidak ada gerakan DAN Tidak disentuh

if (pir_now == GPIO_PIN_RESET && touch_now == GPIO_PIN_RESET)

{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // Matikan LED di PB0


// Reset pengunci agar buzzer siap bunyi lagi jika nanti ada pemicu baru

pir_first_trigger = 1;

touch_last = 0;

}

else // KONDISI TERDETEKSI: Ada gerakan ATAU sedang disentuh

{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // Nyalakan LED di PB0


// Jika PIR mendeteksi gerakan DAN buzzer belum pernah bunyi untuk gerakan ini

if (pir_now == GPIO_PIN_SET && pir_first_trigger == 1)

{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // Nyalakan Buzzer di PB1

HAL_Delay(100); // Bunyi selama 0.1 detik

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // Matikan Buzzer


pir_first_trigger = 0; // Kunci sistem agar buzzer tidak bunyi terus-terusan

}


// Jika Touch disentuh DAN sebelumnya belum disentuh

if (touch_now == GPIO_PIN_SET && touch_last == 0)

{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // Nyalakan Buzzer di PB1

HAL_Delay(100); // Bunyi selama 0.1 detik

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // Matikan Buzzer


touch_last = 1; // Kunci sistem agar buzzer tidak bunyi terus-terusan selama masih dipegang

}

}

}

}


void SystemClock_Config(void) // Fungsi pengaturan detak/clock sistem

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Wadah konfigurasi osilator

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // Wadah konfigurasi clock


// Memakai clock internal (HSI) bawaan pabrik

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; // Tanpa pengali kecepatan (PLL)

if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) // Terapkan, jika gagal masuk Error_Handler

Error_Handler();


// Atur pembagian clock untuk berbagai jalur (AHB, APB1)

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) // Terapkan, jika gagal masuk Error_Handler

Error_Handler();

}


static void MX_GPIO_Init(void) // Fungsi pengaturan Input/Output Pin

{

GPIO_InitTypeDef GPIO_InitStruct = {0}; // Wadah konfigurasi pin


__HAL_RCC_GPIOA_CLK_ENABLE(); // Nyalakan aliran listrik untuk Port A

__HAL_RCC_GPIOB_CLK_ENABLE(); // Nyalakan aliran listrik untuk Port B


// Konfigurasi PA1 (Touch) dan PA2 (PIR) sebagai INPUT

GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2; // Pilih pin 1 dan 2

GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // Set sebagai penerima sinyal (Input)

GPIO_InitStruct.Pull = GPIO_NOPULL; // Tanpa resistor penarik bawaan

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Terapkan ke Port A


// Konfigurasi PB0 (LED) dan PB1 (Buzzer) sebagai OUTPUT

GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; // Pilih pin 0 dan 1

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Set sebagai pengirim arus (Output Push-Pull)

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Kecepatan perubahan sinyal standar/rendah

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // Terapkan ke Port B


// Beri nilai awal MATI (0) untuk LED dan Buzzer saat sistem baru menyala

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);

}


void Error_Handler(void) // Fungsi darurat jika inisialisasi sistem gagal

{

__disable_irq(); // Matikan semua interupsi

while(1) // Terjebak di sini selamanya (sistem hang/berhenti)

{

}

}


e. Video Demo [Kembali]


f. Kondisi [Kembali]

Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi ketika PIR tidak mendeteksi gerakan dan sensor Touch tidak mendeteksi sentuhan, maka LED akan mati

g. Video Simulasi [Kembali]




h. Download File [Kembali]

File TP [Download]



Kembali ke Halaman Atas

 

 

Komentar

Postingan populer dari blog ini