중급 예제

약간은 익숙하시거나 익숙해지셨나요? 그렇다면 조금더 깊이 다뤄볼까요?

불꽃감지센서-화재 경보기

2014-08-07 17:08:46

개요 



불꽃 감지 센서에 대해 먼저 알아보면, 적외선LED를 통해 불꽃에서 감지되는 적외선 파장을 감지하여
이를 아날로그 혹은 디지털 신호로 변환해 주는 구조를 지니고 있습니다.


출처 :  가시광선의 범위 - encyber.com

적외선 파장은 자외선이나 가시광선에 비해 강한 열작용을 지니고 있는 것이 특징입니다.

출처 : 불꽃 감지기 설치 사례 - fpn119.co.kr

제품화된 불꽃 감지기는 문화재를 비롯한 많은 시설에서 화재 감지용으로 사용되고 있습니다.


그럼 본격적으로 아두이노를 활용하여 DIY 화재 경보기를 만들어 보겠습니다.
 

 

미리보기 동영상


 

부품 목록

본 학습에는 총 5종류의 부품이 필요합니다.
 
NO 부품명 수량 상세설명
1 아두이노 (또는 오렌지보드) 1 아두이노
2 불꽃감지센서 1 센서
3 브레드보드 1 브레드보드
4 피에조 1 저항
5 점퍼 케이블 5 점퍼 케이블
 
부품명

아두이노 우노 R3

(오렌지보드)

피에조 브레드보드 점퍼케이블 불꽃감지센서
파트 x1 x1 x1 x5  x1

 

하드웨어 Making

회로도

브레드보드 레이아웃

 

소프트웨어 Coding

// 불꽃 감지 센서와 피에조를 이용하여 화재경보기를 만들어 봅시다.

 // 13번 핀을 LED로 지정합니다.
int ledPin = 13;
// 디지털 2번핀을 불꽃감지센서로 지정합니다.
int inputPin = 2;
// 불꽃 감지 센서의 상태를 저장합니다.(처음 상태를 LOW로 설정)
int pirState = LOW;
// 센서 값을 읽기 위해 변수를 선언합니다. 
int val = 0;           
// PWM 핀에 스피커 혹은 피에조 센서를 연결합니다.(digital 9, 10, or 11)
int pinSpeaker = 10;

void setup() {
	// LED 를 출력으로 설정합니다.
	pinMode(ledPin, OUTPUT);      
	// 센서를 입력으로 설정합니다.
	pinMode(inputPin, INPUT);     
	// 스피커를 출력으로 설정합니다.
	pinMode(pinSpeaker, OUTPUT); 
	// 시리얼 통신(9600)를 준비합니다.
	Serial.begin(9600); 
}

void loop() {
	// 센서값을 읽어들입니다.
	val = digitalRead(inputPin);  
	// 만약 값이 HIGH 일때,
	if (val == HIGH) {            
		// 13번 핀(보드에 내장되어 있는 LED) 를 켭니다.
		digitalWrite(ledPin, HIGH);  
		playTone(300, 160);
		delay(150);
		
		if (pirState == LOW) {
			// 센서의 상태가 LOW일때
			Serial.println("Beware of fire.");
			// 다음의 문구를 시리얼 모니터로 출력합니다.
			pirState = HIGH;
		}
		
	} else {
		// LED를 끕니다.
		digitalWrite(ledPin, LOW); 
		playTone(0, 0);
		delay(30);    
		if (pirState == HIGH) {
			//센서값이 HIGH 일때 
			Serial.println("FIRE!!!!");
			// 다음의 문구를 시리얼 모니터로 출력합니다.
			pirState = LOW;
		}
	}
}

// 경보음을 만들어 냅니다.
void playTone(long duration, int freq) {
	duration *= 1000;
	int period = (1.0 / freq) * 1000000;
	long elapsed_time = 0;
	while (elapsed_time < duration) {
		digitalWrite(pinSpeaker,HIGH);
		delayMicroseconds(period / 2);
		digitalWrite(pinSpeaker, LOW);
		delayMicroseconds(period / 2);
		elapsed_time += (period);
	}
}

 

 

 

 

소프트웨어 설명

 

// 경보음을 만들어 냅니다.
void playTone(long duration, int freq) {
    duration *= 1000;
    int period = (1.0 / freq) * 1000000;
    long elapsed_time = 0;
    while (elapsed_time < duration) {
        digitalWrite(pinSpeaker,HIGH);
        delayMicroseconds(period / 2);
        digitalWrite(pinSpeaker, LOW);
        delayMicroseconds(period / 2);
        elapsed_time += (period);
 

 


기존 delay 명령어와 비슷하지만 다른 delayMicroseconds는 기존 delay가 ms(밀리초)만큼 지연시키는 명령어 였다면,
delayMicroseconds는 마이크로초만큼 지연시키는 명령어 입니다.

long 함수는 int 형 변수보다 훨씬 큰 정수를 담을 수 있는 변수로 사용하겠다는 것을 의미합니다.( -2,147,483,648 부터 2,147,483,647의 정수를 담을 수 있습니다)

 

 

 

관련링크  

피에조부저 사용하기

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

불꽃감지센서, 아두이노

adadfasf 2014-09-14 03:27:10

소스 오류가 있네요
playTone(0, 0); 소스랑 playTone(300, 160); 위치가 반대로 되었습니다. 수정부탁드려요.

hihyo 2014-09-16 12:31:47

소스코드 수정하였습니다. 감사합니다 :)

권형택 2017-07-06 13:10:54

감사합니ㅏㄷ

강민성 2017-10-16 18:53:00

이거 회로도 자세하게 나오는 것은 없습니까? 있으시면 이메일로 보내주세여 이메일은 sso08010@naver.com입니다.

강필규 2017-12-17 15:55:12


회로도 자세하게 해서 보내주시면 안되겠습니까? 이메일은 fg3847@naver.com 입니다

이승형 2019-01-12 09:15:30

경보음 문자를 모니터화면에 출력하는거 말고
안드로이드 어플 화면에 출력시키는 소스도 혹시 있나요?
있으시면 이메일로 보내주시면 감사합니다.
이메일은 dhfwjq@naver.com 입니다.

kocoafab 2019-01-29 17:59:15

센서의 회로도는 "Arduino flame sensor circuit" 키워드로 구글에 검색하시면 회로이미지를 찾아보실 수 있습니다.

답변글에 이미지를 담을 수 없어 키워드로 전달드립니다.

추가로 코코아팹은 소스코드나 프로젝트를 직접 제작해드리지 않습니다. 관심이 있으신 부분은 홈페이지에 다양한 컨텐츠를 이용하여 만들어보시면 좋을 것 같습니다.

감사합니다.