본문으로 이동

아두이노:MOS 센서

학교의 모든 지식. SMwiki

아두이노 관련 정보를 모으기 위한 틀. 틀:아두이노

  1. 아두이노:개요
  2. 아두이노:하드웨어
    1. 아두이노:우노보드
    2. 아두이노:ESP32
  3. 아두이노:코드
    1. 아두이노:컴퓨터에서 보드로
    2. 아두이노:안드로이드에서 보드로
    3. 아두이노:기초 문법
    4. 아두이노:라이브러리
  4. 아두이노:핀 사용
    1. 아두이노:전원공급
  5. 아두이노:시리얼 통신
    1. 아두이노:엑셀기록
    2. 아두이노:파이썬과 통신
  6. 아두이노:편의함수
  7. 센서 사용
    1. 아두이노:모션센서(미완)
    2. 아두이노:온습도센서
    3. 아두이노:조도센서(미완)
    4. 아두이노:인체감지센서(미완)
    5. 아두이노:pH미터 만들기(Gravity 아날로그 pH센서)
    6. 가스센서
      1. 아두이노:MOS 센서
  8. 아두이노:LCD 사용
  9. 아두이노:스위치 사용
  10. 아두이노:릴레이
  11. 통신 관련, 정보 교환
    1. 아두이노:WIFI
    2. 아두이노:블루투스(외장모듈)
    3. 아두이노:IR 송수신
    4. 아두이노:2.4GHz 송수신
    5. 아두이노:RFID
  12. 아두이노:해결되지 않은 다양한 의문들
  13. 수업용 간단 실습
    1. 아두이노:LED
    2. 아두이노:초음파센서
    3. 아두이노:전압계 만들기
    4. 아두이노:저항계 만들기
  14. 아두이노 모터 출력
    1. 아두이노:서보 모터
    2. 아두이노:DC 모터
    3. 아두이노:BLDC 모터
  15. 미완문서
    1. 아두이노:스테핑 모터(미완)
  16. 분류:아두이노 프로젝트

MOS(Metal–Oxide–Semiconductor) 센서는 금속 산화물 반도체 기반 가스 센서로, 표면의 산소 이온과 환원성 가스 반응으로 전도 전자의 수가 변하는 현상을 이용한다.

센서의 원리 등 특성은 가스센서 문서를 참고하자.

※ MOS 센서는 여러 가스에 반응하기 때문에, 절대 정량 측정용이 아니며, 가전·DIY용으로 주로 사용된다.


MOS 센서는 대부분 SnO₂, ZnO 등 산화물 반도체를 기반으로 하며, 제조사·모델에 따라 감도 대상 가스와 히터 온도, 출력 방식이 다르다.

대표적인 MQ 시리즈를 포함하여 다음과 같이 구분할 수 있다.

MQ 시리즈

[편집 | 원본 편집]

Metal Oxide Gas sensor. Hanwei Electronics가 개발하면서 MQ-1, MQ-2 … MQ-9 같은 모델명 체계를 만들었는데, 이게 범용적으로 쓰임.

센서 촉매/보조물 민감 가스
MQ-2 Pt, Pd LPG, H₂, CO, 연기, 알코올
MQ-3 Au 에탄올, 알코올
MQ-5 Pd LPG, 천연가스, H₂
MQ-7 없음/특화 CO
MQ-135 VOC, NH₃, NOx
  • 일반 환원성 가스용: MQ-2, MQ-5 등
  • 특정 가스용: MQ-3(알코올), MQ-7(CO)
  • 공기질 감지용: MQ-135, MQ-136

활동예시

[편집 | 원본 편집]
  • 센서 종류 변경 시 코드 대부분 재사용 가능
  • 튜닝 포인트: 히터 시간, baseline 초기값, 임계값, 필터링 계수
  • 출력은 절대값보다 상대 변화를 보는 것이 핵심

연결회로

[편집 | 원본 편집]
보드 센서 비고
A5 A0
5V VCC
D0 안씀
// MQ-5 센서 아두이노 예제

const int sensorPin = 50;  // 센서 아날로그 출력 핀
int sensorValue = 0;       // ADC 값 저장
float baseline = 0;        // 초기 기준선
const int sampleCount = 100;

void setup() {
  Serial.begin(9600);      // 시리얼 모니터 시작
  
  // 센서 예열 시간
  Serial.println("Preheating sensor... wait 30 seconds");
  delay(30000);  // 30초 예열

  // baseline 측정(공기질이 정상인 곳에서)
  long total = 0;
  for (int i = 0; i < sampleCount; i++) {
    total += analogRead(sensorPin);
    delay(50);
  }
  baseline = total / (float)sampleCount;
  Serial.print("Baseline (clean air): ");
  Serial.println(baseline);
}

void loop() {
  sensorValue = analogRead(sensorPin);
  float delta = sensorValue - baseline;

  // 간단 필터링 (노이즈 제거를 위해. 이동평균)
  static float filtered = 0;
  float alpha = 0.1;   // 필터 계수
  filtered = alpha * sensorValue + (1 - alpha) * filtered;

  Serial.print("Raw ADC: ");
  Serial.print(sensorValue);
  Serial.print(" | Delta: ");
  Serial.println(delta);

  // 임계값 비교
  if (delta > 50) {
    Serial.println("Gas detected!");
  } else {
    Serial.println("Air OK");
  }

  delay(500);
}