중급 예제

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

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

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

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

불꽃감지센서, 아두이노