TP MODUL 1 PERCOBAAN 1
Kontrol Lampu Lorong
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
2. Hardware dan Diagram Blok [Kembali]
3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
Pada rangkaian kontrol lampu lorong yang ditampilkan di Proteus, warna pada jalur sinyal menunjukkan kondisi logika dari rangkaian, yaitu merah menandakan logika HIGH (tegangan aktif sekitar 5V) dan biru menandakan logika LOW (0V atau tidak aktif). Sistem ini terdiri dari sensor PIR sebagai pendeteksi gerakan, sensor touch sebagai input manual, mikrokontroler STM32 sebagai pengendali utama, serta LED yang berfungsi sebagai lampu lorong dan buzzer sebagai indikator tambahan. Ketika sensor PIR mendeteksi adanya gerakan, output-nya akan berubah menjadi HIGH (ditandai warna merah), kemudian sinyal tersebut dibaca oleh mikrokontroler untuk menyalakan LED. Bersamaan dengan itu, mikrokontroler juga mengaktifkan mekanisme waktu tunda (delay timer) yang berfungsi untuk mempertahankan kondisi lampu tetap menyala selama beberapa waktu meskipun tidak ada gerakan lanjutan.
Pada kondisi yang diberikan, yaitu ketika sensor PIR mendeteksi gerakan secara berulang sebelum waktu tunda habis dan sensor touch tidak disentuh, maka setiap kali PIR mendeteksi gerakan (output HIGH), mikrokontroler akan terus mengulang atau mereset waktu tunda ke awal. Hal ini menyebabkan proses perhitungan waktu tidak pernah mencapai batas akhir untuk mematikan lampu. Karena sensor touch berada pada kondisi LOW (tidak disentuh), maka tidak ada pengaruh tambahan terhadap sistem, sehingga seluruh kendali hanya bergantung pada sensor PIR. Akibatnya, LED akan tetap berada dalam kondisi menyala karena sistem selalu menganggap masih ada aktivitas atau pergerakan di area tersebut. Dengan demikian, prinsip kerja rangkaian ini memastikan bahwa lampu lorong tetap aktif selama masih terdeteksi adanya gerakan, dan hanya akan mati jika tidak ada gerakan sama sekali hingga waktu tunda benar-benar habis.
4. Flowchart dan Listing Program [Kembali]
#include "stm32f1xx_hal.h"
/* Private variables ---------------------------------------------------------*/
uint8_t system_enable = 1; // default aktif
uint8_t touch_last = 0;
uint8_t pir_first_trigger = 1;
uint32_t pir_timer = 0;
#define PIR_DELAY 5000 // 5 detik
/* Function prototypes -------------------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void Error_Handler(void);
/* Main program --------------------------------------------------------------*/
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
// Baca input
uint8_t pir_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2); // PIR di PA2
uint8_t touch_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1); // Touch di PA1
// =============================
// TOUCH (TOGGLE SYSTEM)
// =============================
if (touch_now == GPIO_PIN_SET && touch_last == GPIO_PIN_RESET)
{
system_enable = !system_enable;
// Buzzer indikator saat ON
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); // anti bouncing
}
touch_last = touch_now;
// =============================
// LOGIKA SISTEM
// =============================
if (system_enable)
{
// ===== PIR DETEKSI =====
if (pir_now == GPIO_PIN_SET)
{
// Reset timer setiap ada gerakan
pir_timer = HAL_GetTick();
// Nyalakan LED
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
// Buzzer hanya sekali saat trigger awal
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
{
// ===== TIDAK ADA GERAKAN =====
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 → LED mati
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
pir_first_trigger = 1;
}
}
}
else
{
// ===== SISTEM OFF =====
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
}
}
}
/* System Clock Configuration -----------------------------------------------*/
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();
}
/* GPIO Initialization -------------------------------------------------------*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// ===== INPUT =====
// PA1 = Touch, PA2 = PIR
GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// ===== OUTPUT =====
// PB0 = LED, PB1 = Buzzer
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);
// Kondisi awal OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);
}
/* Error Handler -------------------------------------------------------------*/
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif
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
- Download File Rangkaian (klik disini)
- Download Video Penjelasan Rangkaian (klik disini)
- Download Video Demo Rangkaian
- Download Datasheet Touch Sensor (klik disini)
- Download Datasheet Pir Sensor (klik disini)
- Download Datasheet Resistor (klik disini)
- Download Datasheet LED (klik disini)
- Download Datasheet Buzzer (klik disini)
Komentar
Posting Komentar