728x90

1. PMS7003 이란?

공기중의 미세먼지를 측정할 수 있는 센서이다.

측정 범위 0.3~1.0(극초미세먼지) / 1.0 ~ 2.5(초미세먼지) / 2.5 ~ 10(미세먼지)
유효 범위 0 ~ 500
최대 범위 > 1000

2. PMS7003 연결

핀 배열은 위 사진이고 여기서 사용하는 핀은 VCC, GND, RX, TX를 사용한다.

PMS7003을 연결할 때 아래와 같은 인터페이스 보드를 사용하기도 한다.

위 보드를 아래 사진처럼 꽂아주면 된다.

그리고 이 보드와 라즈베리파이를 연결시켜줄 케이블이다.

위 케이블을 다음처럼 꽂아주면 된다.

 

이제 이 케이블의 USB 부분을 라즈베리파이에 연결시켜주고 dmesg | grep tty 명령을 실행시키면 아래처럼 출력된다. ttyUSB0이 PMS7003이 인식된 것이다.

 

3. PMS7003 통신 방식

PMS7003은 UART 시리얼통신으로 데이터를 주고 받는다.

PMS7003의 통신 프로토콜은 2가지가 있다.

  • Activie Mode : 측정값을 연속으로 보내준다.
  • Passive Mode : 사용자가 명령어를 보내줄때 결과를 보내준다.

4. Active Mode

buad rate는 9600이고 데이터는 32Byte이다. 데이터 구성은 아래와 같다. 1번째와 2번째 Byte의 값은 각각 0x42, 0x4d로 고정되어 있고, 3번째 Byte부터는 두 개의 Byte가 합쳐 값을 나타내는 구조이다.

Frame length 16bit = Frame length high 8bit + Frame length low 8bit 이런식으로 구성되어 있다.

마지막 31,32번째 Byte는 Check code의 역할을 하고 첫번째 Byte인 Start character1 부터 data 13 low 8bit를 모두 더한 값이다.

Data 1 ~ 3은 공장 금속 분진 측정, Data 4 ~ 6은 일반 대기 측정이다.

 

5. 소스(C)

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
// PMS7003 transport protocol-active mode
#include <iostream>
#include <errno.h>
#include <string.h>
#include <stdio.h>
 
#include <wiringPi.h>
#include <wiringSerial.h>
 
using namespace std;
 
int main()
{
    int fd;
    uint8_t pms[32];
    uint16_t pm1, pm25, pm10, checkcode = 0;
    if ((fd = serialOpen("/dev/ttyUSB0",9600)) < 0)
    {
        fprintf(stderr, "Unable serial", strerror (errno));
        return 1;
    }
 
    while(1)
    {
        cout << "============================" << endl;
        for(int i = 0 ; i < 32; i++)
        {
            pms[i] = serialGetchar(fd);
            printf("pms[%d] = %d\n",i,pms[i]);
            if(i<30)
                checkcode += pms[i];
        }
        cout << endl;
        if ((pms[0== 0x42&& (pms[1== 0x4d))
        {
            uint16_t tmp = (pms[30<< 8+ pms[31];
            cout << "Check code = " << checkcode << " sum result = " << tmp << endl;
            if(checkcode == tmp)    cout << "RIGHT" << endl;
 
            pm1 = (pms[10<< 8+ pms[11];
            pm25 = (pms[12<< 8+ pms[13];
            pm10 = (pms[14<< 8+ pms[15];
 
            cout << "PM 1.0 dust = " << pm1 << endl;
            cout << "PM 2.5 dust = " << pm25 << endl;
            cout << "PM 10 dust = " << pm10 << endl;
        }
        checkcode = 0;
        cout << "============================" << endl;
        delay(1000);
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

 

 

참고자료

728x90

+ Recent posts