Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
F
flame-node
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
ThiefSil
flame-node
Commits
ff42c792
Commit
ff42c792
authored
4 months ago
by
도혁 함
Browse files
Options
Downloads
Patches
Plain Diff
feat: sysfs방식으로 부저 제어
parent
171e9229
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
flame.c
+80
-69
80 additions, 69 deletions
flame.c
with
80 additions
and
69 deletions
flame.c
+
80
−
69
View file @
ff42c792
...
...
@@ -6,8 +6,6 @@
#include
<arpa/inet.h>
#include
<fcntl.h>
#include
<time.h>
#include
<wiringPi.h>
#include
<softTone.h>
#include
<signal.h>
#define BUFFER_MAX 3
...
...
@@ -20,63 +18,75 @@
#define HIGH 1
#define BUFFER_SIZE 1024
#define POUT 23 // 초음파 트리거 핀
#define PIN 24 // 초음파 에코 핀
#define POUT 23
// 초음파 트리거 핀
#define PIN 24
// 초음파 에코 핀
#define FLAME 21 // 불꽃 센서 핀
#define GREEN 17 //초록색 LED 핀
#define RED 22 //적색 LED 핀
#define BUZZER 27 //부저 핀
#define GREEN 17 //
초록색 LED 핀
#define RED 22
//
적색 LED 핀
#define BUZZER 27 //
부저 핀
int
fireAlarmNotes
[]
=
{
880
,
880
,
0
,
880
,
880
,
0
,
988
,
988
,
0
,
880
,
880
,
0
};
struct
sockaddr_in
server_addr
;
int
park
=
0
;
// 주차 상태: 0 = 주차되지 않음, 1 = 주차됨
int
setFire
=
1
;
// 화재 알림 상태: 1 = 화재 가능, 0 = 이미 화재 알림 보냄
int
sock
;
// 서버 소켓
int
redLed
=
2
;
// 적색 LED의 초기 설정값
int
setFire
=
1
;
int
sock
;
int
redLed
=
2
;
int
CLEAR
=
1
;
pthread_t
ultra_thread
,
flame_thread
,
receive_thread
;
// GPIO 제어 함수 선언
int
GPIOExport
(
int
pin
);
int
GPIOUnexport
(
int
pin
);
int
GPIODirection
(
int
pin
,
int
dir
);
int
GPIORead
(
int
pin
);
int
GPIOWrite
(
int
pin
,
int
value
);
// 인터럽트
void
signal_handler
(
int
no
);
// 초음파 센서 측정 스레드
// PWM 기반 부저 소리 발생 함수
void
buzzerTone
(
int
pin
,
int
frequency
,
int
duration
)
{
int
period
=
1000000
/
frequency
;
// 주기 (마이크로초)
int
halfPeriod
=
period
/
2
;
for
(
int
i
=
0
;
i
<
(
duration
*
1000
/
period
);
i
++
)
{
GPIOWrite
(
pin
,
HIGH
);
usleep
(
halfPeriod
);
GPIOWrite
(
pin
,
LOW
);
usleep
(
halfPeriod
);
}
}
void
*
ultrasonic_sensor
(
void
*
arg
)
{
clock_t
start_t
,
end_t
;
double
time
;
while
(
1
)
{
GPIOWrite
(
POUT
,
HIGH
);
// 초음파 트리거 핀 HIGH
usleep
(
10
);
// 10 마이크로초 신호 유지
GPIOWrite
(
POUT
,
LOW
);
// 초음파 트리거 핀 LOW
// 에코 핀 신호 대기
while
(
GPIORead
(
PIN
)
==
LOW
)
start_t
=
clock
();
while
(
GPIORead
(
PIN
)
==
HIGH
)
end_t
=
clock
();
time
=
(
double
)(
end_t
-
start_t
)
/
CLOCKS_PER_SEC
;
// 시간 계산
double
distance
=
time
/
2
*
34000
;
// cm 단위 거리 계산
if
(
redLed
==
2
){
GPIOWrite
(
RED
,
HIGH
);
redLed
=
1
;
GPIOWrite
(
POUT
,
HIGH
);
usleep
(
10
);
GPIOWrite
(
POUT
,
LOW
);
while
(
GPIORead
(
PIN
)
==
LOW
)
start_t
=
clock
();
while
(
GPIORead
(
PIN
)
==
HIGH
)
end_t
=
clock
();
time
=
(
double
)(
end_t
-
start_t
)
/
CLOCKS_PER_SEC
;
double
distance
=
time
/
2
*
34000
;
if
(
redLed
==
2
)
{
GPIOWrite
(
RED
,
HIGH
);
redLed
=
1
;
}
if
(
park
==
0
&&
distance
<=
10
&&
redLed
==
1
)
{
// 10cm 이하 -> 주차
if
(
park
==
0
&&
distance
<=
10
&&
redLed
==
1
)
{
GPIOWrite
(
GREEN
,
HIGH
);
GPIOWrite
(
RED
,
LOW
);
park
=
1
;
redLed
=
0
;
printf
(
"0-PARK
\n
"
);
send
(
sock
,
"0-PARK"
,
strlen
(
"0-PARK"
),
0
);
}
else
if
(
park
==
1
&&
distance
>
10
&&
redLed
==
0
)
{
// 10cm 초과 -> 주차 해제
}
else
if
(
park
==
1
&&
distance
>
10
&&
redLed
==
0
)
{
GPIOWrite
(
GREEN
,
LOW
);
GPIOWrite
(
RED
,
HIGH
);
park
=
0
;
...
...
@@ -85,47 +95,47 @@ void *ultrasonic_sensor(void *arg) {
send
(
sock
,
"0-EXIT"
,
strlen
(
"0-EXIT"
),
0
);
}
usleep
(
500000
);
// 0.5초 주기
usleep
(
500000
);
}
return
NULL
;
}
// 불꽃 센서 감지 스레드
void
*
flame_sensor
(
void
*
arg
)
{
printf
(
"초기 FLAME 값: %d
\n
"
,
GPIORead
(
FLAME
));
wiringPiSetupGpio
();
softToneCreate
(
BUZZER
);
printf
(
"초기 FLAME 값은 %d
\n
"
,
GPIORead
(
FLAME
));
while
(
1
)
{
if
(
GPIORead
(
FLAME
)
==
0
&&
setFire
==
1
)
{
// 불꽃 감지
if
(
GPIORead
(
FLAME
)
==
0
&&
setFire
==
1
)
{
printf
(
"0-FIRE
\n
"
);
send
(
sock
,
"0-FIRE"
,
strlen
(
"0-FIRE"
),
0
);
setFire
=
0
;
// 더 이상 화재 신호 전송하지 않음
setFire
=
0
;
CLEAR
=
0
;
printf
(
"FLAME 값: %d
\n
"
,
GPIORead
(
FLAME
));
}
while
(
1
){
if
(
CLEAR
==
0
){
for
(
int
i
=
0
;
i
<
sizeof
(
fireAlarmNotes
)
/
sizeof
(
int
);
i
++
){
softToneWrite
(
BUZZER
,
fireAlarmNotes
[
i
]);
delay
(
200
);
}
}
else
{
softToneWrite
(
BUZZER
,
0
);
break
;
}
while
(
CLEAR
==
0
)
{
for
(
int
i
=
0
;
i
<
sizeof
(
fireAlarmNotes
)
/
sizeof
(
int
);
i
++
)
{
if
(
CLEAR
!=
0
)
{
break
;
}
if
(
fireAlarmNotes
[
i
]
>
0
)
{
buzzerTone
(
BUZZER
,
fireAlarmNotes
[
i
],
200
);
}
else
{
usleep
(
200000
);
}
}
if
(
CLEAR
!=
0
)
{
break
;
}
}
usleep
(
200000
);
// 0.2초 주기
GPIOWrite
(
BUZZER
,
LOW
);
usleep
(
200000
);
}
return
NULL
;
}
// 서버 메시지 수신 스레드
void
*
receive_message
(
void
*
arg
)
{
char
buffer
[
BUFFER_SIZE
];
int
valread
;
...
...
@@ -140,29 +150,28 @@ void *receive_message(void *arg) {
sock
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
);
if
(
sock
<
0
)
{
perror
(
"Socket creation error"
);
sleep
(
5
);
// 5초 대기 후 재시도
sleep
(
5
);
continue
;
}
if
(
connect
(
sock
,
(
struct
sockaddr
*
)
&
server_addr
,
sizeof
(
server_addr
))
<
0
)
{
perror
(
"Connection failed. 재연결 시도 중..."
);
close
(
sock
);
sleep
(
5
);
// 5초 대기 후 재시도
sleep
(
5
);
continue
;
}
printf
(
"서버에 재연결되었습니다.
\n
"
);
break
;
// 재연결 성공 시 루프 탈출
break
;
}
}
else
{
buffer
[
valread
]
=
'\0'
;
// 수신된 메시지 null-terminate
buffer
[
valread
]
=
'\0'
;
printf
(
"서버로부터 받은 메시지: %s
\n
"
,
buffer
);
buffer
[
strcspn
(
buffer
,
"
\r\n
"
)]
=
'\0'
;
if
(
strcmp
(
buffer
,
"
0-
CLEAR"
)
==
0
)
{
// 화재 해제 명령
setFire
=
1
;
// 화재 감지 준비 상태로 전환
CLEAR
=
1
;
// 0-CLEAR을 받았음
printf
(
"setFire
가 1로 설정되었습니다.
\n
"
);
if
(
strcmp
(
buffer
,
"CLEAR"
)
==
0
)
{
setFire
=
1
;
CLEAR
=
1
;
printf
(
"setFire
및 CLEAR가 %d, %d로 설정되었습니다.
\n
"
,
setFire
,
CLEAR
);
}
}
}
...
...
@@ -229,16 +238,18 @@ int main() {
GPIOUnexport
(
BUZZER
);
return
0
;
}
// ctrl+c로 인해 프로세스 종료시 잔류 신호 차단
void
signal_handler
(
int
no
){
printf
(
"System Interrupt.
\n
"
);
GPIOWrite
(
GREEN
,
LOW
);
GPIOWrite
(
RED
,
LOW
);
softToneWrite
(
BUZZER
,
0
);
pinMode
(
BUZZER
,
INPUT
);
// 부저 입력모드 전환으로 인한 잔류 신호 차단
exit
(
0
);
void
signal_handler
(
int
no
)
{
printf
(
"System Interrupt.
\n
"
);
GPIOWrite
(
GREEN
,
LOW
);
GPIOWrite
(
RED
,
LOW
);
GPIOWrite
(
BUZZER
,
LOW
);
close
(
sock
);
exit
(
0
);
}
int
GPIOExport
(
int
pin
)
{
char
buffer
[
BUFFER_MAX
];
ssize_t
bytes_written
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment