본문 바로가기

아두이노 알코올 농도 측정 (MQ-3), (센서값 to 농도)

반응형

전에 구매했던 MQ-3 센서를 이용하여 알코올 농도를 측정하는

간단한 장비를 만들었다.

MQ-3

VCC - 5v

GND - GND

A0 - A0

연결

 

특징이 있다면 처음 몇 분정도는 기다려야한다.(예열 시간 필요)

 

int R0 = 0;

void setup() {
  Serial.begin(115200);
  measuringR0(&R0, 10);
}

void loop() {
  int Rs = 1023 - analogRead(A0);
  Serial.println(String(valueTomL(R0,Rs)));
//  Serial.println(Rs/R0);
//  Serial.println(String(valueTomL(R0,Rs)) +"mg/L");
}




void measuringR0(int *R0, int DELAY) {
  Serial.println("Wait " + String(DELAY) + "sec");
  delay(DELAY * 1000);
  *R0 = 0;
  for (int ii = 0; ii < 10; ii++) {
    int sum = 0;
    for (int i = 0; i < 10; i++) {
      sum += 1023 - analogRead(A0);
    }
    sum /= 10;
    *R0 += sum;
  }
  *R0 /= 10;
}


double valueTomL(int R0, int value) {
  double x = double(value) / double(R0);
  if (x > 1.0) {
    double TAN = (0.4 - 0.1) / (1.0 - 2.5);
    return TAN * (x - 1.0) + 0.4;
  } else if(x > 0.55) {
    double TAN = (1.0 - 0.4) / (0.55 - 1.0);
    return TAN * (x - 0.55) + 1.0;    
  } else if(x > 0.2) {
    double TAN = (4.0 - 1.0) / (0.2 - 0.55);
    return TAN * (x - 0.2) + 4.0;
  } else if(x > 0.16) {
    double TAN = (6.0 - 4.0) / (0.16 - 0.2);
    return TAN * (x - 0.16) + 6.0;
  } else {
    double TAN = (10.0 - 6.0) / (0.12 - 0.16);
    return TAN * (x - 0.12) + 10.0; 
  }
}

 

여기서 의문이 있을 수 있는데

1023 - 값을 한 건

회로도상으로 저런 방식을 취해야

센서 값을 읽을 수 있도록 설계되어 있기 때문이었다.

 

 

센서 민감도

 

 

위의 그래프는

대기 중의 기체 농도에 따른 센서 비율 값에 관한 것이다.

MQ-3는 알코올 뿐만 아니라 벤젠, 메테인, 핵세인, LPG, 일산화탄소 등도 같이 측정할 수 있기 때문에

여러 그래프가 있는 것이다.

 

우리는 알코올에 관한 것만 할 것이기 때문에 다이아몬드가 있는 그래프만 살펴본다.

기본적인 기호들을 보면

R0는 깨끗한 대기 상태에의 센서 값( -> 처음에만 평균 계산으로 산출한다.)

Rs는 대기 상태에 상관없는 센서 값 (-> 계속해서 값을 읽어 올 거다)

mg/L는 1L당 기체의 무게(mg)

 

Rs/R0mg/L
2.50.1
1.00.4
0.551.0
0.24.0
0.166.0
0.1210.0

 그래프를 보고

대충 비슷한 값을 위에 테입이블로 만들었다.

 

0.1 ~ 0.4, 0.4 ~ 1.0 ....

각 구간마다 그프의 기울기가 다르기 때문에

if문을 5개를 만들었다.

double valueTomL(int R0, int value) {
  double x = double(value) / double(R0);
  if (x > 1.0) {
    double TAN = (0.4 - 0.1) / (1.0 - 2.5);
    return TAN * (x - 1.0) + 0.4;
  } else if(x > 0.55) {
    double TAN = (1.0 - 0.4) / (0.55 - 1.0);
    return TAN * (x - 0.55) + 1.0;    
  } else if(x > 0.2) {
    double TAN = (4.0 - 1.0) / (0.2 - 0.55);
    return TAN * (x - 0.2) + 4.0;
  } else if(x > 0.16) {
    double TAN = (6.0 - 4.0) / (0.16 - 0.2);
    return TAN * (x - 0.16) + 6.0;
  } else {
    double TAN = (10.0 - 6.0) / (0.12 - 0.16);
    return TAN * (x - 0.12) + 10.0; 
  }
}

TAN은 그래프의 기울기

x는 Rs/R0이다

 

 

결과

에탄올에 넣기 전에는

0.4정도에 있다

넣은 후에는 값이 올라가는 것을 확인할 수 있다.

 

파일

https://pkr7098.tistory.com/136

MQ-3

pkr7098.tistory.com







라이브러리가 준비되어 있으니 필요하신 분들은 댓글에 메일 주소와 간단한 사용 목적 남겨주세요.

반응형