Blynk와 아두이노에서 미세먼지센서 사용하기
아두이노

Blynk와 아두이노에서 미세먼지센서 사용하기

반응형

더 정확한 센서를 사용하는 방법은 아래 글을 참고하자

https://diy-project.tistory.com/145

 

아두이노 + PMS5003 센서로 미세먼지 측정하기

비교적 저렴하고 성능이 좋은 미세먼지 센서는 PMSX003 (PMS5003, PMS7003)가 있다. 샤오미 공기청정기 역시 동일한 센서를 사용한다고 알고 있는데 1~2만원대의 가격으로 꽤 준수한 측정 성능을 보여준

diy-project.tistory.com

 

이전글 2018/12/26 - [IOT 프로젝트] - Blynk와 아두이노로 온습도 표시하기 이어지는 내용이다. 

 

미세먼지 센서중 미세먼지 센서중 GP2Y1010AU 센서는 가격이 매우 저렴하고 사용법이 간단해 아두이노에서 자주 사용되는 센서중 하나이다.

 

 

필자의 경우 알리익스프레스에서 저렴하게 구매했는데, 집안 미세먼지 농도를 실시간으로 확인해 보고자 Blynk와 연동하여 사용해 보기로 했다. 우선 아래와 같이 회로를 꾸미면 된다. (캐패시터와 저항은 센서를 구입할 때 같이 준다.) 와이파이 모듈은 ESP-01이다.

 

 

사실 GP2Y1010AU가 그리 정밀한 센서는 아니다. 그래서 새다리님 블로그의 https://blog.naver.com/twophase/221139319142 글에 나와있는 GP2Y1010AU 센서를 보정하는 코드를 참고했다. 아래 코드를 업로드 한다.

 

#define BLYNK_PRINT Serial
#define ESP8266_BAUD 9600

#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>
#include <SoftwareSerial.h>

BlynkTimer timer;
SoftwareSerial EspSerial(2, 3);

char auth[] = "*****";
char ssid[] = "*****";
char pass[] = "*****";

int pinDrive = A0;                                       // Sensor IR LED Drive
int pinADC = A1;                                         // Reading Sensor Output
int pinLED = A2;                                         // LED Indicattion of Dust Density 
boolean pinState = 1;

int result;

int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;                                    // Pulse Interval (0.28 + 0.04 + 9.68 = 10 ms)

unsigned long measureInterval = 20;                      // Time Interval of Measurement (ms)
unsigned long blinkInterval = 3000;                      // Time Interval for LED Indicator

unsigned long prevMeasure;                               // Previous Time of Measure
unsigned long prevBlink;                                 // Previous Time of LED ON or OFF

float voltageADC = 0.0;                                  // Instantaneous Voltage (ADC)
float smoothADC = 0.8;                                   // Moving Average Voltage
float voltageClean = 0.8;                                // Voltage for Clean Air (Zero Setting)

ESP8266 wifi(&EspSerial);

void setup() {
  pinMode(pinDrive, OUTPUT);
  pinMode(pinLED, OUTPUT);     

  Serial.begin(9600);
  delay(10);
  EspSerial.begin(ESP8266_BAUD);
  delay(10);
  Blynk.begin(auth, wifi, ssid, pass);
  timer.setInterval(1000L, myTimerEvent1);
  prevMeasure = millis();
  prevBlink = millis();
}

void myTimerEvent1()
{
  Blynk.virtualWrite(V1, result);
}

void loop() {
  Blynk.run();
  timer.run();

  if(millis() - prevMeasure > measureInterval) {
    prevMeasure = millis();
    digitalWrite(pinDrive, LOW);                         // Pulse ON
    delayMicroseconds(samplingTime);                     // 0.28 ms 
    
    voltageADC = analogRead(pinADC) / 1023.0 * 5.0;      // ADC to Voltage Convertion
    
    delayMicroseconds(deltaTime);                        // 0.04 ms
    digitalWrite(pinDrive, HIGH);                        // Pulse OFF
    delayMicroseconds(sleepTime);                        // 9.68 ms

    smoothADC = voltageADC * 0.005 + smoothADC * 0.995;  // Exponential Moving Average

    result = smoothADC * 171.9;
    
    Serial.print("* V_instant = ");
    Serial.print(voltageADC, 4);
    Serial.print(",   * V_smooth = ");
    Serial.println(smoothADC, 4);
  }
  
  blinkInterval = long(50.0 / (smoothADC - voltageClean));
  
  if(blinkInterval > 5000) {
    blinkInterval = 5000;
    pinState = 1;
  }
  
  if(millis() - prevBlink > blinkInterval) {
    prevBlink = millis();
    digitalWrite(pinLED, pinState);
    pinState = !pinState;
  }
}
 

****부분에 본인의 Blynk 토큰, 와이파이 이름, 비밀번호를 입력하면 된다. 센서의 전압값을 ug/m^3 단위로 바꾸는 보정치는 171.9를 사용했다.

 

 

Blynk에서 Gauge 위젯을 설치하고 Pin은 V1으로 설정하고 Reading Rate는 Push로 설정하면된다. 아래와 같은 화면이 나온다면 성공이다. 

 

 

 

 

 

 

 

 

 

반응형
    # 테스트용