개발자/라즈베리파이4

라즈베리파이4 스마트홈 가스센서 코드 3

지구빵집 2023. 5. 10. 15:45
반응형

 

 

MQ시리즈 가스 센서는 종류마다 다른 가스를 감지한다. 시험에서는 MQ135를 사용하여 LPG 가스나 부탄가스 등을 검출하였는데 정상적으로 작동하였다 스펙에 적힌 용도의 센서를 쓰면 가장 좋지만 만약 없다면 다른 종류의 가스를 써서 시험을 진행한다. 

 

주의:
라이터, 부탄가스, 가스레인지 등으로 시험 시 화재나 신체상의 위험을 주의해야 합니다.

 

MQ2 : Combustible Gas, Smoke MQ5 : LPG, Natural Gas, Town Gas MQ9 : Carbon Monoxide, Coal Gas, Liguefied Gas MQ135 : Ammonia, Aromatics, Sulfer, Benzene vapor, other harmful MQ135는 내부에 포함된 히터와 센서로 맘모니아, 생활가스, 오염가스등을 검출해낼 수 있는 모듈이다. 내부에 포함된 히터가 적정온도로 올라가서 안정적인 결과를 얻기 위해서는 대기시간(burn-in time)이 필요하다. 때문에 MQ-2, MQ-3, MQ-4, MQ-5, MQ-6, MQ-7 모듈 종류별로 사용법이 약간씩 틀립니다.

 

 

라즈베리파이 스마트 홈 실습 과정 전체 포스팅 리스트 

 

라즈베리파이4 스마트홈 제품 특징 1

라즈베리파이4 스마트홈 불꽃 센서 코드 2

라즈베리파이4 스마트홈 가스센서 코드 3

라즈베리파이4 스마트홈 소리센서 코드 4

라즈베리파이4 스마트홈 조도센서 코드 5

라즈베리파이4 스마트홈 온도 습도센서 코드 6

라즈베리파이4 스마트홈 인체감지 모션센서 코드 7

라즈베리파이4 스마트홈 액츄에이터 디지털 도어록 실습 8

라즈베리파이4 스마트홈 가스타이머 실습 9

라즈베리파이4 스마트홈 전동볼밸브 실습 10

라즈베리파이4 스마트홈 RFID 실습 11

라즈베리파이4 스마트홈 RGB LED 실습 12

라즈베리파이4 스마트홈 카메라 실습 13

라즈베리파이4 스마트홈 조명 LED bar 실습 14

라즈베리파이4 스마트홈 서버 프로그램 실습 15

라즈베리파이4 스마트홈 안드로이드 앱 설명 16

 

 

센서가 보드에 결합되어 있는 모듈인 경우 potentiometer를 이용해서 히터에 걸리는 전압을 조절해서 센서의 감도를 조절한다.(센서만 있는 경우는 저항이나 PWM 핀으로 조절) 특정 가스에 대한 감도를 높이기 위해서는 다양하게 테스트 해 볼 필요가 있다. MQ135 의 경우에는 빠른 response time을 갖고 있어서 거의 즉시 값을 추출할 수 있다. 아날로그 출력신호는 0~1023 사이의 값을 출력하므로 0~100%로 적절히 변환해서 사용할 수 있다.

 

반도체식 가스센서는 세라믹 반도체 표면에 가스가 접촉했을 때 일어나는 전기전도도의 변화를 이용하는 것이 많으며 대부분 대기 중에서 가열하여 사용되는 일이 많아 고온에서 안정한 금속산화물(세라믹스)이 주로 사용된다 금속 산화물은 반도체의 성질을 나타내는 것이 많고 이중 금속원자가 과잉(산소결핍)인 경우에는 n형 반도체, 금속원자가 결핍인 경우에는 p형 반도체가 사용된다.

 

