#include "main.h"
#include <stdio.h>
// ================= HANDLE =================
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;
UART_HandleTypeDef huart2;
// ================= VARIABLE =================
volatile uint8_t emergency_mode = 0;
uint32_t last_motion_time = 0;
uint8_t last_button_state = 1;
// ================= CLOCK =================
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;
HAL_RCC_OscConfig(
&RCC_OscInitStruct
);
RCC_ClkInitStruct.ClockType =
RCC_CLOCKTYPE_HCLK |
RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource =
RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider =
RCC_SYSCLK_DIV1;
HAL_RCC_ClockConfig(
&RCC_ClkInitStruct,
FLASH_LATENCY_0
);
}
// ================= UART =================
void MX_USART2_UART_Init(void)
{
__HAL_RCC_USART2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// PA2 = TX
GPIO_InitStruct.Pin =
GPIO_PIN_2;
GPIO_InitStruct.Mode =
GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull =
GPIO_NOPULL;
GPIO_InitStruct.Speed =
GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate =
GPIO_AF1_USART2;
HAL_GPIO_Init(
GPIOA,
&GPIO_InitStruct
);
huart2.Instance =
USART2;
huart2.Init.BaudRate =
115200;
huart2.Init.WordLength =
UART_WORDLENGTH_8B;
huart2.Init.StopBits =
UART_STOPBITS_1;
huart2.Init.Parity =
UART_PARITY_NONE;
huart2.Init.Mode =
UART_MODE_TX_RX;
HAL_UART_Init(
&huart2
);
}
// Redirect printf ke UART
int __io_putchar(int ch)
{
HAL_UART_Transmit(
&huart2,
(uint8_t *)&ch,
1,
HAL_MAX_DELAY
);
return ch;
}
// ================= GPIO =================
void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// PIR → PA1
GPIO_InitStruct.Pin =
PIR_PIN;
GPIO_InitStruct.Mode =
GPIO_MODE_INPUT;
GPIO_InitStruct.Pull =
GPIO_NOPULL;
HAL_GPIO_Init(
PIR_PORT,
&GPIO_InitStruct
);
// BUTTON → PB1
GPIO_InitStruct.Pin =
BUTTON_PIN;
GPIO_InitStruct.Mode =
GPIO_MODE_INPUT;
GPIO_InitStruct.Pull =
GPIO_PULLUP;
HAL_GPIO_Init(
BUTTON_PORT,
&GPIO_InitStruct
);
// LED PWM → PA6
GPIO_InitStruct.Pin =
LED_PIN;
GPIO_InitStruct.Mode =
GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull =
GPIO_NOPULL;
GPIO_InitStruct.Speed =
GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate =
GPIO_AF1_TIM3;
HAL_GPIO_Init(
LED_PORT,
&GPIO_InitStruct
);
}
// ================= ADC =================
void MX_ADC1_Init(void)
{
__HAL_RCC_ADC_CLK_ENABLE();
hadc1.Instance = ADC1;
hadc1.Init.Resolution =
ADC_RESOLUTION_12B;
hadc1.Init.DataAlign =
ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode =
ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode =
DISABLE;
HAL_ADC_Init(
&hadc1
);
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel =
ADC_CHANNEL_0;
sConfig.Rank =
ADC_REGULAR_RANK_1;
HAL_ADC_ConfigChannel(
&hadc1,
&sConfig
);
}
// ================= PWM =================
void MX_TIM3_Init(void)
{
__HAL_RCC_TIM3_CLK_ENABLE();
htim3.Instance =
TIM3;
htim3.Init.Prescaler =
64;
htim3.Init.Period =
1000;
htim3.Init.CounterMode =
TIM_COUNTERMODE_UP;
HAL_TIM_PWM_Init(
&htim3
);
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode =
TIM_OCMODE_PWM1;
sConfigOC.Pulse =
0;
HAL_TIM_PWM_ConfigChannel(
&htim3,
&sConfigOC,
TIM_CHANNEL_1
);
}
// ================= HELPER =================
uint16_t read_LDR(void)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(
&hadc1,
HAL_MAX_DELAY
);
return HAL_ADC_GetValue(&hadc1);
}
void set_LED(uint16_t value)
{
__HAL_TIM_SET_COMPARE(
&htim3,
TIM_CHANNEL_1,
value
);
}
// ================= MAIN =================
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM3_Init();
MX_USART2_UART_Init();
HAL_TIM_PWM_Start(
&htim3,
TIM_CHANNEL_1
);
printf("Sistem Monitoring LDR dan PIR Aktif\r\n");
while (1)
{
// ===== BUTTON =====
uint8_t current_button =
HAL_GPIO_ReadPin(
BUTTON_PORT,
BUTTON_PIN
);
if (
last_button_state == 1 &&
current_button == 0
)
{
emergency_mode =
!emergency_mode;
printf("Emergency Mode Toggle\r\n");
HAL_Delay(50);
}
last_button_state =
current_button;
// ===== EMERGENCY MODE =====
if (emergency_mode)
{
printf("Emergency Mode Aktif - LED Mati\r\n");
set_LED(LED_OFF);
HAL_Delay(500);
continue;
}
uint16_t ldr =
read_LDR();
uint8_t pir =
HAL_GPIO_ReadPin(
PIR_PORT,
PIR_PIN
);
printf("Nilai LDR: %d\r\n", ldr);
// ===== GELAP =====
if (ldr >= LDR_THRESHOLD)
{
printf("Kondisi Gelap\r\n");
if (pir == GPIO_PIN_SET)
{
printf("Gerakan Terdeteksi\r\n");
last_motion_time =
HAL_GetTick();
set_LED(LED_FULL);
printf("LED Menyala Sangat Terang Selama 5 Detik\r\n");
}
if (
HAL_GetTick() -
last_motion_time
>= MOTION_TIMEOUT
)
{
set_LED(LED_OFF);
printf("LED Mati Kembali\r\n");
}
}
else
{
printf("Kondisi Terang - LED Mati\r\n");
set_LED(LED_OFF);
}
HAL_Delay(1000);
}
}
Tidak ada komentar:
Posting Komentar