#include "stm32c0xx_hal.h"
#include <stdio.h>
// 핀 정의
#define PIR_PORT GPIOD
#define PIR_PIN GPIO_PIN_3
#define TRIG_PORT GPIOA
#define TRIG_PIN GPIO_PIN_5
#define ECHO_PORT GPIOA
#define ECHO_PIN GPIO_PIN_6
#define LED_PORT GPIOD
#define LED_PIN GPIO_PIN_0
#define BUZZER_PORT GPIOA
#define BUZZER_PIN GPIO_PIN_7 // bz1:2 (Positive) 연결 핀
// 💡 Wokwi 내부의 C++ 컴파일러가 LIB_TLCD.c의 함수를 정확히 찾을 수 있도록 선언 수정
#ifdef __cplusplus
extern "C" {
#endif
// 만약 LIB_TLCD.c가 C로 컴파일된다면 이 규칙을 따릅니다.
void UART1_Init(void);
#ifdef __cplusplus
}
#endif
// 만약 위의 처리로도 안 될 경우를 대비해, C++ 규격으로도 한 번 더 매칭되도록 선언
extern void UART1_Init(void);
// 아두이노/HAL 내장 마이크로초 딜레이 대용 함수
void delay_us(uint16_t us)
{
volatile uint16_t i = us * 10;
while(i--);
}
// 초음파 센서 거리 측정 함수
uint32_t get_distance(void)
{
uint32_t count = 0;
// 1. TRIG 핀에 10us 동안 High 트리거 신호 출력
HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_SET);
delay_us(10);
HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET);
// 2. ECHO 핀이 HIGH가 될 때까지 대기
uint32_t timeout = 100000;
while(HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN) == GPIO_PIN_RESET && timeout > 0) {
timeout--;
}
// 3. ECHO 핀이 HIGH인 동안 시간(카운트) 측정
while(HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN) == GPIO_PIN_SET)
{
count++;
delay_us(1);
if(count > 30000) break;
}
// 거리를 cm 단위로 변환
return (uint32_t)(count * 0.034 / 2);
}
// NeoPixel 제어 신호 송신 가상 함수
void WS2812_Set_Color(uint8_t r, uint8_t g, uint8_t b)
{
// 테스트용 트리거 유지
}
int main(void)
{
// 시스템 및 HAL 초기화
HAL_Init();
// 💡 LIB_TLCD.c에 정의된 UART1_Init을 호출하여 printf 활성화
UART1_Init();
// 변수 선언
uint32_t distance = 0;
GPIO_PinState motion_status = GPIO_PIN_RESET;
printf("--- Smart Security System Started ---\n");
while (1)
{
// 1. PIR 센서 값 상태 읽기
motion_status = HAL_GPIO_ReadPin(PIR_PORT, PIR_PIN);
// 2. 초음파 거리 측정
distance = get_distance();
// 3. 조건 검사: 움직임이 있고 감지 거리가 20cm 미만일 때
if (motion_status == GPIO_PIN_SET && distance < 20)
{
printf("⚠️ ALERT! Motion Detected! Distance: %ld cm\n", distance);
// NeoPixel 스트립 켜기 (빨간색)
WS2812_Set_Color(255, 0, 0);
// 부저 울리기 (bz1:2 핀에 HIGH 인가)
HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_SET);
}
else
{
// NeoPixel 스트립 끄기
WS2812_Set_Color(0, 0, 0);
// 부저 끄기 (bz1:2 핀에 LOW 인가)
HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_RESET);
}
// 루프 주기 딜레이 (200ms)
HAL_Delay(200);
}
}