본문 바로가기
Study/Arduino

미세먼지 측정센서 PM2005

by Answer Choi 2018. 5. 10.
반응형


제품은 디웰전자의 PM2005입니다.


예제소스까지 모두 제공하여 쉽게 실행해 보실 수 있습니다.



제품 설명서를 보니 중국제품입니다.



cubic이라는 회사네요.



제품 스펙입니다.


output은 UART, I2C를 지원하네요.


프로토콜입니다.


PM10도 지원하는것 같은데 실제로 받아보면 PM2.5나 PM10이나 똑같이 나옵니다.



예제프로그램도 UART용으로 있어서 필요없는선은 묶어 버렸습니다.



UART로 작업시 1,3,4,5는 필요없습니다.




필요한 선만 연결하였습니다.


소스코드는 제공되는 소스를 바탕으로 조금 수정하였습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <SoftwareSerial.h>
SoftwareSerial pm(89); 
byte request[]= {0x11,0x02,0x0b,0x01,0xE1};
unsigned long PM25,PM10;
unsigned char Receive_Buff[20]; 
 
void setup() {
  // put your setup code here, to run once:
  pm.begin(9600);
  Serial.begin(115200);  
}
 
void loop() {
  // put your main code here, to run repeatedly:
  pm.write((const char*)&request,5);
  int cnt=0;
  while(1){
    if(pm.available()){
      Receive_Buff[cnt]=pm.read();
      cnt++;
      if(cnt==20)
        break;
    }      
  }  
  if(Checksum_cal()==Receive_Buff[19]){
    PM25 = (unsigned long)Receive_Buff[3]<<24 | (unsigned long)Receive_Buff[4]<<16 | 
            (unsigned long)Receive_Buff[5]<<8| (unsigned long)Receive_Buff[6];
    PM10 = (unsigned long)Receive_Buff[7]<<24 | (unsigned long)Receive_Buff[8]<<16 | 
            (unsigned long)Receive_Buff[9]<<8| (unsigned long)Receive_Buff[10];
    Serial.print("PM25: ");
    Serial.println(PM25);
    Serial.print("PM10: ");
    Serial.println(PM10);
  }
  for(int i=0;i<20;i++){
    Serial.print(Receive_Buff[i]);
    if(i==19)
      Serial.println("");
    else
      Serial.print(" ");  
  }
    delay(1000);       //1000ms
}
unsigned char Checksum_cal(void
{
  unsigned char count, SUM=0;
  for(count=0; count<19; count++)
  {
     SUM += Receive_Buff[count];
  }
  return 256-SUM;
}
cs


Line 1~2 : UART방식이라 소프트웨어 시리얼을 추가하였습니다.


Line 15 : 미세먼지 정보를 요청합니다.


Line 17~24 : 응답받은 데이터를 길이가 20이 될때까지 기다리는 이유는 


데이터가 한번에 5바이트씩 날라옵니다. 그래서 20바이트가 되면 계산을 해줍니다.


Line 25 : 계산전에 체크섬을 먼저 계산합니다.


Line 44~52 : 체크썸은 마지막 20번째 바이트가 체크섬인데 


1~19바이트까지 모두 더한값을 256에서 빼줍니다.


Line 26~27 : PM2.5 값인데 4바이트입니다.


Line 28~29 : PM10 값인데 4바이트라 시프트 연산


Line 25~40 : 받은 20바이트 데이터를 터미널로~


Line 42 : 스펙에 1초마다 업데이트 된다고 되어있어 1초 주기를 줍니다.


결과화면입니다.



보시면 PM2.5나 PM10이나 같은 값으로 출력이 됩니다.



반응형

인기글