본문 바로가기

개발자/Arduino

아두이노 먼지센서 PM2005, PM2007, PM2008M 예제코드

아두이노 먼지센서 PM2005, PM2007, PM2008M 예제코드


정확히 미세먼지 센서 PM2008M 의 UART 인터페이스 소스코드를 찾고 있는데 안보인다. 그래서 찾은 코드가 아래 "[아두이노]먼지센서 PM2005, PM2007 아두이노 예제코드"이다. 


공기청정기 메이커 프로젝트를 위해 PM2008M 을 사용하기로 했는데, i2c 방식은 라이브러리도 있고 여러 곳에 잘 나와 있는데 씨리얼 통신을 이용한 예제는 없는데 이 코드를 참고하려고 한다.


도면과 코드의 출처 : http://diwell.com/article/%EC%9E%90%EB%A3%8C%EC%8B%A4/7/27/#none


아래 코드는 아두이노 우노에서 소프트웨어 씨리얼을 이용한 코드이다. 데이터 잘 나오는 것으로 확인된다.

코드의 17라인에 보면 PM10 삭제 했다고 나오는데 주석을 풀어 PM10을 다시 복원한 코드를 아래에 추가한다.


PM2008M 센서는 극초미세먼지라는 PM1.0 의 값까지 출력하니 아래 예제코드는 PM2008M 코드는 아니다. 다음 포스팅엔 아두이노메가에서 PM2008M 으로 시험한 코드를 올리기로 한다.  


레이저 미세먼지 센서 PM2008M 을 아두이노메가 측정 코드와 결과 참고

https://www.diymaker.net/46



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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*****************************************************************************
*
* Copyright (C) 2016 Diwell Electronics Co.,Ltd.
* Project Name : PM2005, PM2007 UART Code <softwareserial 이용>
* Version : 1.1 (2017.10.17)
* SYSTEM CLOCK : 16Mhz 
* BOARD : Arduino UNO. 5V operation 
 PORT Description
1. RX : 13           
2. TX : 11
  먼지센서 전원은 5V로 하셔야 하며 포트 연결 방법은 회로도를 참고하십시오.
  먼지센서 통신포트의 논리 레벨은 3.3V 이기 때문에 반드시 회로도를 참고하시기 바랍니다.
 Revision history.
1. 2016.5.4  : First version is released.
2. 2017.10.17 : PM10 삭제
****************************************************************************/
 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(1311);                        // RX 13, TX 11
