[58호]자동회전, 자동신고 기능이 있는 소화기 거치대 및 소화기 경보기
2019 ICT 융합 프로젝트 공모전 참가상
자동회전, 자동신고 기능이 있는
소화기 거치대 및 소화기 경보기
글 | 전남대학교 이정원, 정수연, 정찬환
1. 심사평
칩센 창의적 발상과 시제품의 제작 완성도가 높아 보입니다. 또한 무선 통신을 통한 경보기와 소화기 거치대간의 효율적 사용 부분도 아이디어가 돋보입니다. 개발 작품에 있어 화재시 소방기관에 알려주는 기능에 있어 설명이 부족하여 이 부분에 대하여 구성을 어떻게 진행한 것인지 궁금증이 남아 있네요. 소화기 거치대의 동작과 관련한 시연 동영상등이 있었으면 더 좋았을듯 합니다.
뉴티씨 평소에 직접 뒤집어서 흔들어주고 했었는데, 이것을 자동으로 해줄수 있다니 참 좋은 아이디어 같습니다. 매우 간단하면서도 좋은 아이템으로, 소방기구로 활용이 될 수 있는 가능성이 매우 높다고 생각되며 각 아파트 단지나, 주요한 건물 등에서도 반드시 구비하였으면 좋겠습니다. 이에 높은 점수를 드립니다.
위드로봇 소화기의 수명 연장을 위해 자동 회전 기능을 구현하였기에 부분을 실용성 측면에서 높은 점수를 부여하였습니다. 반면 구현한 결과에 대한 분석이 보고서에 나타나지 않은 점이 아쉽습니다.
펌테크 단순한 구성이지만 세심한 관찰력이 반영된 실생활과 밀접한 아이디어와 독창성 및 실용성이 아주 뛰어난 작품이라고 생각합니다. 단 일반적인 소화기 무게가 통상 3KG 이상인 점은 감안한다면 이를 감안한 구동모터 선정과 감속기어 박스 구성이 우선적으로 고려되어 할 것으로 판단이 되는데 이 부분은 작품에 반영이 되지 않은 것 같습니다. 또한 제출된 문서 내용을 감안해 볼 때 최종적인 작품의 완성은 되지는 않은 것으로 판단됩니다.
2. 작품 개요
2.1. 발명 목적
1) 화재에 대한 안전불감증이 만연한 우리 사회에서 안전에 대한 관심도를 높이고자 한다.
2) 화재 발생 시, 원활하게 화재를 진압하고 신속한 초기대응을 통하여 인적·물적 피해를 최소화하고자 한다.
3) 분말소화기의 적절한 보관방법을 사용하여 소화기의 수명을 늘리는 동시에 폐소화기를 줄여 환경 보호에 기여하고자 한다.
4) 분말소화기의 점유율은 71%로 국내 소화기 중 가장 많은 점유율을 차지하고 있으며, 이를 기반으로 한 창업 아이템은 충분히 수요가 있을 것으로 판단한다.
2.2. 발명아이템의 선정동기 및 배경
분말소화기의 경우 관리방법 중에 ‘한달에 한번 위아래로 흔들어주어야 함.’이라는 항목이 존재한다. 이는 소화 약제가 굳지 않도록 하기 위함인데, 많은 사람들은 이러한 관리방법에 대해 무지하다. 실제로 분말이 굳어 기능을 상실한 소화기 때문에 화재 진압에 어려움을 겪은 수많은 사례는 우리에게 경각심을 일깨워주었다. 한편, 화재 발생 시 골든타임은 5분이며 이후에는 심각한 인명피해와 재산피해가 발생할 수 있다. 실제로 골든타임을 놓쳐 연마다 4000건 이상의 화재가 일어나고 있고, 2000명 이상의 인명피해가 발생하고 있다. 따라서 제대로 된 소화기의 작동과 신속한 119신고를 통한 화재 초기대응의 필요성을 느끼게 되었고, 앞서 언급한 문제점을 해결하기 위해 ‘한달 주기로 분말형 소화기를 섞어주는 장치’와 ‘화재를 인식하여 자동으로 119신고가 이루어지는 시스템’을 접목한 아이템을 구상하게 되었다.
2.3. 발명아이템의 독창성
소방산업의 발전이 정체되어있는 탓에 시장에 유사제품이 존재하지 않다. 잘 인식하지 못하는 부분에서 불편함을 해소해주는 소방 신기술을 갖춘 제품이며, 디자인 측면에서도 우수하다.
3. 작품 설명
3.1. 주요 동작 및 특징
· 소화기의 수명연장을 위해 1달 주기로 한번씩 자동으로 소화기를 회전 시킨다
· 화재경보기가 감지할 만큼의 큰 불이 나면 소화기 터너와 화재경보기가 상호 블루투스 통신으로 화재를 인지하고 소화기의 위치를 식별시켜줌과 동시에 Telematics기술을 활용하여 가까운 소방기관에 자동으로 신고한다.
· 화재 시 소화기 거치대의 부저, 네오픽셀이 켜져 소화기의 위치를 쉽게 파악할 수 있어서 더 큰 화재로 번지는 것을 막아줄 수 있다.
· 벽걸이형 거치대로 제작하여 장소에 영향을 받지 않고 어디든지 설치가 가능하다.
· 화재경보기와 소화기 거치대가 서로 블루투스 기술을 활용 상호 통신하여 소화기의 위치를 빠르게 식별할 수 있어 빠른 진압이 가능하다.
· 자동회전 기능으로 소화기 분말을 섞어줘 소화기의 수명을 크게 연장시킬 수 있다.
· 화재가 발생하면 자동신고, 수동신고 기능으로 가까운 소방기관에 빠른 신고가 가능해 빠른 진압이 가능하다.
3.2. 전체 시스템 구성
알고리즘
3.3. 개발 환경
· 개발언어 : C++(아두이노), C#(어플 개발)
· 회로도 소스 개발 Tool : 아두이노
· 어플 개발 Tool : Unity
4. 단계별 제작 과정
4.1. 아이템 기획 및 기획서 작성
4.2. 개발자 소스코딩, 기구제작자 모델링
4.3. 개발자 회로제작, 기구제작자 모델 조립
4.4. 디자이너 모델 디자인
4.5. 소화기 거치대 회로도
4.6. 소화기 거치대 소스코드
#include <Stepper.h> //스텝모터 라이브러리
#include <SoftwareSerial.h> //블루투스 라이브러리
#include <Adafruit_NeoPixel.h> //네오픽셀 라이브러리 시작
#ifdef __AVR__ //네오픽셀 라이브러리 시작
#include <avr/power.h>
#endif //네오픽셀 라이브러리 끝
#define PIN 6 //네오픽셀 핀번호
#define NUMPIXELS 60 //사용할 네오픽셀 수
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
//네오픽셀을 위한 객체 선언
const int stepsPerRevolution = 8; //스텝모터 스텝수
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); //스텝모터 객체선언
SoftwareSerial phoneSerial(4, 5); //핸드폰 Master 블루투스의 Tx. Rx핀을 4번 5번핀으로 설정
SoftwareSerial alarmSerial(2, 3); //화재경보기 Slave 블루투스의 Tx, Rx핀을 2번 3번핀으로 설정
int sirenPin = 13; //부저 핀번호
int buttonPin = 7; //버튼 핀번호
int buttonData; //버튼 데이터
bool motorTrigger = false; //화재, 진압 trigger
char serialData; //통신데이터
int oneTimeFlag = 0;
int oddEvenFlag = 0;
void setup()
{
pinMode(buttonPin, INPUT);
pinMode(sirenPin, OUTPUT);
// 네오픽셀 라이브러리 사용 시작
#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
strip.begin();
strip.show();
myStepper.setSpeed(60);
Serial.begin(9600); // 시리얼 통신의 속도를 9600으로 설정
alarmSerial.begin(9600); //거치대 블루투스만 연결
phoneSerial.begin(9600);
}
void loop () {
motorEvenOdd(); //모터회전함수
buttonValue(); //수동신고 함수
//화재, 진압 통신
alarmSerial.listen();
if (alarmSerial.available()) {
serialData = alarmSerial.read();
Serial.write(serialData);
fireAlarmBT(); //블루투스 통신 함수
}
}
void alarmData() { //블루투스 데이터 값 받기
serialData = alarmSerial.read();
Serial.write(serialData);
fireAlarmBT();
}
void fireAlarmBT() { //화재,진압 통신
if (serialData == ‘F’) { //화재시
fireWork();
}
if (serialData == ‘E’) { //진압시
exWrok();
}
oneTimeFlag = 1;
}
void fireWork() { //화재시 행동
motorTrigger = true;
fire();
buzzerOn();
oneTimeFlag = 1;
}
void exWrok() { //진압시 행동
motorTrigger = true;
extinguish();
motorTrigger = false;
oneTimeFlag = 0;
}
void buttonValue() { //수동신고 함수
buttonData = digitalRead(buttonPin);
if (buttonData == HIGH) { //수동신고
delay(500);
motorTrigger = true;
selfFire();
buzzerOn();
}
}
void buzzerOn() { //부저, 네오픽셀 On
theaterChase(strip.Color(0, 255, 0), 0); //네오픽셀, 부저
}
void buzzerOff() { //부저, 네오픽셀 Off
noTone(sirenPin);
}
void theaterChase(uint32_t c, uint8_t wait) { //부저,네오픽셀 On 함수
for (int j = 0; j < 30; j++) {
tone(sirenPin, 262);
alarmSerial.listen();
if (alarmSerial.available()) {
alarmData();
noTone(sirenPin);
break;
}
for (int q = 0; q < 3; q++) {
alarmSerial.listen();
if (alarmSerial.available()) {
alarmData();
noTone(sirenPin);
break;
}
for (int i = 0; i < strip.numPixels(); i = i + 3) {
alarmSerial.listen();
if (alarmSerial.available()) {
alarmData();
noTone(sirenPin);
break;
}
strip.setPixelColor(i + q, c); //turn every third pixel on
strip.show();
}
}
}
}
void theaterChase_(uint32_t c, uint8_t wait) { //부저,네오픽셀 Off 함수
for (int q = 0; q < 3; q++) {
alarmSerial.listen();
if (alarmSerial.available()) {
alarmData();
noTone(sirenPin);
break;
}
for (int i = 0; i < strip.numPixels(); i = i + 3) {
alarmSerial.listen();
if (alarmSerial.available()) {
alarmData();
noTone(sirenPin);
break;
}
strip.setPixelColor(i + q, 0);
}
strip.show();
}
}
void fire() { //화재함수
phoneSerial.listen();
char data = “화재가 발생하였습니다.”;
phoneSerial.write(data);
}
void selfFire() { //수동 신고 화재
alarmSerial.listen();
char data = ‘f’;
alarmSerial.write(data);
phoneSerial.listen();
char data_ = “화재가 발생하였습니다.”;
phoneSerial.write(data_);
}
void extinguish() { //진압함수
phoneSerial.listen();
char data = “화재가 진압되었습니다.”;
phoneSerial.write(data);
theaterChase_(strip.Color(0, 0, 0), 0); //네오픽셀 끔
buzzerOff();
oneTimeFlag = 0;
}
void motorEvenOdd() { //모터회전
for (int i = 0; i <= 10; i++) {
if(oddEvenFlag == 1)break;
alarmSerial.listen();
if (alarmSerial.available()) {
alarmData();
oddEvenFlag = 1;
break;
}
myStepper.step(stepsPerRevolution);
}
for (int i = 0; i <= 10; i++) {
if(oddEvenFlag == 1)break;
alarmSerial.listen();
if (alarmSerial.available()) {
alarmData();
oddEvenFlag = 1;
break;
}
myStepper.step(-stepsPerRevolution);
}
oddEvenFlag = 0;
Serial.println(“bluetooth Ready”);
}
4.7. 화재경보기 회로도
4.8. 화재경보기 소스코드
#include <SoftwareSerial.h> //블루투스 라이브러리
SoftwareSerial alarmSerial(2, 3); //블루투스의 Tx, Rx핀을 2번 3번핀으로 설정
char serialData; //블루투스 통신 변수
int temSensor = A0; //온도센서 핀번호
int sirenPin = 4; //부저 핀번호
void setup() {
// 시리얼 통신의 속도를 9600으로 설정
Serial.begin(9600);
alarmSerial.begin(9600);
pinMode(temSensor, INPUT);
}
void loop() {
double temValue = 0; //센서 데이터 값 초기화
while (1) //온도가 올라갈 때까지 기다림
{
int readVal = analogRead(temSensor);
double temValue = Thermistor(readVal);
delay(500);
if (temValue >= 50.0) { //큰 화재 발생
break;
}
alarmSerial.listen();
if (alarmSerial.available()) {
Serial.write(alarmSerial.read());
byte serialData = alarmSerial.read();
if (serialData == 255) //수동신고
{
selfFire();
}
}
}
fire();
while (1)
{
int readVal = analogRead(temSensor);
double temValue = Thermistor(readVal);
delay(500);
if (temValue <= 20) { //진압신호 올때까지 기다림
break;
}
}
extinguish();
}
void selfFire() { //수동신고
buzzerOn();
delay(8000);
extinguish();
}
void fire() { //화재 함수
for(int i=0; i < 50; i++){
char data = ‘F’;
alarmSerial.write(data);
}
buzzerOn();
}
void extinguish() { //진압 함수
for(int i =0; i < 50; i++){
char data = ‘E’;
alarmSerial.write(data);
}
buzzerOff();
}
void buzzerOn() { //부저 On
tone(sirenPin, 262);
}
void buzzerOff() { //부저 Off
noTone(sirenPin);
}
double Thermistor(int RawADC) //온도센서 섭씨 변환
{
double temValue;
temValue = log(10000.0 * ((1024.0 / RawADC – 1)));
temValue = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * temValue * temValue )) * temValue );
temValue = temValue – 273.15; // convert from Kelvin to Celsius
return temValue;
}