질문양식에 맞춰 다시 올립니다 ㅠㅠ
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을 사용하게 되었는데 이게 무슨문제인지 모르겠습니다.
|