아두이노:MOS 센서
보이기
아두이노 관련 정보를 모으기 위한 틀. 틀:아두이노
- 아두이노:개요
- 아두이노:하드웨어
- 아두이노:코드
- 아두이노:핀 사용
- 아두이노:시리얼 통신
- 아두이노:편의함수
- 센서 사용
- 아두이노:LCD 사용
- 아두이노:스위치 사용
- 아두이노:릴레이
- 통신 관련, 정보 교환
- 아두이노:해결되지 않은 다양한 의문들
- 수업용 간단 실습
- 아두이노 모터 출력
- 미완문서
- 아두이노:스테핑 모터(미완)
- 분류:아두이노 프로젝트
MOS(Metal–Oxide–Semiconductor) 센서는 금속 산화물 반도체 기반 가스 센서로, 표면의 산소 이온과 환원성 가스 반응으로 전도 전자의 수가 변하는 현상을 이용한다.
센서의 원리 등 특성은 가스센서 문서를 참고하자.
※ MOS 센서는 여러 가스에 반응하기 때문에, 절대 정량 측정용이 아니며, 가전·DIY용으로 주로 사용된다.
MOS 센서는 대부분 SnO₂, ZnO 등 산화물 반도체를 기반으로 하며, 제조사·모델에 따라 감도 대상 가스와 히터 온도, 출력 방식이 다르다.
대표적인 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);
}