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
- 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:
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.
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]
Komentar
Posting Komentar