?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

질문 | 아두이노 d1 + PMS7003을이용한 미세먼지 측정기

페이지 정보

작성자 diqmwl 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일18-05-16 00:07 조회188회 댓글2건

본문

안녕하세요 아두이노와 PMS7003으로 미세먼지에 관련해서 공부중입니다.

PMS7003이 RX통신을해서 SoftwareSerial을 활용해서 우노에서 작동을했습니다!

잘되었고 그 후 클라우드와 연동하고싶어서 아두이노 d1 r1(와이파이 기능때문에) 을 사용해서같은 코드를 사용했는데 잘되지 않네요 코드상에는 별 문제가 없는거 같은데 소프트웨어 시리얼이 d1 r1은 안되는건가요?

#include <SoftwareSerial.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);

SoftwareSerial mySerial(2,9);

int incomingByte = 0; // for incoming serial data

const int MAX_FRAME_LEN = 64;

char frameBuf[MAX_FRAME_LEN];

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);

    delay(1000);

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

}





bool pms7003_read() {

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

    mySerial.begin(9600);

    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) {

            incomingByte = mySerial.read();

            if (!inFrame) {

                if (incomingByte == 0x42 && detectOff == 0) {

                    frameBuf[detectOff] = incomingByte;

                    thisFrame.frameHeader[0] = incomingByte;

                    calcChecksum = incomingByte; // Checksum init!

                    detectOff++;

                }

                else if (incomingByte == 0x4D && detectOff == 1) {

                    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);

                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);

    }

}
사용한 코드입니다.
그리고 연결했을시 시리얼통신 화면에서 이런 화면이 나옵니다! 혹시 뭐가 잘못된건지 알수 있을까요?
stack>>
8ffebb0: 3ff3890c 00000000000 3ffeeb2c 402024a2

댓글목록

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일

pms7003_read() 함수 안에 아래 SoftwareSerial 초기화 코드가 들어가 있네요.
>> mySerial.begin(9600)

그런데 pms7003_read() 함수는 loop()에서 반복 호출되므로 계속 시리얼 초기화가 됩니다. 초기화 코드를 빼서 setup()에 넣은뒤 다시 테스트 해보세요.

diqmwl님의 댓글

diqmwl 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

안녕하세요 답글 정말 감사드립니다. 답급을 보고  mySerial.begin(9600) 부분을 setup 부분으로 빼서 실행해보았는데 마찬가지로 이상한 값이 나옵니다.
Soft WDT reset
ctx: cont
sp : 3ffefa10 end: 3ffefc10 offset: 01b0
>>>stack>>>이런 결과가 나오네요 ㅠㅠ
 혹시 아두이노 d1 r1은 시리얼통신할때 포트가 정해져 있나요??