이러한 세라믹반도체 중 전기전도도가 크고 융점이 높아서 사용온도 영역에서 열적으로 안정한 성질을 가진 반도체가 센서에 이용되고 있다 반도체 가스센서는 1)대부분 유독가스 가연성가스에 어떤 응답을 나타내어 감지할 수 있는 가스의 종류가 많고, 2)센서제작이 용이하고 검출회로의 구성이 간단하다는 특징이 있다 그러나 감지하려는 가스만을 감지할 수 있는 선택성이 우수한 가스센서는 적고 아직도 연구개발 중에 있다. 반도체 가스센서의 모재료와 촉매를 여러 가지로 바꾸거나 조합하고 센서 동작온도를 변경함으로써 선택성을 부여 하기도 한다 많은 금속산화물 세라믹스 이 가스센서의 연구 대상이 되고 있는데 가장 많이 연구되어 사용중인 것으로는SnO2 , ZnO, Fe2O3등이 있다.  

 

아래의 테이블은 MQ 시리즈 센서의 여러 감지 기능을 요약한 것이다. 

 

Semiconductor sensor for Flammable gas, Plastic or Metal cover
Mode Target Gas Datasheet
MQ-2 General combustible gas  
MQ-3 Alcohol  
MQ-4 Natural gas, Methane  
MQ-5 LPG, Natural gas, Coal gas  
MQ-6 LPG, Propane  
MQ-7 Carbon Monoxide  
MQ-8 Hydrogen  
MQ-9 CO and Combustible gas  
MQ306 LPG, Propane  
MQ307 Carbon Monoxide  
MQ303 Alcohol  
MQ131 Ozone  
MQ135 Air Quality Control  
Semiconductor sensor for Toxic gas
MQ136 Sulfureted Hydrogen (H2S)  
MQ137 Ammonia (NH3)  
MQ138 VOC (Mellow, Benzene, Aldehyde, Ketone, Ester )  

 


가스센서를 사용한 경보기 제작과 사용상의 주의점

가스는 공기보다 가벼운 가스의 그룹과 무거운 가스의 그룹으로 대별된다 따라서 공기보다 가벼운 가스를 감지할 때는 천장면 이내에 공기보다 무거운 가스의 경우는 바닥 면에서 이내 30cm에 설치한다. 또 도시가스가 실내에서 누설된 경우 폭발 농도까지 될 때까지는 상당한 시간을 요하며 가스가 상승 또는 강하하면서 수평방향으로 확산하는 성질이 있으므로 실내에서 가스의 흐름을 차단 하는 것이 없으면 가스경보기는 가스기구나 가스설비까지의 수평거리가 4m이내인 곳에 설치한다. 가스센서의 특성은 다른 잡가스 수증기 온도 및 습도에 영향을 받기 때문에 경보기 설치 시에는 피해야 할 장소들이 있다.

 

가스센서 핀 연결 맵과 테스트 소스코드를 아래에 나타내었다. 가스가 감지 되지 않은 경우 디지털 출력은HIGH 에 있다가 가스가 감지되면 LOW 로 하강하는 순간에 센싱을 한다. 가스에 주의하여 시험을 진행하도록 한다. 아래에 가스센서의 모양과 PinMap을 나타내었다 

 

 

가스센서 핀 맵

 

가스센서 연결 이미지

 

 

가스센서

 

가스센서 컬리브레이션 방법 : +자 드라이버를 사용하여 오른쪽 왼쪽으로 돌려 신호감지 LED 가 밝아지고, 흐려지는 지점에서 약간 흐려지는 방향으로 회전하여 희미한 상태에 있도록 보정한다. 이 상태에서 가스 라이터를 사용하여 가스를 공급하면 ‘가스 감지 LED’ 가 환하게 밝아진다. 

 

가스센서 테스크 코드  home-gas.c

 

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <wiringPi.h>

#define HOMEGAS 24  //gpio19

volatile unsigned char homegasdetect = 0;

// myInterrupt:  called every time an event occurs
void homegasInterrupt(void) {
   homegasdetect = 0x01;
}

