정확히 미세먼지 센서 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 을 아두이노메가 측정 코드와 결과 참고
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(13, 11); // RX 13, TX 11 unsigned char Send_data[5] = {0x11,0x02,0x0b,0x01, 0xE1}; // 농도읽는명령 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 = 0; break;} } } 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(13, 11); // RX 13, TX 11 unsigned char Send_data[5] = {0x11,0x02,0x0b,0x01, 0xE1}; // 농도읽는명령 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 = 0; break;} } } 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 |
실습 사진이다. 잘 안되는 경우 배선연결을 확인하도록 한다.
'아두이노' 카테고리의 다른 글
1차 이메일 송부 - 20181120 (0) | 2018.11.21 |
---|---|
레이저 미세먼지 센서 PM2008M 에 대해 알아보자. (0) | 2018.11.14 |
레이저 미세먼지 센서 PM2008M 을 아두이노메가 측정 코드와 결과 (1) | 2018.11.14 |
중요한 대기 환경 관련 용어설명 (0) | 2018.11.06 |
아두이노에서 멀티태스킹 구현하기 1 - Multi-tasking the arduino : Blink without delay (1) | 2018.01.26 |