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
|
참고자료
- PMS7003 datasheet : https://eleparts.co.kr/data/goods_old/data/DS_PMS7003.pdf
728x90
'Programming > Raspberry Pi' 카테고리의 다른 글
라즈베리파이 motion 사용하기 (2) | 2019.08.10 |
---|---|
라즈베리파이 VNC 이용해서 원격 접속하기 (0) | 2019.08.07 |
라즈베리파이 외부에서 접속하기 (2) | 2019.07.31 |
라즈베리파이에서 DHT11 사용하기 (4) | 2019.07.29 |
라즈베리파이 wiringPi을 이용하여 프로그래밍하기 (0) | 2019.07.13 |