int main(void) {
  // sets up the wiringPi library
  if (wiringPiSetup () < 0) {
      fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror (errno));
      return 1;
  }

  // set Pin 17/0 generate an interrupt on high-to-low transitions
  // and attach myInterrupt() to the interrupt
  if ( wiringPiISR (HOMEGAS, INT_EDGE_FALLING, &homegasInterrupt) < 0 ) {
      fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno));
      return 1;
  }

  while ( 1 ) {
 
    delay( 500 ); // wait 1 second
	if(homegasdetect == 0x01)
	{
		printf("gas detected...\n");
		homegasdetect = 0;
	}
	else
		printf("not gas \n");
  }

  return 0;
}

 

컴파일 명령

 

$gcc –o home-gas home-gas.c –lwiringPi

 

실행하여 결과를 확인한다.

 

$sudo ./gasdetect

not gas
not gas
not gas
gas detected... 
gas detected... 
gas detected...

 

 

가스를 흡착하여 출력을 발생시키므로 일단 가스 감지가 되면 가스가 공기 중으로 날라가 안정회 될 때까지 출력신호의 안정화가 지연된다. 불꽃센서와 가스 센서를 시험할 때는 화재, 가스에 주의해야 한다. 이해를 돕기 위해 아래 소스코드는 불꽃센서와 가스센서를 위와 같은 방법으로 테스트하여 결과를 볼 수 있게 만들었다. 각 센서에서 결과를 얻는 방법은 동일하게 구성되어 있다. 인터럽트 처리를 받는 함수가 2개 구현되었고 선언도 2개의 GPIO 핀에 대해 설정하였다.  

 

불꽃과 가스를 인터럽트 방식으로 감지하는 소스코드 home-flamegas.c

 

 

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <wiringPi.h>


// Use GPIO Pin 7, which is Pin 11 for wiringPi library

#define HOMEFLAME 23  //gpio13
#define HOMEGAS 24  //gpio19

// the event counter 
volatile int eventCounter = 0; 

volatile unsigned char homeflamedetect = 0;
volatile unsigned char homegasdetect = 0;

// -------------------------------------------------------------------------
// myInterrupt:  called every time an event occurs
void homeflameInterrupt(void) {
   eventCounter++;
   
   homeflamedetect = 0x01;  
}

void homegasInterrupt(void) {
   eventCounter++;
   homegasdetect = 0x01;
}

// -------------------------------------------------------------------------
// main
int main(void) {
  // sets up the wiringPi library
  if (wiringPiSetup () < 0) {
      fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror (errno));
      return 1;
  }

  // set Pin 17/0 generate an interrupt on high-to-low transitions
  // and attach myInterrupt() to the interrupt
  if ( wiringPiISR (HOMEFLAME, INT_EDGE_FALLING, &homeflameInterrupt) < 0 ) {
      fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno));
      return 1;
  }
  
  if ( wiringPiISR (HOMEGAS, INT_EDGE_FALLING, &homegasInterrupt) < 0 ) {
      fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno));
      return 1;
  }

  // display counter value every second.
  while ( 1 ) {
    //printf( "%d\n", eventCounter );
    //eventCounter = 0;
    //delay( 1000 ); // wait 1 second
	if(homeflamedetect == 0x01)
	{
		printf("home flame detected...\n");
		homeflamedetect = 0;
	}
	if(homegasdetect == 0x01)
	{
		printf("gas detected...\n");
		homegasdetect = 0;
	}
  }

  return 0;
}

 

컴파일 명령

 

$gcc –o home-flamegas home-flamegas.c –lwiringPi

 

실행 명령

 

$sudo ./home-flamegas 

혹은

$./home-flamegas

 

테스트 결과

 

pi@raspberrypi ~/smarthome $ sudo ./home-flamegas
home flame detected…
home flame detected…
home flame detected…
home flame detected…
gas detected…
gas detected…
home flame detected…

 

여기까지 고생하셨습니다. 다음엔 어떤 센서가 기다리고 있을까요?

 

 

 

반응형