Laporan Akhir 1
a. Prosedur
c. Rangkaian Simulasi dan Prinsip Kerja
Sistem ini bekerja dengan memanfaatkan sensor PIR sebagai pendeteksi gerakan, sensor sentuh sebagai input manual, serta mikrokontroler STM32 sebagai pusat kendali. Ketika sensor PIR menangkap adanya pergerakan, keluarannya berubah menjadi logika HIGH, yang kemudian dibaca oleh mikrokontroler untuk mengaktifkan LED sebagai lampu penerangan. Pada saat yang sama, mikrokontroler menjalankan fungsi penundaan waktu (delay timer) agar lampu tetap menyala selama durasi tertentu, meskipun tidak ada gerakan lanjutan.
Dalam kondisi di mana sensor PIR terus mendeteksi gerakan sebelum waktu tunda berakhir dan sensor touch tidak digunakan, setiap sinyal HIGH dari PIR akan membuat mikrokontroler mengulang kembali perhitungan waktu dari awal. Akibatnya, waktu tunda tidak pernah selesai karena selalu diperbarui oleh deteksi gerakan berikutnya. Karena sensor touch tetap dalam keadaan tidak aktif (LOW), sistem sepenuhnya bergantung pada input dari PIR. Hal ini menyebabkan LED tetap menyala terus menerus selama masih ada aktivitas yang terdeteksi.
Dengan demikian, sistem dirancang agar lampu hanya akan padam ketika tidak ada gerakan sama sekali dalam rentang waktu tertentu hingga delay benar-benar habis. Selain itu, buzzer dapat berfungsi sebagai indikator tambahan misalnya memberikan peringatan suara saat gerakan pertama kali terdeteksi atau saat sistem aktif sehingga meningkatkan aspek keamanan dan respons sistem terhadap kondisi di sekitarnya.
d. Flowchart dan Listing Program
#include "main.h"
uint8_t system_enable = 1;
uint8_t touch_last = 0;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
uint8_t touch_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
if (touch_now == GPIO_PIN_SET && touch_last == GPIO_PIN_RESET)
{
system_enable = !system_enable;
HAL_Delay(200);
}
touch_last = touch_now;
if (system_enable)
{
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
}
}
else
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
}
}
}
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_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = 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_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif
Komentar
Posting Komentar