본문 바로가기
모두의 아두이노/아두이노 센서

[아두이노][센서] 실시간 가스 감지! MQ2 센서로 LPG, CO, 연기 측정하고 안전 모니터링 시스템 구축하기

by 로니킴 2024. 11. 30.


이 프로젝트는 아두이노와 MQ2 가스 센서를 활용하여 초보자도 손쉽게 가스 농도를 측정할 수 있도록 설계되었습니다. 단계별 설명을 통해 하드웨어 연결과 소프트웨어 코딩을 다룹니다. 이제 환경을 더 스마트하게 감시해보세요!

 

목차

     

     

     


    [아두이노][센서] 실시간 가스 감지! MQ2 센서로 LPG, CO, 연기 측정하고 안전 모니터링 시스템 구축하기

     

     

    이 프로젝트는 아두이노와 MQ2 가스 센서를 활용하여 초보자도 쉽게 따라 할 수 있도록 구성되었습니다. 단계별 설명을 통해 하드웨어 연결부터 소프트웨어 코딩, 동작 확인까지 모든 과정을 다룹니다.

    아두이노를 통해 가스 농도를 측정하고 LCD에 출력하는 방법을 배울 수 있을 뿐만 아니라, 프로젝트를 확장하여 경고 시스템이나 자동화된 제어 장치를 구현하는 방법까지 학습할 수 있습니다.

    이제 아두이노의 세계로 한 걸음 나아가, 실생활에 적용할 수 있는 유용한 프로젝트를 시작해 보세요!

     

    이번 프로젝트는 아두이노와 MQ2 가스 센서를 사용하여 실시간 가스 농도 측정 및 상태 출력을 구현하는 것이 주요 목표였습니다. 프로젝트는 다음과 같은 단계로 구성되었습니다:

    1. 센서 보정 및 데이터 수집
      • 깨끗한 공기 환경에서 센서를 보정하여 기준 저항값(Ro)을 설정했습니다.
      • 아날로그 데이터를 기반으로 각 가스(LPG, CO, 연기)의 농도를 계산하였습니다.
    2. 데이터 시각화 및 출력
      • LCD 화면을 사용하여 각 가스의 농도와 상태를 실시간으로 출력하였습니다.
      • 시리얼 모니터에서도 데이터를 확인할 수 있도록 하여 디버깅과 모니터링을 용이하게 했습니다.
    3. 프로젝트 확장 가능성
      • 이 시스템은 단순 가스 감지기에서 더 나아가, 무선 경고 알림, 자동 환기 시스템과 같은 응용 프로젝트로 확장할 수 있습니다.
      • 추가 센서(예: CO2, 먼지 센서)를 통해 더 복잡한 공기 질 모니터링 시스템을 개발할 수도 있습니다.

     

    1. MQ2 가스 센서란?

     

    MQ2 가스 센서는 가연성 가스(LPG, 프로판, 수소 등)와 연기를 감지하는 반도체 센서로, 아두이노와 같은 마이크로컨트롤러와 쉽게 통합할 수 있습니다. 센서의 민감 물질은 산화 주석(SnO2)으로 구성되어 깨끗한 공기에서는 낮은 전도성을 보입니다. 그러나 가스가 존재하면 가스 농도에 따라 전도성이 증가하며, 이를 통해 가스 농도를 측정할 수 있습니다. 전기 신호로 출력되는 데이터는 간단한 회로로 변환 가능하며, 가정용이나 산업용 안전 장치로 활용됩니다. 이 센서는 가정 내 가스 누출 탐지기, 공장용 가스 모니터링 시스템, 휴대용 가스 감지기에 사용됩니다. 가스 농도 측정 범위는 300~10,000ppm이며, 5V의 히터 전압과 간단한 회로 구성으로 작동합니다. 가격이 저렴하고 내구성이 뛰어나 초보자도 쉽게 사용할 수 있는 장점이 있습니다. 이 센서는 특히 프로판, 메탄, 수소에 민감하여 다양한 상황에서 안전성을 높이는 데 기여합니다. 고온과 고습 환경에서도 사용할 수 있지만, 물에 노출되거나 부식성 가스에 오랫동안 노출되면 성능이 저하될 수 있습니다. 간단한 연결과 기본 설정으로 시작하기에 매우 적합한 센서입니다.

     

     

     

     

    MQ2 가스 센서는 다양한 가연성 가스(예: LPG, 프로판, 메탄, 수소)와 연기를 탐지하는 데 사용되는 반도체 센서입니다. 센서의 주요 구성 요소는 산화 주석(SnO2)으로 이루어진 민감 물질로, 깨끗한 공기에서는 낮은 전도성을 가지지만 가연성 가스 농도가 증가하면 전도성이 높아집니다. 이 특성을 통해 가스 농도를 전기 신호로 변환할 수 있습니다.

    주요 특징

    • 탐지 가스: LPG, 프로판, 수소, 메탄, 연기 등.
    • 고감도: 가연성 가스 및 연기에 민감.
    • 사용 편의성: 간단한 구동 회로로 동작.
    • 저렴한 비용: 가정 및 산업용 가스 감지기에 적합.
    • 내구성: 장시간 사용 가능.

    주요 사양

    • 전압 요구사항:
      • 히터 전압(VH): 5.0V (DC 또는 AC)
      • 작동 전압(VC): ≤ 24V DC
    • 탐지 범위: 300~10,000ppm (가연성 가스)
    • 센서 저항(Rs): 2kΩ ~ 20kΩ (2,000ppm 프로판 기준)
    • 구성: AL2O3 세라믹 튜브, SnO2 민감층, 측정 전극 및 히터.

    활용 예시

    • 가정용 가스 누출 감지기: LPG나 도시가스 누출을 조기에 탐지.
    • 산업용 가스 감지기: 공장 환경에서의 안전 관리.
    • 휴대용 가스 감지기: 이동 중 가스 농도 측정.



     


     

     

    2. MQ2 가스 센서의 동작 원리

    MQ2 가스 센서는 내부 히터와 SnO2 민감층의 저항 변화를 기반으로 동작합니다. 히터는 센서를 일정한 작동 온도로 유지하며, 이는 센서가 가스 농도에 민감하게 반응하도록 돕습니다. 민감층은 공기 중 특정 가스와 반응해 저항이 변하며, 가스 농도가 높을수록 저항이 감소합니다. 이 저항 변화는 아날로그 출력 값으로 변환되어 아두이노와 같은 장치에서 읽을 수 있습니다. 센서는 두 가지 전압(VH와 VC)을 필요로 하며, 히터 전압은 민감층이 최적의 온도를 유지하게 합니다. 작동 회로는 부하 저항(RL)과 센서 저항(Rs) 간의 관계를 통해 가스 농도를 측정합니다. Rs/Ro 비율을 기반으로 특정 가스 농도를 계산하며, Ro는 표준 조건(1,000ppm의 기준 가스)에서 측정된 저항입니다. 센서는 다양한 가스 농도에 대해 민감 곡선을 통해 정확히 반응합니다. 저항 변화는 다양한 농도의 가스(예: 메탄, 수소)에 따라 특정 수학적 관계로 출력됩니다. 이 과정은 아날로그 핀과 간단한 코드로 아두이노에서 쉽게 처리할 수 있습니다.

     

    MQ2 Gas sensor.pdf
    0.18MB

     

     

    MQ2 가스 센서는 내부 히터와 민감층(SnO2)을 통해 작동합니다. 히터는 센서를 특정 온도로 유지하며, 가연성 가스가 SnO2 민감층과 접촉할 때 저항이 감소합니다. 이 저항 변화는 가스 농도에 비례하므로, 간단한 회로를 통해 이를 전기 신호로 변환할 수 있습니다.

    주요 구성 요소

    1. 히터: 센서를 작동 온도로 유지하기 위해 필요하며, 5V의 히터 전압(VH)이 공급됩니다.
    2. 민감층: 가스 농도에 따라 전도성이 변화하는 SnO2 물질.
    3. 회로 설계:
      • 히터 전압(VH)과 작동 전압(VC)을 통해 센서 구동.
      • 저항 변화는 부하 저항(RL)과 함께 출력 전압(VRL)로 변환.

    작동 메커니즘

    1. 센서 저항(Rs) 계산:
      • Rs = (Vc / VRL - 1) × RL
      • Rs는 환경 내 가스 농도에 따라 변합니다.
    2. 가스 농도 측정:
      • 센서는 Rs/Ro 비율(민감 곡선)을 기준으로 특정 가스의 농도를 계산합니다.
      • Ro는 표준 가스 농도(예: 1,000ppm 이소부탄)에서 측정된 센서 저항입니다.

    센서의 특징적인 반응

    • MQ2는 다양한 가스에 대해 민감하며, 특히 LPG, 프로판, 수소에 높은 감도를 보입니다.
    • 민감도 곡선은 센서가 다양한 농도에 어떻게 반응하는지를 보여줍니다. 예를 들어, 메탄(CH4)에 대해 Rs/Ro 비율이 농도에 따라 점진적으로 감소합니다.

     

    그래프 설명

     

    위의 그래프는 Rs/Ro 비율과 가스 농도(ppm) 간의 관계를 보여줍니다. 농도가 증가하면 Rs/Ro 비율은 감소하여, 센서가 가스 농도 변화에 민감하게 반응함을 나타냅니다.

    • X축: 가스 농도(ppm)
    • Y축: Rs/Ro 비율
    • 특징: 초기 낮은 농도에서는 급격히 감소하지만, 고농도로 갈수록 완만해지는 로그 스케일 패턴을 보입니다.

    이 동작 원리는 센서의 데이터를 전기 신호로 변환하여 아두이노에서 가스 농도를 쉽게 계산할 수 있도록 합니다.

     


    MQ2 센서가 측정할 수 있는 가스 리스트

    MQ2 센서를 통해 측정된 가스 농도는 환경의 안전성을 평가하는 데 매우 유용합니다. LPG, CO, 연기의 농도가 인체에 미치는 영향을 정량적으로 파악하여, 초과 시 즉각적인 환기나 대피 등의 조치를 취하는 것이 중요합니다. 센서 데이터는 실시간으로 안전성을 확인하고 재난을 예방하는 데 기여할 수 있습니다.

     

    MQ2 센서는 다양한 가연성 가스 및 유해 물질을 감지할 수 있으며, 다음과 같은 가스를 측정합니다:

    1. LPG (Liquefied Petroleum Gas): 프로판과 부탄 혼합 가스.
    2. 메탄 (Methane, CH4): 천연가스 주요 성분.
    3. 수소 (Hydrogen, H2): 에너지 및 산업용 가스.
    4. 일산화탄소 (Carbon Monoxide, CO): 불완전 연소로 발생하는 유독성 가스.
    5. 연기 (Smoke): 가연성 물질 연소로 발생.
    6. 알코올 증기 (Alcohol Vapors): 에탄올 등 알코올 성분의 증기.
    7. 이소부탄 (Isobutane): 연료 가스 및 냉매.

    MQ2 코드에서 측정하는 가스 농도가 인체에 미치는 영향

     

    MQ2 센서는 ppm(Parts Per Million) 단위로 가스 농도를 측정합니다. 여기에서는 LPG, CO, SMOKE 세 가지 주요 가스를 기준으로 각 농도가 인체에 미치는 영향을 설명합니다.


    1. LPG (LPG 농도에 따른 영향)

    • 300~1000ppm: 안전한 수준으로 간주되지만, 환기가 필요한 경우가 있을 수 있음. 장기 노출 시 어지러움 발생 가능.
    • 1000~2000ppm: 메스꺼움과 가벼운 두통 유발. 환기가 필요하며, 장시간 노출 시 위험할 수 있음.
    • 2000ppm 이상: 구토, 의식 저하 및 심각한 건강 문제. 즉각적인 조치 필요.

    2. CO (일산화탄소 농도에 따른 영향)

    • 1~50ppm: 안전한 수준. 실내 환기가 정상적으로 작동하는 환경에서는 문제 없음.
    • 51~100ppm: 가벼운 두통과 어지러움 유발 가능. 민감한 사람에게는 불편함 발생.
    • 101~200ppm: 두통, 메스꺼움, 혼란 발생 가능. 장시간 노출 시 위험.
    • 200ppm 이상: 심각한 두통, 구토, 의식 상실. 즉각적인 탈출과 의료 지원 필요.

    3. SMOKE (연기 농도에 따른 영향)

    • 0~100ppm: 무해한 수준으로 간주.
    • 101~300ppm: 자극적인 냄새와 가벼운 눈 따가움. 민감한 사람에게는 불편함.
    • 300~500ppm: 심한 호흡기 자극. 장시간 노출 시 호흡 곤란 유발 가능.
    • 500ppm 이상: 폐 손상, 질식 위험. 즉각적인 대피와 구조 필요.

    예시 시나리오

    • LPG 농도 500ppm:
      • LCD 출력: LPG: 500
      • 인체 영향: 무해하지만, 가스 누출 가능성 있으므로 환기 필요.
    • CO 농도 150ppm:
      • LCD 출력: CO: 150
      • 인체 영향: 두통 및 어지러움 발생. 장시간 노출 시 위험하므로 환기 필요.
    • 연기 농도 800ppm:
      • LCD 출력: SMOKE: 800
      • 인체 영향: 심각한 호흡기 자극. 즉각적인 대피 필요.


     

     

    3. MQ2 가스 센서 구입하기

    MQ2 가스 센서는 국내 전자부품 쇼핑몰에서 약 9,700원에 판매되고 있으며, 해외 사이트인 알리익스프레스에서는 약 1,000원부터 다양한 가격대로 제공됩니다. 해외 구매 시 배송 기간이 길어질 수 있으므로 긴급한 프로젝트에는 국내 구매를 추천합니다. 초보자는 신뢰할 수 있는 판매처를 선택하고, 제품 설명과 후기를 꼼꼼히 확인하여 품질과 호환성을 보장받는 것이 중요합니다. 또한, 판매처에서 제공하는 기술 지원이나 추가 부품의 유무도 고려하면 좋습니다.

     

     


     

     

     

    4. MQ2 가스 센서 하드웨어 연결하기

    아두이노 LCD 키패드 쉴드는 아날로그 입력 A0 핀을 사용하여 키패드 신호를 수신합니다. 따라서, MQ2 가스 센서를 A0에 연결하면 두 장치가 동일한 핀을 공유하게 되어 신호 충돌이 발생할 수 있습니다. 이를 방지하기 위해 MQ2 센서의 아날로그 출력(A0)을 아두이노의 아날로그 입력 A1 핀에 연결하는 것이 좋습니다. 이렇게 하면 LCD 키패드와 MQ2 센서가 각각 A0와 A1 핀을 사용하여 독립적으로 작동할 수 있습니다. 또한, MQ2 센서의 VCC와 GND는 아두이노의 5V와 GND에 연결하여 전원을 공급합니다. 이러한 연결 방식을 통해 아두이노는 LCD 키패드와 MQ2 가스 센서를 동시에 안정적으로 제어할 수 있습니다.

     

     

     

    아두이노 LCD 키패드 쉴드는 아날로그 입력 A0 핀을 이용해 키패드 신호를 수신합니다. 따라서, MQ2 가스 센서를 A0 핀에 연결하면 LCD 키패드와 센서가 동일한 핀을 공유하게 되어 충돌이 발생합니다. 이를 방지하기 위해 MQ2 센서를 아날로그 입력 A1 핀에 연결하는 것이 적절합니다.

    하드웨어 연결 방법

    • MQ2 가스 센서:
      • VCC 핀 → 아두이노 5V 핀
      • GND 핀 → 아두이노 GND 핀
      • A0 핀 → 아두이노 A1 핀
    • LCD 키패드 쉴드:
      • 아두이노에 직접 장착
      • 키패드 입력은 아날로그 A0 핀을 사용

    연결 이유

    • MQ2 센서의 A0 핀을 아두이노 A1에 연결하는 이유:
      • LCD 키패드 쉴드가 A0 핀을 사용하므로, 센서를 A1에 연결하여 핀 충돌을 방지하고 안정적인 데이터 수집을 보장합니다.

    이러한 연결 방식을 통해 아두이노는 LCD 키패드와 MQ2 가스 센서를 동시에 효율적으로 제어할 수 있습니다.

     


     

     

     

    5. MQ2 가스 센서 소프트웨어 코딩하기

     

    센서를 제어하기 위한 소프트웨어 준비 과정은 다음과 같은 단계로 이루어집니다

     


    1. 아두이노

    01 연결

    - 아두이노와 PC 연결

    - 아두이노 IDE 실행

    - 메뉴 → 툴 → 보드:아두이노 UNO 확인

    - 메뉴 → 스케치 → 확인/컴파일

     

    02 컴파일 확인

    스케치>확인/컴파일(CTRL+R) 를 선택해서 컴파일을 진행합니다.

     

    03 아두이노 우노 업로드

    컴파일이 이상없이 완료되면 스케치>업로드(CTRL+U) 를 선택해서 컴파일 파일을 업로드 합니다.

     

    04 동작 확인

    센서의 동작을 확인할 수 있습니다.

     


    2. 코드 설명

    이 코드는 아두이노가 MQ2 센서로부터 아날로그 데이터를 수집하고 이를 가공하여 각 가스 농도를 계산하는 구조입니다. 이후 LCD 쉴드로 데이터를 실시간 출력하여 사용자에게 현재 공기 중 가스 상태를 시각적으로 제공합니다. 보정 과정(Ro 설정)을 통해 초기화 단계에서 정확도를 확보하고, 반복적인 측정을 통해 실시간 모니터링이 가능합니다. 이 구성은 가스 누출 경보 장치와 같은 시스템을 구현하는 데 적합합니다.

    #include <LiquidCrystal.h>  // LCD 제어를 위한 라이브러리 포함
    
    // LCD 핀 연결 정의 (RS, EN, D4, D5, D6, D7 핀 사용)
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    
    // MQ2 센서 관련 상수 정의
    #define MQ2_PIN                   A1    // MQ2 센서의 아날로그 출력 핀 번호
    #define LOAD_RESISTANCE           10    // 부하 저항 값 (kΩ), 센서 회로에서 사용
    #define CLEAN_AIR_FACTOR          9.83  // 깨끗한 공기에서 Ro를 계산하는 계수
    
    // 보정 관련 상수
    #define CALIBRATION_SAMPLE_COUNT  50    // 보정 시 샘플링 횟수
    #define CALIBRATION_DELAY_MS      500   // 보정 샘플 간 대기 시간 (ms)
    
    // 센서 데이터 읽기 관련 상수
    #define SENSOR_READ_COUNT         5     // 데이터 읽기 시 샘플링 횟수
    #define SENSOR_READ_DELAY_MS      50    // 데이터 샘플 간 대기 시간 (ms)
    
    // LCD 데이터 표시 간 딜레이
    #define DISPLAY_DELAY_MS          500   // 각 가스 데이터를 표시 후 대기 시간 (ms)
    
    // MQ2 센서의 민감 곡선 (각 가스 별 설정값)
    // 민감 곡선은 각 가스의 농도에 따라 Rs/Ro 비율을 기반으로 계산
    float LPG_CURVE[3] = {2.3, 0.21, -0.47};   // LPG 민감 곡선
    float CO_CURVE[3]  = {2.3, 0.72, -0.34};   // CO 민감 곡선
    float SMOKE_CURVE[3] = {2.3, 0.53, -0.44}; // 연기 민감 곡선
    
    // 전역 변수 선언
    float calibratedRo = 10.0;       // 센서 보정 후 얻어진 Ro 값
    int lpgPpm = 0;                  // LPG 농도 (ppm)
    int coPpm = 0;                   // CO 농도 (ppm)
    int smokePpm = 0;                // 연기 농도 (ppm)
    
    /**
     * @brief 프로그램 시작 시 초기화 작업 수행
     * @note LCD 초기화 및 MQ2 센서 보정을 진행
     */
    void setup() {
      lcd.begin(16, 2);              // LCD 초기화 (16x2 크기 지정)
      Serial.begin(9600);            // 시리얼 통신 초기화 (디버깅용)
      calibrateMQ2Sensor();          // MQ2 센서를 보정하여 Ro 값 설정
    }
    
    /**
     * @brief 메인 루프: 가스 농도 읽기 및 LCD 출력 반복
     * @note 1초 간격으로 가스 농도를 읽고 상태를 LCD에 출력
     */
    void loop() {
      readGasConcentrations();       // MQ2 센서를 통해 가스 농도를 측정
      displayGasDataOnLCD();         // LCD에 농도 및 상태를 출력
      delay(1000);                   // 1초 대기 후 반복
    }
    
    /**
     * @brief MQ2 센서를 보정하여 초기 Ro 값을 설정
     * @note 센서 보정은 깨끗한 공기 환경에서 수행해야 함
     */
    void calibrateMQ2Sensor() {
      lcd.setCursor(0, 0);           // LCD 첫 번째 줄로 커서 이동
      lcd.print("Calibrating...   "); // 센서 보정 중임을 표시 (공백 포함으로 잔여 데이터 제거)
      
      calibratedRo = calculateRo(MQ2_PIN);  // 센서의 초기 Ro 값을 계산
      
      lcd.clear();                   // 이전 데이터 제거
      lcd.setCursor(0, 0);           // LCD 첫 번째 줄로 커서 이동
      lcd.print("Calibrated!");      // 보정 완료 메시지 출력
      lcd.setCursor(0, 1);           // LCD 두 번째 줄로 커서 이동
      lcd.print("Ro=");
      lcd.print(calibratedRo);       // 계산된 Ro 값을 출력
      lcd.print(" kOhm");
      delay(3000);                   // 메시지를 일정 시간 동안 표시
      lcd.clear();                   // LCD 초기화
    }
    
    /**
     * @brief 센서 보정을 위한 Ro 값 계산
     * @param pin MQ2 센서의 아날로그 핀 번호
     * @return 보정된 Ro 값
     */
    float calculateRo(int pin) {
      float resistanceSum = 0.0;     // 저항 값의 합계를 저장할 변수 초기화
      for (int i = 0; i < CALIBRATION_SAMPLE_COUNT; i++) {  // 샘플 횟수만큼 반복
        resistanceSum += calculateResistance(analogRead(pin));  // 센서의 저항 값을 계산하여 누적
        delay(CALIBRATION_DELAY_MS);  // 샘플 간 대기
      }
      resistanceSum /= CALIBRATION_SAMPLE_COUNT; // 샘플 평균 계산
      return resistanceSum / CLEAN_AIR_FACTOR;   // Ro = 평균 Rs / 공기 계수
    }
    
    /**
     * @brief MQ2 센서의 저항 값 계산
     * @param rawValue 아날로그 핀에서 읽은 값
     * @return 센서 저항 값 (kΩ)
     */
    float calculateResistance(int rawValue) {
      // Rs = (RL * (1023 - ADC 값)) / ADC 값
      return ((float)LOAD_RESISTANCE * (1023 - rawValue) / rawValue);
    }
    
    /**
     * @brief 가스 농도 읽기 및 PPM 계산
     * @note Rs/Ro 비율과 민감 곡선을 사용하여 농도를 계산
     */
    void readGasConcentrations() {
      float rsRoRatio = calculateRsRoRatio(MQ2_PIN);  // Rs/Ro 비율 계산
      lpgPpm = getGasPpm(rsRoRatio, LPG_CURVE);       // LPG 농도 계산
      coPpm = getGasPpm(rsRoRatio, CO_CURVE);         // CO 농도 계산
      smokePpm = getGasPpm(rsRoRatio, SMOKE_CURVE);   // 연기 농도 계산
    }
    
    /**
     * @brief Rs/Ro 비율 계산
     * @param pin MQ2 센서의 아날로그 핀 번호
     * @return Rs/Ro 비율
     */
    float calculateRsRoRatio(int pin) {
      float resistanceSum = 0.0;     // 저항 값의 합계를 저장할 변수 초기화
      for (int i = 0; i < SENSOR_READ_COUNT; i++) {  // 샘플 횟수만큼 반복
        resistanceSum += calculateResistance(analogRead(pin));  // Rs 값을 계산하여 누적
        delay(SENSOR_READ_DELAY_MS);  // 샘플 간 대기
      }
      resistanceSum /= SENSOR_READ_COUNT;  // 샘플 평균 계산
      return resistanceSum / calibratedRo; // Rs/Ro 계산
    }
    
    /**
     * @brief 특정 가스의 농도를 PPM으로 변환
     * @param rsRoRatio Rs/Ro 비율
     * @param curve 가스 민감 곡선 (LPG, CO, 연기)
     * @return 가스 농도 (PPM)
     */
    int getGasPpm(float rsRoRatio, float *curve) {
      // PPM = 10^((log10(Rs/Ro) - b) / m + a)
      return pow(10, ((log10(rsRoRatio) - curve[1]) / curve[2]) + curve[0]);
    }
    
    /**
     * @brief LCD에 가스 농도 및 상태 출력
     * @note 각 가스별로 PPM 값과 상태를 출력
     */
    void displayGasDataOnLCD() {
      lcd.setCursor(0, 0);           // LCD 첫 번째 줄로 커서 이동
      lcd.print("SMOKE:");
      lcd.print(smokePpm);           // 연기 농도 출력
      lcd.print("ppm ");
      lcd.setCursor(0, 1);           // LCD 두 번째 줄로 커서 이동
      lcd.print(getGasStatus(smokePpm, 300, 500));  // 연기 상태 출력
      delay(DISPLAY_DELAY_MS);       // 딜레이 적용
    
      lcd.setCursor(0, 0);           // LCD 첫 번째 줄로 커서 이동
      lcd.print("CO:");
      lcd.print(coPpm);              // CO 농도 출력
      lcd.print("ppm   ");
      lcd.setCursor(0, 1);           // LCD 두 번째 줄로 커서 이동
      lcd.print(getGasStatus(coPpm, 100, 200));     // CO 상태 출력
      delay(DISPLAY_DELAY_MS);       // 딜레이 적용
    
      lcd.setCursor(0, 0);           // LCD 첫 번째 줄로 커서 이동
      lcd.print("LPG:");
      lcd.print(lpgPpm);             // LPG 농도 출력
      lcd.print("ppm  ");
      lcd.setCursor(0, 1);           // LCD 두 번째 줄로 커서 이동
      lcd.print(getGasStatus(lpgPpm, 1000, 2000));  // LPG 상태 출력
      delay(DISPLAY_DELAY_MS);       // 딜레이 적용
    }
    
    /**
     * @brief 가스 농도에 따른 상태 반환
     * @param ppm 현재 가스 농도 (PPM)
     * @param cautionThreshold 경고 기준치
     * @param dangerThreshold 위험 기준치
     * @return 상태 문자열 ("NORMAL", "CAUTION", "DANGER!")
     */
    const char* getGasStatus(int ppm, int cautionThreshold, int dangerThreshold) {
      if (ppm > dangerThreshold) return "DANGER!";  // 위험 기준치 초과 시
      if (ppm > cautionThreshold) return "CAUTION"; // 경고 기준치 초과 시
      return "NORMAL";                              // 기준치 이하일 때
    }

     

    아두이노, LCD 쉴드(16x2), MQ2 센서를 제어하는 코드 동작 순서도 설명

    주요 내용 설명

    1. 초기화 단계:
      • 아두이노가 초기화된 후, LCD를 통해 보정 상태를 사용자에게 알립니다.
    2. 센서 데이터 처리:
      • MQ2 센서로부터 아날로그 데이터를 읽어 Rs를 계산하고, Rs/Ro 비율과 PPM 농도를 산출합니다.
    3. LCD 출력:
      • 측정된 가스 농도와 상태를 LCD에 출력하며, 연기, CO, LPG 순서로 표시합니다.
    4. 사용자와의 상호작용:
      • 사용자는 시리얼 모니터나 LCD 화면을 통해 데이터를 확인하며, 센서 동작을 테스트합니다.

    1. 프로그램 초기화

    1. LCD 초기화
      • LCD의 화면 크기를 설정(16x2).
      • 이후 출력할 데이터를 표시할 준비를 완료.
    2. 시리얼 통신 초기화
      • Serial.begin(9600)을 통해 시리얼 모니터에서 디버깅 정보를 확인할 수 있도록 설정.
    3. MQ2 센서 보정
      • calibrateMQ2Sensor() 함수 호출:
        • 센서가 깨끗한 공기에서 동작한다고 가정하고 보정 작업을 진행.
        • 보정된 Ro 값(센서의 공기 중 기준 저항값)을 계산하여 저장.
        • LCD에 "Calibrating..." 메시지를 출력하여 보정 상태를 표시.
        • 보정이 완료되면 "Calibrated!"와 계산된 Ro 값을 LCD에 표시.

    2. 메인 루프 반복

    프로그램은 다음 단계를 반복적으로 수행하며 실시간으로 가스 농도를 측정하고 LCD에 출력.


    3. 가스 농도 측정

    1. 데이터 샘플링
      • MQ2 센서의 아날로그 핀에서 값을 읽어 샘플링.
      • 각 샘플을 통해 센서의 저항값(Rs)을 계산.
    2. Rs/Ro 비율 계산
      • 센서 저항값(Rs)을 보정된 Ro 값으로 나누어 Rs/Ro 비율을 계산.
    3. 가스 농도 계산
      • Rs/Ro 비율과 민감 곡선(LPG, CO, SMOKE)을 기반으로 가스 농도를 PPM 단위로 계산.
    4. 농도 결과 저장
      • 각각의 가스(LPG, CO, SMOKE)에 대한 농도를 전역 변수에 저장.

    4. LCD에 데이터 표시

    1. SMOKE 농도 출력
      • LCD의 첫 번째 줄에 "SMOKE: XXXppm" 형식으로 연기 농도 표시.
      • 두 번째 줄에 "Status: NORMAL/CAUTION/DANGER!" 형태로 상태 출력.
      • 상태는 농도에 따라 동적으로 계산:
        • NORMAL: 기준치 미만
        • CAUTION: 경고 기준치 초과
        • DANGER: 위험 기준치 초과
    2. CO 농도 출력
      • LCD의 첫 번째 줄에 "CO: XXXppm" 형식으로 CO 농도 표시.
      • 두 번째 줄에 상태 출력(NORMAL/CAUTION/DANGER).
    3. LPG 농도 출력
      • LCD의 첫 번째 줄에 "LPG: XXXppm" 형식으로 LPG 농도 표시.
      • 두 번째 줄에 상태 출력(NORMAL/CAUTION/DANGER).
    4. 출력 간 딜레이
      • 각 가스 데이터를 출력한 뒤, DISPLAY_DELAY_MS 동안 대기하여 데이터를 명확히 표시.

    5. 반복

    • 메인 루프가 종료되지 않고 계속 반복 실행되며, 실시간 데이터 업데이트 수행.
    • 새로운 샘플 데이터를 기반으로 가스 농도를 재계산하고 LCD에 최신 정보를 출력.

    코드 동작 흐름 요약

    설명

    1. 기본 구조:
      • 시작(Start)에서 아두이노와 MQ2 센서의 연결부터 시작하여 프로젝트를 진행합니다.
      • 주요 작업 흐름은 초기화, 데이터 처리, 출력, 문제 해결, 확장 가능성의 순으로 구성됩니다.
    2. 조건문:
      • 코드 업로드 성공 여부, 센서 데이터 출력 확인, 농도 값 정상 여부 등의 조건문을 포함하여 문제 상황을 대비합니다.
    3. 확장 가능성:
      • 프로젝트 확장 가능성으로 Wi-Fi 모듈 추가, 자동 경고 시스템 등 추가 작업을 제안합니다.

     

     

    1. 초기화 단계:
      • LCD 설정, 시리얼 통신 준비, MQ2 센서 보정 완료.
    2. 가스 농도 측정:
      • 센서에서 데이터를 읽고, Rs/Ro 비율 및 PPM 계산.
    3. LCD 데이터 출력:
      • SMOKE, CO, LPG 농도를 출력하며, 농도에 따라 상태 표시.
    4. 반복 갱신:
      • 새로운 데이터로 업데이트하며 무한 반복.

    이 동작 순서는 MQ2 센서를 활용하여 실시간으로 환경 내 가스를 모니터링하고 LCD를 통해 사용자에게 정보를 제공하도록 설계되었습니다. 

     

     

    MQ2 센서를 활용한 가스 농도 측정 예시 출력

    1. 초기화 시 LCD 출력

     
    Calibrating...
     
    Calibrated!
    Ro=9.83 kOhm
     

    2. 가스 농도 측정 시 LCD 출력

    (1) 연기 농도(SMOKE)

     
    SMOKE: 250ppm
    Status: NORMAL
     

    (2) CO 농도

     
    CO: 150ppm
    Status: CAUTION
     

    (3) LPG 농도

     
    LPG: 2200ppm
    Status: DANGER!
     

    3. 다른 상황에서의 예시 출력

    (1) 가스 농도가 모두 정상 범위일 경우

     
    SMOKE: 50ppm
    Status: NORMAL
     

     

    CO: 30ppm
    Status: NORMAL
     
     
    LPG: 400ppm
    Status: NORMAL
     

    (2) 특정 가스 농도만 높은 경우

     
    SMOKE: 100ppm
    Status: NORMAL
     
     
    CO: 250ppm
    Status: DANGER!
     
     
    LPG: 500ppm
    Status: NORMAL
     

     

    이 예시는 가스 농도가 다를 때 LCD에 출력되는 데이터를 보여줍니다. 농도 값에 따라 "NORMAL", "CAUTION", "DANGER!"와 같은 상태가 동적으로 표시됩니다.


     

     

    6. MQ2 가스 센서 동작 확인

    MQ2 센서의 동작을 확인하기 위해 먼저 아두이노와 센서를 연결한 후 시리얼 모니터에서 데이터를 확인합니다. 향초나 라이터 가스 등을 이용해 센서가 연기, LPG, CO에 반응하여 데이터가 변하는지 테스트합니다. LCD 화면에서 각 가스 농도와 상태가 정확히 표시되는지 확인하며, 잔여 데이터가 보이지 않도록 공백 처리가 필요합니다. 응답 시간은 가스를 제거한 후 몇 초 이내에 정상 상태로 돌아와야 하며, 이상 시 전원 공급 상태와 보정 과정을 점검합니다.

     

     

     

     

    MQ2 센서의 동작을 확인하는 과정은 측정된 데이터가 정확하게 출력되는지 확인하고, 센서가 의도한 대로 가스를 감지하는지 검증하는 단계로 이루어집니다.


    1. 기본 동작 확인

    • 아두이노와 MQ2 센서를 연결한 뒤, 센서가 정상적으로 전원을 공급받고 있는지 확인합니다.
      • 정상 상태: 센서의 히터가 따뜻해지며 가열됨.
      • 문제 발생: 센서가 차갑거나 LED 표시등이 켜지지 않으면 전원 공급 또는 연결 상태 점검 필요.
    • 아두이노 IDE의 시리얼 모니터를 열어 실시간으로 센서 데이터가 출력되는지 확인합니다.
      • 예: "SMOKE: 150ppm, CO: 100ppm, LPG: 300ppm"

    2. 데이터 검증

    • 센서에 다양한 가스를 노출시켜 농도 변화가 정확히 출력되는지 확인합니다.
      • 테스트 가스 사용: 연기(향초, 성냥), LPG(라이터 가스), CO(초벌구이 탄).
      • 데이터 확인:
        • 연기를 노출하면 SMOKE 농도가 증가.
        • 라이터 가스를 노출하면 LPG 농도가 증가.
        • CO 농도가 크게 변하지 않으면 추가적인 보정 작업 필요.

    3. LCD 출력 검증

    • LCD에 각 가스 농도와 상태(NORMAL/CAUTION/DANGER)가 적절히 출력되는지 확인합니다.
      • LCD에 "SMOKE: 350ppm, Status: CAUTION"과 같이 정확히 표시되어야 함.
    • 출력 데이터가 이전 데이터와 겹쳐 보이는 경우, 코드를 확인하여 불필요한 잔여 데이터를 제거하는 공백 처리를 점검.

    4. 센서 응답 시간 테스트

    • 가스를 제거한 뒤, 농도가 정상 상태로 돌아오는 응답 시간을 확인합니다.
      • 일반적으로 MQ2 센서는 몇 초 이내에 초기 상태로 복귀해야 합니다.
      • 센서가 응답하지 않거나 데이터가 느리게 변화하면 센서의 과열 여부와 전원 공급 상태를 점검합니다.

    5. 문제 해결 팁

    • 데이터가 고정되거나 비정상적으로 높게 출력되는 경우:
      • 히터 전압(5V)이 제대로 공급되고 있는지 확인합니다.
      • 센서 보정 과정(Ro 설정)을 반복 수행.
    • LCD에 데이터가 깜빡이거나 불완전하게 표시되는 경우:
      • LCD와 아두이노 연결 핀을 확인.
      • lcd.clear() 또는 출력 공백 추가로 잔여 데이터 문제 해결.

     

     

    7. 마무리

    이 프로젝트를 통해 MQ2 센서를 사용하여 LPG, CO, 연기를 측정하고 LCD에 실시간 데이터를 출력하는 시스템을 구현했습니다. 센서 보정과 데이터 출력 최적화를 통해 정확하고 신뢰성 있는 결과를 얻었습니다. 향후 Wi-Fi 모듈을 추가해 스마트폰으로 가스 상태를 원격 모니터링하거나, 특정 농도 초과 시 경고 알림을 제공하는 시스템으로 확장할 수 있습니다. 이를 통해 가스 누출로 인한 위험을 줄이고, 보다 안전한 환경을 구축할 수 있습니다.

     

    MQ2 센서를 사용한 프로젝트를 마무리하면서 얻은 주요 결과와 배울 수 있는 점, 향후 확장 가능성에 대해 정리합니다.


    1. 프로젝트 결과 요약

    • MQ2 센서를 사용하여 공기 중의 LPG, CO, 연기 농도를 성공적으로 측정하고 LCD를 통해 실시간으로 데이터를 출력했습니다.
    • 가스 농도에 따라 "NORMAL", "CAUTION", "DANGER" 상태를 표시하여 사용자가 환경의 위험성을 직관적으로 파악할 수 있었습니다.
    • 센서 보정 과정을 통해 Ro 값을 설정하고, 센서의 신뢰성을 높였습니다.

    2. 프로젝트를 통해 배운 점

    • 센서 보정의 중요성: 깨끗한 공기에서의 Ro 보정이 데이터 정확도에 미치는 영향을 배울 수 있었습니다.
    • LCD 출력과 코드 최적화: 출력 데이터를 명확히 표시하기 위한 공백 처리와 데이터 갱신의 효율성을 이해했습니다.
    • 실시간 데이터 처리: 아날로그 데이터를 기반으로 실시간으로 가스 농도를 계산하고 표시하는 과정에서 아두이노와 센서 간의 데이터 흐름을 배울 수 있었습니다.

    3. 확장 가능한 아이디어

    • 가스 누출 알림 시스템: 일정 농도 이상일 경우, 부저나 LED를 사용하여 경고 알림을 제공.
    • 무선 모니터링: Wi-Fi 모듈(예: ESP8266)을 사용하여 스마트폰 앱으로 가스 상태를 원격 모니터링.
    • 다중 센서 활용: CO2, 먼지 센서 등을 추가해 공기 질을 종합적으로 분석.
    • 자동 환기 시스템: 특정 농도 이상 시 환기 장치를 자동으로 작동시켜 위험을 줄이는 시스템 개발.

     

     

     

    https://search.shopping.naver.com/book/catalog/32436274774

     

    모두의 아두이노 환경 센서 : 네이버 도서

    네이버 도서 상세정보를 제공합니다.

    search.shopping.naver.com

     

    반응형


    댓글