BASIC4MCU | 질문게시판 | 아두이노 메가 다중시리얼통신 질문입니다
페이지 정보
작성자 뚤밥 작성일2021-07-18 01:55 조회7,302회 댓글2건본문
제가 겪고 있는 문제는"아두이노 메가를 "이용해 다중 시리얼 통신을 하고싶은데 제대로 되지 않는것 같습니다
현제 시리얼 통신을 사용하는것은 esp8266과 미세먼지 센서입니다
통신을 동시에사용 하면 오류가 생기는것 같습니다
질문 1) mySerial.listen(); 이것을 사용하면 된다고 하는데 어디에 어떻게 넣어야할지 그리고 이 listen이 무엇을 의미하는지 잘모르겠습니다
또한 esp8266통신 부분을 주석처리하면 미세먼지값이 잘 나오는데 esp8266을 주석처리했으니까 당연히 센서값이 안넘어가서 파이어베이스에는 모든 센서값이 0으로 뜹니다
esp8266통신을 원래 하던데로 하면 미세먼지와의 통신이 끊기는지 파이어베이스에서는 co2와 온습도는 제대로 나오는데 미세먼지 센서값이 다 0으로 나옵니다
그래서 정말 고민입니다
#include <SoftwareSerial.h>
#include "DHT.h" // DHT 라이브러리 호출
#include <MHZ19PWM.h>
MHZ19PWM mhz(2, MHZ_CONTINUOUS_MODE); //co2센서
SoftwareSerial dust(10, 11); //미세먼지센서와 통신
SoftwareSerial mySerial(52, 53); //esp8266과 연결 esp8266을 이용해 firebase에 센서값을 보내줄 것입니다
int dust1; //미세먼지 측정을 위한 변수입니다
int dust2; //위에것과 동일
#define DHTPIN 7
#define DHTTYPE DHT22
int co2; //co2 측정을 위한 변수입니다
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
dust.begin(9600);
mySerial.begin(9600);
mhz.useLimit(5000);
}
void co2Value() //co2측정을 위한함수입니다 co2라는 변수에 방안의 co2농도가 저장됩니다
{
unsigned long start = millis();
co2 = mhz.getCO2();
unsigned long duration = millis() - start;
}
void loop()
{
co2Value();
//////////////////////////////////////////미세먼지 측정센서에서 가져온 코드
int chksum=0,res=0;;
unsigned char pms[32]={0,};
if(dust.available()>=32){
for(int j=0; j<32 ; j++){
pms[j]=dust.read();
if(j<30)
chksum+=pms[j];
}
dust1=pms[12]+pms[13]; //미세먼지 2.5pm 값이 13번째 또는 14번째 배열에 담깁니다
dust2 =pms[14]+pms[15]; //미세먼지 10pm 값이 15번째 또는 16번째 배열에 담깁니다
}
/////////////////////////////////// 여기까지가 미세먼지측정 코드
int h = dht.readHumidity(); // 습도값을 h에 저장
int t = dht.readTemperature(); // 온도값을 t에 저장
////////////////////////////////////////////////// 여기서부터 esp8266에 값을 보내줍니다
mySerial.write('#');// 시작문자
mySerial.write(dust1/10);
mySerial.write(dust1%10);
mySerial.write(dust2/10); //먼지
mySerial.write(dust2%10);
mySerial.write(t/10);
mySerial.write(t%10);
mySerial.write(h/10); //온습도
mySerial.write(h%10);
mySerial.write(co2/1000); //co2
mySerial.write(co2/100%10);
mySerial.write(co2/10%10);
mySerial.write(co2%10);
mySerial.write('$'); // 종료문자
Serial.println(co2); ///////센서값들이 잘 담겼나 보기위해 사용한거지 특별한 의미는 없습니다
Serial.println(pms[12]);
Serial.println(pms[13]);
Serial.println(pms[14]);
Serial.println(pms[15]);
delay(2000); //센서 데이터시트에서의 측정 주기를 위한 딜레이 입니다.
}
질문 2) 아두이노 메가는 아두이노 우노와 다르게 하드웨어 시리얼핀이 많아서 굳이 #include <SoftwareSerial.h> 이것을 안해줘도 된다고 공부하였습니다 그래서 위에 코드를 바꾼것이 아래 코드인데 잘 바꿨는지 모르겠습니다
//#include <SoftwareSerial.h>
#include "DHT.h" // DHT 라이브러리 호출
#include <MHZ19PWM.h>
MHZ19PWM mhz(2, MHZ_CONTINUOUS_MODE);
//SoftwareSerial dust(10, 11); //미세먼지
//SoftwareSerial mySerial(52, 53);
int dust1;
int dust2;
#define DHTPIN 7
#define DHTTYPE DHT22
int co2;
DHT dht(DHTPIN, DHTTYPE);
void setup()
{ Serial.begin(9600);
Serial1.begin(9600); // 시리얼 통신 속도 설정 및 시작 합니다.
Serial2.begin(9600);
//dust.begin(9600);
// mySerial.begin(9600);
mhz.useLimit(5000);
}
void co2Value()
{
unsigned long start = millis();
co2 = mhz.getCO2();
unsigned long duration = millis() - start;
}
void loop()
{
co2Value();
int chksum=0,res=0;;
unsigned char pms[32]={0,};
if(Serial1.available()>=32){
for(int j=0; j<32 ; j++){
pms[j]=Serial1.read();
if(j<30)
chksum+=pms[j];
}
dust1=pms[12]+pms[13];
dust2 =pms[14]+pms[15];
}
int h = dht.readHumidity(); // 습도값을 h에 저장
int t = dht.readTemperature(); // 온도값을 t에 저장
Serial2.write('#');// 시작문자
Serial2.write(dust1/10);
Serial2.write(dust1%10);
Serial2.write(dust2/10);//먼지
Serial2.write(dust2%10);
Serial2.write(t/10);
Serial2.write(t%10);
Serial2.write(h/10);//온습도
Serial2.write(h%10);
Serial2.write(co2/1000);//co2
Serial2.write(co2/100%10);
Serial2.write(co2/10%10);
Serial2.write(co2%10);
Serial2.write('$'); // 종료문자
Serial.println(co2);
Serial.println(pms[12]);
Serial.println(pms[13]);
Serial.println(pms[14]);
Serial.println(pms[15]);
delay(1000);
}
댓글 2
조회수 7,302master님의 댓글
master 작성일한 가지씩 변경해서 체크하는 것이 문제 발생 시 해결하는데 더 도움이 됩니다.
뚤밥님의 댓글
뚤밥 작성일감사합니다