본문 바로가기

개인 연구실/기획실장의 연구실

PMS7003 프로토콜

[출처 : http://mntech.com.tw/PMS7003]



  PMS7003 프로토콜은 지난 번에 링크로 걸었던 곳에 중국어 버전 스펙에 설명이 나와 있습니다.


https://drive.google.com/file/d/0B6jowxS0fbXsQi1MSHR5UzFPa3c/view


  스펙의 앞 부분은 모듈의 전기적 특성이나 기능요약, 외관에 대한 설명이고, 제일 마지막 페이지를 보면 프로토콜 설명이 나옵니다.


1. 시리얼 통신 연결


  우선 시리얼 통신으로 접속할 때, 설정할 부분입니다.



 전송 속도 : 9600Kbps


 패리티 비트 : No


 스탑 비트 : 1



2. 프로토콜


  이렇게 연결을 하고 읽어오면 데이터가 수루룩~~ 잃혀오는데, 8비트 단위로 끊어보면 아래와 같은 의미가 있습니다.



[2BYTE] 시작문자 : 0x42 0x4d

[2BYTE] 프레임길이 = 2x13 + 2 (데이터 + 패리티 비트)

[2BYTE] 데이터1 : PM1.0 표시 (CF=1 표준 입자 물질)

[2BYTE] 데이터2 : PM2.5 표시 (CF=1 표준 입자 물질)

[2BYTE] 데이터3 : PM10 표시 (CF=1 표준 입자 물질)

[2BYTE] 데이터4 : PM1.0 표시 (대기상태하에서)

[2BYTE] 데이터5 : PM2.5 표시 (대기상태하에서)

[2BYTE] 데이터6 : PM10 표시 (대기상태하에서)

[2BYTE] 데이터7 : 0.1 직경미터 공기당 0.3um이상 입자개수

[2BYTE] 데이터8 : 0.1 직경미터 공기당 0.5um이상 입자개수

[2BYTE] 데이터9 : 0.1 직경미터 공기당 1.0um이상 입자개수

[2BYTE] 데이터10 : 0.1 직경미터 공기당 2.5um이상 입자개수

[2BYTE] 데이터11 : 0.1 직경미터 공기당 5.0um이상 입자개수

[2BYTE] 데이터12 : 0.1 직경미터 공기당 10um이상 입자개수

[1BYTE] 버전 정보

[1BYTE] 에러

[2BYTE] 체크썸 = 1 + 2 + start code data ...... .. + 13 low eight data 



  날아오는 데이터가 0x42 0x4d로 시작되면 이제 프레임이 시작된다는 이야깁니다. 그 다음 프레임 길이가 나오는데 숫자로 계산해보면 0x1C 즉, 28개로 표시됩니다. 그런데 2바이트로 날아오니 0x00 0x1C로 찍힙니다. 이건 뭐 모듈과 예제소스가 알아서 할 일이고...


 우리가 관심있는 부분은 시작분자로부터 다섯번 째 값부터 입니다. CF=1 표준입자물질일때 PM1.0 값을 2BYTE로 표시합니다. 사실 이게 무슨 소린지 잘 모르겠습니다. 어떤 표준조건에서 PM1.0 값인것 같습니다. 그렇게 PM2.5, PM10을 표시하고 나면 이번엔 대기상태 아래에서 PM값을 또 보여줍니다. 

  그렇게 6개 값을 받고, 뒤 이어 0.1 직경미터 공기당 0.3um이상 입자개수를 보여줍니다. 점점 더 큰 입자를 보여주고 마지막에 10um이상 입자개수를 보여줍니다.

  버전정보, 에러, 체크썸은 이미 예제 소스에서 처리해주니까 크게 신경 안 써도 될 것 같습니다.


3. 디버깅 모드


  프로토콜과 화면에 찍히는 데이터들의 관계를 정확하게 보시고 싶으시면, 소스코드의 아래 부분을 수정하시면 됩니다.


 const bool DEBUG = false;  => false를 true로 수정


  이렇게 하시면, 아래 캡쳐처럼 읽는 한 바이트 바이트당 표시되는 값이 정리되어서 나옵니다. 대신 스크롤이 후루룩~ 되어버리니 정신 없습니다.


[출처 : 기획실장이 직접 캡쳐함]


 디버깅 모드가 아니면 이렇게 결과만 찍힙니다.


[출처 : 기획실장이 직접 캡쳐함]


4. 데이터 종류


  여하튼 중국어 스펙을 구글 번역기로 돌려보다 보니, 정확하게 이해가 안 됩니다. 하지만, 데이터 형태를 보면 크게 세 가지 형태로 나온다는 것을 알 수 있습니다.



 1. CF=1인 조건에서 PM 데이터              => "CF1" 로 표기됨
 2. 대기 조건 아래에서의 PM 데이터          => "amb" 로 표기됨

 3. 단위 면적당(부피당?) 크기별 입자 갯수   => "raw"로 표기됨

  


  실제로 터미널 창에 찍히는 예를 보면 아래와 같습니다(ver이하는 삭제함).


 

PMS7003 [42 4d] (001c) CF1=[0000 0002 0004] amb=[0000 0002 0004] raw=[0129 003d 000c 0002 0002 0000]



  이제 앞으로 조사해야 될 내용은, 저 세가지 데이터 중에서 우리가 원하는 현재 대기중의 미세먼지는 어떤 값을 참고하는게 가장 좋으냐...하는 것입니다. 이 문제는...

  

  함께 풀어보시죠^^