unsigned char Send_data[5= {0x11,0x02,0x0b,0x010xE1}; // 농도읽는명령
unsigned char Receive_Buff[20];                           // data buffer
unsigned long PM25;//, PM10;                              // 농도저장변수 : 각 32bit(8bit*4 = 32)
unsigned long COM_SUCCESS, COM_COUNT;                     // 통신성공/통신시도횟수
unsigned char recv_cnt = 0;
 
void Send_CMD(void)                                       // COMMAND
{
  unsigned char i;
  for(i=0; i<5; i++)
  {
    mySerial.write(Send_data[i]);
    delay(1);      // Don't delete this line !!
  }
}
unsigned char Checksum_cal(void)                          // CHECKSUM 
{
  unsigned char count, SUM=0;
  for(count=0; count<19; count++)
  {
     SUM += Receive_Buff[count];
  }
  return 256-SUM;
}
 
void setup() {
  pinMode(13,INPUT);
  pinMode(11,OUTPUT);
  Serial.begin(9600);
  while (!Serial) ;
  mySerial.begin(9600);
  while (!mySerial);
}
 
void loop() {
 
  COM_COUNT++;  
  Send_CMD();  // Send Read Command
  while(1)
  {
    if(mySerial.available())
    { 
       Receive_Buff[recv_cnt++= mySerial.read();
      if(recv_cnt ==20){recv_cnt = 0break;}
    }
  } 
  if(Checksum_cal() == Receive_Buff[19])  // CS 확인을 통해 통신 에러 없으면
  {
        COM_SUCCESS++;
        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.write("COM count : ");
        Serial.print(COM_SUCCESS);
        Serial.write(" / ");
        Serial.print(COM_COUNT);
        Serial.write("    PM2.5 : ");
        Serial.print(PM25);
        //Serial.write("    PM10 : ");
        //Serial.println(PM10);
   }
   else
   {
     Serial.write("CHECKSUM Error");
   }
   delay(1000);       //1000ms
    
}
 
cs



도면은 아래와 같다.



PM10 측정값이 나오도록 주석을 삭제하여 수정한 코드이다. line 번호 18에 PM10 을 주석해제한 설명을 추가한다. 검사 측정 결과와 설명과 사진은 아래에 있다.


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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*****************************************************************************
*
* Copyright (C) 2016 Diwell Electronics Co.,Ltd.
* Project Name : PM2005, PM2007 UART Code <softwareserial 이용>
* Version : 1.1 (2017.10.17)
* SYSTEM CLOCK : 16Mhz 
* BOARD : Arduino UNO. 5V operation 
 PORT Description
1. RX : 13           
2. TX : 11
  먼지센서 전원은 5V로 하셔야 하며 포트 연결 방법은 회로도를 참고하십시오.
  먼지센서 통신포트의 논리 레벨은 3.3V 이기 때문에 반드시 회로도를 참고하시기 바랍니다.
 Revision history.
1. 2016.5.4  : First version is released.
2. 2017.10.17 : PM10 삭제
3. 2018.11.14 : PM10 다시 복원 - 잘 됨 by girin
****************************************************************************/
 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(1311);                        // RX 13, TX 11
unsigned char Send_data[5= {0x11,0x02,0x0b,0x010xE1}; // 농도읽는명령
unsigned char Receive_Buff[20];                           // data buffer
unsigned long PM25, PM10;                                          // 농도저장변수 : 각 32bit(8bit*4 = 32)
unsigned long COM_SUCCESS, COM_COUNT;                              // 통신성공/통신시도횟수
unsigned char recv_cnt = 0;
 
void Send_CMD(void)                                        // COMMAND
{
  unsigned char i;
  for(i=0; i<5; i++)
  {
    mySerial.write(Send_data[i]);
    delay(1);      // Don't delete this line !!
  }
}
unsigned char Checksum_cal(void)                          // CHECKSUM 
{
  unsigned char count, SUM=0;
  for(count=0; count<19; count++)
  {
     SUM += Receive_Buff[count];
  }
  return 256-SUM;
}
 
void setup() {
  pinMode(13,INPUT);
  pinMode(11,OUTPUT);
  Serial.begin(9600);
  while (!Serial) ;
  mySerial.begin(9600);
  while (!mySerial);
}
 
void loop() {
 
  COM_COUNT++;  
  Send_CMD();  // Send Read Command
  while(1)
  {
    if(mySerial.available())
    { 
       Receive_Buff[recv_cnt++= mySerial.read();
      if(recv_cnt ==20){recv_cnt = 0break;}
    }
  } 
  if(Checksum_cal() == Receive_Buff[19])  // CS 확인을 통해 통신 에러 없으면
  {
        COM_SUCCESS++;
        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.write("COM count : ");
        Serial.print(COM_SUCCESS);
        Serial.write(" / ");
        Serial.print(COM_COUNT);
        Serial.write("    PM2.5 : ");
        Serial.print(PM25);
        Serial.write("    PM10 : ");
        Serial.println(PM10);
   }
   else
   {
     Serial.write("CHECKSUM Error");
   }
   delay(1000);       //1000ms
    
}
 
cs


결과값을 살펴보자.




처음엔 공기가 좋아서 수치가 매우 낮았고, 담배연기를 뿜으니 최대값이 1000이 계속되고 시간이 지날 수록 값이 낮아지는 걸 보여준다. 여러값들이 나오는 것을 확인해보자.


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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
COM count : 1 / 1    PM2.5 : 3    PM10 : 3
COM count : 2 / 2    PM2.5 : 3    PM10 : 3
COM count : 3 / 3    PM2.5 : 3    PM10 : 3
COM count : 4 / 4    PM2.5 : 3    PM10 : 3
COM count : 5 / 5    PM2.5 : 3    PM10 : 3
COM count : 6 / 6    PM2.5 : 3    PM10 : 3
COM count : 7 / 7    PM2.5 : 8    PM10 : 8
COM count : 8 / 8    PM2.5 : 12    PM10 : 12
COM count : 9 / 9    PM2.5 : 10    PM10 : 10
COM count : 10 / 10    PM2.5 : 13    PM10 : 13
COM count : 11 / 11    PM2.5 : 10    PM10 : 10
COM count : 12 / 12    PM2.5 : 8    PM10 : 8
COM count : 13 / 13    PM2.5 : 7    PM10 : 7
COM count : 14 / 14    PM2.5 : 6    PM10 : 6
COM count : 15 / 15    PM2.5 : 6    PM10 : 6
COM count : 16 / 16    PM2.5 : 4    PM10 : 4
COM count : 17 / 17    PM2.5 : 4    PM10 : 4
COM count : 18 / 18    PM2.5 : 4    PM10 : 4
COM count : 19 / 19    PM2.5 : 4    PM10 : 4
COM count : 20 / 20    PM2.5 : 4    PM10 : 4
COM count : 21 / 21    PM2.5 : 4    PM10 : 4
COM count : 22 / 22    PM2.5 : 4    PM10 : 4
COM count : 23 / 23    PM2.5 : 3    PM10 : 3
COM count : 24 / 24    PM2.5 : 10    PM10 : 10
COM count : 25 / 25    PM2.5 : 15    PM10 : 15
COM count : 26 / 26    PM2.5 : 1000    PM10 : 1000
COM count : 27 / 27    PM2.5 : 1000    PM10 : 1000
COM count : 28 / 28    PM2.5 : 1000    PM10 : 1000
COM count : 29 / 29    PM2.5 : 1000    PM10 : 1000
COM count : 30 / 30    PM2.5 : 1000    PM10 : 1000
COM count : 31 / 31    PM2.5 : 1000    PM10 : 1000
COM count : 32 / 32    PM2.5 : 1000    PM10 : 1000
COM count : 33 / 33    PM2.5 : 1000    PM10 : 1000
COM count : 34 / 34    PM2.5 : 1000    PM10 : 1000
COM count : 35 / 35    PM2.5 : 1000    PM10 : 1000
COM count : 36 / 36    PM2.5 : 1000    PM10 : 1000
COM count : 37 / 37    PM2.5 : 1000    PM10 : 1000
COM count : 38 / 38    PM2.5 : 1000    PM10 : 1000
COM count : 39 / 39    PM2.5 : 1000    PM10 : 1000
COM count : 40 / 40    PM2.5 : 1000    PM10 : 1000
COM count : 41 / 41    PM2.5 : 1000    PM10 : 1000
COM count : 42 / 42    PM2.5 : 1000    PM10 : 1000
COM count : 43 / 43    PM2.5 : 1000    PM10 : 1000
COM count : 44 / 44    PM2.5 : 1000    PM10 : 1000
COM count : 45 / 45    PM2.5 : 1000    PM10 : 1000
COM count : 46 / 46    PM2.5 : 1000    PM10 : 1000
COM count : 47 / 47    PM2.5 : 1000    PM10 : 1000
COM count : 48 / 48    PM2.5 : 1000    PM10 : 1000
COM count : 49 / 49    PM2.5 : 1000    PM10 : 1000
COM count : 50 / 50    PM2.5 : 1000    PM10 : 1000
COM count : 51 / 51    PM2.5 : 1000    PM10 : 1000
COM count : 52 / 52    PM2.5 : 1000    PM10 : 1000
COM count : 53 / 53    PM2.5 : 1000    PM10 : 1000
COM count : 54 / 54    PM2.5 : 1000    PM10 : 1000
COM count : 55 / 55    PM2.5 : 1000    PM10 : 1000
COM count : 56 / 56    PM2.5 : 344    PM10 : 497
COM count : 57 / 57    PM2.5 : 311    PM10 : 419
COM count : 58 / 58    PM2.5 : 305    PM10 : 416
COM count : 59 / 59    PM2.5 : 306    PM10 : 414
COM count : 60 / 60    PM2.5 : 310    PM10 : 424
COM count : 61 / 61    PM2.5 : 329    PM10 : 461
COM count : 62 / 62    PM2.5 : 334    PM10 : 466
COM count : 63 / 63    PM2.5 : 341    PM10 : 485
COM count : 64 / 64    PM2.5 : 958    PM10 : 1000
COM count : 65 / 65    PM2.5 : 1000    PM10 : 1000
COM count : 66 / 66    PM2.5 : 1000    PM10 : 1000
COM count : 67 / 67    PM2.5 : 1000    PM10 : 1000
COM count : 68 / 68    PM2.5 : 1000    PM10 : 1000
COM count : 69 / 69    PM2.5 : 1000    PM10 : 1000
COM count : 70 / 70    PM2.5 : 1000    PM10 : 1000
COM count : 71 / 71    PM2.5 : 1000    PM10 : 1000
COM count : 72 / 72    PM2.5 : 1000    PM10 : 1000
COM count : 73 / 73    PM2.5 : 1000    PM10 : 1000
COM count : 74 / 74    PM2.5 : 1000    PM10 : 1000
COM count : 75 / 75    PM2.5 : 1000    PM10 : 1000
COM count : 76 / 76    PM2.5 : 1000    PM10 : 1000
COM count : 77 / 77    PM2.5 : 1000    PM10 : 1000
COM count : 78 / 78    PM2.5 : 1000    PM10 : 1000
COM count : 79 / 79    PM2.5 : 1000    PM10 : 1000
COM count : 80 / 80    PM2.5 : 1000    PM10 : 1000
COM count : 81 / 81    PM2.5 : 1000    PM10 : 1000
COM count : 82 / 82    PM2.5 : 1000    PM10 : 1000
COM count : 83 / 83    PM2.5 : 1000    PM10 : 1000
COM count : 84 / 84    PM2.5 : 1000    PM10 : 1000
COM count : 85 / 85    PM2.5 : 137    PM10 : 137
COM count : 86 / 86    PM2.5 : 136    PM10 : 136
COM count : 87 / 87    PM2.5 : 134    PM10 : 134
COM count : 88 / 88    PM2.5 : 129    PM10 : 129
COM count : 89 / 89    PM2.5 : 127    PM10 : 127
COM count : 90 / 90    PM2.5 : 52    PM10 : 52
COM count : 91 / 91    PM2.5 : 52    PM10 : 52
COM count : 92 / 92    PM2.5 : 52    PM10 : 52
COM count : 93 / 93    PM2.5 : 52    PM10 : 52
COM count : 94 / 94    PM2.5 : 52    PM10 : 52
COM count : 95 / 95    PM2.5 : 52    PM10 : 52
COM count : 96 / 96    PM2.5 : 56    PM10 : 62
COM count : 97 / 97    PM2.5 : 60    PM10 : 63
COM count : 98 / 98    PM2.5 : 66    PM10 : 69
COM count : 99 / 99    PM2.5 : 72    PM10 : 78
COM count : 100 / 100    PM2.5 : 77    PM10 : 86
COM count : 101 / 101    PM2.5 : 348    PM10 : 726
COM count : 102 / 102    PM2.5 : 346    PM10 : 724
COM count : 103 / 103    PM2.5 : 349    PM10 : 727
COM count : 104 / 104    PM2.5 : 346    PM10 : 724
COM count : 105 / 105    PM2.5 : 340    PM10 : 718
COM count : 106 / 106    PM2.5 : 334    PM10 : 712
COM count : 107 / 107    PM2.5 : 326    PM10 : 692
COM count : 108 / 108    PM2.5 : 319    PM10 : 673
COM count : 109 / 109    PM2.5 : 315    PM10 : 666
COM count : 110 / 110    PM2.5 : 73    PM10 : 73
COM count : 111 / 111    PM2.5 : 72    PM10 : 72
COM count : 112 / 112    PM2.5 : 72    PM10 : 72
COM count : 113 / 113    PM2.5 : 71    PM10 : 71
COM count : 114 / 114    PM2.5 : 70    PM10 : 70
COM count : 115 / 115    PM2.5 : 69    PM10 : 69
COM count : 116 / 116    PM2.5 : 68    PM10 : 68
COM count : 117 / 117    PM2.5 : 37    PM10 : 37
COM count : 118 / 118    PM2.5 : 37    PM10 : 37
COM count : 119 / 119    PM2.5 : 36    PM10 : 36
COM count : 120 / 120    PM2.5 : 37    PM10 : 37
COM count : 121 / 121    PM2.5 : 37    PM10 : 37
COM count : 122 / 122    PM2.5 : 37    PM10 : 37
COM count : 123 / 123    PM2.5 : 37    PM10 : 37
COM count : 124 / 124    PM2.5 : 37    PM10 : 37
COM count : 125 / 125    PM2.5 : 37    PM10 : 37
COM count : 126 / 126    PM2.5 : 38    PM10 : 38
COM count : 127 / 127    PM2.5 : 38    PM10 : 38
COM count : 128 / 128    PM2.5 : 38    PM10 : 38
COM count : 129 / 129    PM2.5 : 38    PM10 : 38
COM count : 130 / 130    PM2.5 : 39    PM10 : 39
COM count : 131 / 131    PM2.5 : 40    PM10 : 40
COM count : 132 / 132    PM2.5 : 42    PM10 : 42
COM count : 133 / 133    PM2.5 : 47    PM10 : 47
COM count : 134 / 134    PM2.5 : 53    PM10 : 53
COM count : 135 / 135    PM2.5 : 64    PM10 : 64
cs


실습 사진이다. 잘 안되는 경우 배선연결을 확인하도록 한다.













IT교육과 메이커 프로젝트에 유용한 자료를 보내드립니다. 주위분들에게도 알려주세요.