TP MODUL 1 PERCOBAAN 1



                                                         Kontrol Lampu Lorong 

1. 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



2. Hardware dan Diagram Blok [Kembali]

STM32F103C8


Touch Sensor


PIR Sensor

LED

Buzzer

Resistor


Diagram Blok


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



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]






 

 

Komentar

Postingan populer dari blog ini

TUGAS BESAR

Aplikasi Counter

TUGAS BESAR