brunch

You can make anything
by writing

C.S.Lewis

by 김학용 Apr 20. 2018

PMS7003과 NodeMCU를 이용한 미세먼지 측정기

PM10, PM2.5, PM1.0까지 정밀하게 측정해 주네요 ^^

그동안 GP2Y1014AU0F라는 센서를 이용해서 미세먼지를 측정했는데 정확하지 않은 것 같아서 새로운 미세먼지 센서를 구입해 봤습니다. 바로 PMS7003이라는 제품입니다. PMS5003도 있던데 더 최신 버전인 것 같아서 구매를 했습니다. 


알리에서 15.99달러짜리도 있고, 18.59 달러 짜리도 있어서 각각 하나씩 구매를 해 봤는데, 15.59달러짜리가 먼저 도착했습니다. 2.6달러 정도 차이가 있던데, 커넥터가 없는 것이더군요. 덕분에 간만에 땜질까지 했는데, 그냥 18.59달러짜리를 구매하시는 게 좋을 것 같습니다. 



일단, 급하게 https://blog.naver.com/compass1111/221074629107 에 있는 링크를 가져다 약간 수정을 했습니다. mySerial의 RX와 TX를 D1, D2로 바꾼 것 정도입니다. 원래 코드는 아두이노 것이라서 5, 11번으로 되어 있더군요. mySerial.available()>=32 부분은 미세먼지 센서가 제대로 된 값을 보내줄 때만 처리하도록 해 줍니다. 


#include <SoftwareSerial.h> 

SoftwareSerial mySerial(5, 4); // RX, TX 


unsigned char pms[32]; 

int PM1_0, PM2_5, PM10;


void setup() { 
  Serial.begin(9600); 
  mySerial.begin(9600); 


void loop() { 
  if(mySerial.available()>=32){ 

    for(int j=0; j<32 ; j++){ 
      pms[j]=mySerial.read(); 
    }      
    PM1_0=(pms[10]<<8)  | pms[11]; 
    PM2_5=(pms[12]<<8)  | pms[13];
    PM10 =(pms[14]<<8)  | pms[15];
    Serial.printf("PM1.0: %d,  PM2.5: %d,  PM10: %d  \r\n", PM1_0, PM2_5,PM10); 
  }

  delay(1000); 

}


급하게 NodeMCU와 PMS7003을 연결한 모습입니다. 좀 조악하죠 ㅋㅋ 센서의 1, 2번은 5V인 Vin에 연결했구요, 3, 4번은 GND에 연결했습니다. 그리고, 7번 RX와 9번 TX를 각각 NodeMCU의 4번(D2)와 5번(D1)에 연결했습니다. 즉, 센서의 RX는 NodeMCU의 TX로 설정한 D2와, 센서의 TX는 NodeMCU의 RX로 설정한 D1과 연결한거죠.



그리고 그 결과물을 시리얼 모니터로 받아서 엑셀에서 그래프를 그려봤습니다. 아래 그림처럼 세 개의 값이 변하는 것을 확인할 수 있습니다. PM10을 기준으로 57-58 사이는 제 방에서 측정한 거구요, 거실로 이동하니 15 근처로 내려가더군요. 그리고, 집 밖으로 이동하니 95 부근까지 올라가는 것을 확인할 수 있었습니다. 


테스트할 당시 집에서 가장 가까운 곳의 AirVisual 데이터값은 105를 나타내고 있으니 매우 비슷하게 나오는 것을 알 수 있습니다. 



여기까지 한 다음에는 기존에 이용하던 코드를 재활용해서 ThingSpeak로 값을 보내고 있습니다. 이제 어디서나 집안의 공기 상태를 확인하는 것이 가능하죠. 알리에서 e-paper도 주문했는데, 그게 오면 집에서는 디스플레이로 확인하고 밖에서는 스마트폰으로 확인할 수 있는 것을 만들 수 있을 것 같습니다. 

작가의 이전글 CPS (Cyber-Physical Systems)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari