정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두이노 d1 r1 + PMS7003 질문입니다.
diqmwl | 2018-05-16
 

질문양식에 맞춰 다시 올립니다 ㅠㅠ

1. 프로젝트 사용한 보드 종류

  아두이노 d1 r1을 사용했습니다

 

2. 사용한 개발 프로그램명

  아두이노 IDE를 사용했습니다.

 

3. 사용한 센서 모델명

PMS7003 사용했습니다. 

 

4. 연결한 회로 설명 (또는 이미지)

 

 

5. 소스코드 (주석 필수)

 

#include

#include

LiquidCrystal_I2C lcd(0x3F,16,2);

SoftwareSerial mySerial(6,7);

int incomingByte = 0; // my시리얼을 읽어오기위한 변수입니다.

const int MAX_FRAME_LEN = 64; //PMS7003의 데이터를 읽어오기위한 배열의 크기입니다

char frameBuf[MAX_FRAME_LEN]; //PMS7003 데이터를 읽어오기위한 배열입니다.

int detectOff = 0;

int frameLen = MAX_FRAME_LEN;

bool inFrame = false;

char printbuf[256];

 

const bool DEBUG = false;

 

 

uint16_t calcChecksum = 0;

 

struct PMS7003_framestruct {

    uint8_t  frameHeader[2];

    uint16_t frameLen = MAX_FRAME_LEN;

    uint16_t concPM1_0_amb;

    uint16_t concPM2_5_amb;

    uint16_t concPM10_0_amb;

} thisFrame;

 

 

void setup() {

  lcd.init();

  lcd.backlight();

 

    Serial.begin(115200);
    mySerial.begin(9600);
    delay(1000);

    Serial.println("-- Initializing...");

}

 

 

bool pms7003_read() {

    Serial.println("-- Reading PMS7003");

   

    bool packetReceived = false;

    while (!packetReceived) {

      /*  if (Serial1.available() > 32) {

            int drain = Serial1.available();

            for (int i = drain; i > 0; i--) {

                Serial1.read();

            }

        }*/

        if (mySerial.available() > 0) { //PMS7003이 통신하고있다면 

            incomingByte = mySerial.read(); //값을 1바이트씩 읽는다.

            if (!inFrame) {

                if (incomingByte == 0x42 && detectOff == 0) { //처음 PMS7003이 주는값이 0x42인데 이게 맞는지 확인한다.

                    frameBuf[detectOff] = incomingByte;

                    thisFrame.frameHeader[0] = incomingByte;

                    calcChecksum = incomingByte; // Checksum init!

                    detectOff++;

                }

                else if (incomingByte == 0x4D && detectOff == 1) { //두번쨰 주는 값이 0x4D인데 맞는지 확인한다.

                    frameBuf[detectOff] = incomingByte;

                    thisFrame.frameHeader[1] = incomingByte;

                    calcChecksum += incomingByte;

                    inFrame = true;

                    detectOff++;

                }

            }

            else {

                frameBuf[detectOff] = incomingByte;

                detectOff++;

                uint16_t val = frameBuf[detectOff-1]+(frameBuf[detectOff-2]<<8); //구하려는 값이 detectOff가 12 ,14, 16일때 그 데이터를 저장한다.

                switch (detectOff) {

                    case 12:

                        thisFrame.concPM1_0_amb = val;

                        break;

                    case 14:

                        thisFrame.concPM2_5_amb = val;

                        break;

                    case 16:

                        thisFrame.concPM10_0_amb = val;

                        break;

                    default:

                        break;

                }

    

                if (detectOff >= frameLen) {

                    Serial.print("PMS1.0 = ");

                    Serial.print(thisFrame.concPM1_0_amb); //출력코드

                    Serial.print("  PMS2.5 = ");

                    Serial.print(thisFrame.concPM2_5_amb);

                    Serial.print("  PMS10 = ");

                    Serial.print(thisFrame.concPM10_0_amb);

                    Serial.print("\n");

                    packetReceived = true;

                    detectOff = 0;

                    inFrame = false;

                }

            }

        }

    }

    Serial.end();

}

 

void loop () {

    if (!pms7003_read()) {

      lcd.setCursor(0,0);

      lcd.print("PMS1.0=");

      lcd.setCursor(7,0);

    lcd.print(thisFrame.concPM1_0_amb);

        delay(4000);

    }

}

 

6. 문제점 및 에러 내용

시리얼통신화면을 켰을때 PM1_0 먼지 값이 아닌 이상한결과가 출력됩니다

원래 아두이노 UNO를 사용했을때 이코드를 사용했을때 문제가 없었는데 제가 클라우드와 연동을 하고 싶어서

아두이노 d1 r1을 사용하게 되었는데 이게 무슨문제인지 모르겠습니다.

이전글   |    [청소년 아두이노 워크숍] 아두이노로 나만의 악기 만들기, One Note Piano... 2018-05-16
다음글   |    mpu6050 센서 두개 아두이노 연결 부탁드립니다!... 2018-05-17