BASIC4MCU | 질문게시판 | 아두이노 메가 관련
페이지 정보
작성자 duke2528 작성일2020-11-07 04:04 조회3,310회 댓글1건본문
저번에 gps와 ahrs센서 동시에 값을 시리얼모니터에 띄우는 과정에 있어서 우노로 해결되지 않아 메가로 하시라는 조언에
메가로 진행했습니다. 하지만 같은 현상이 일어나던군요ㅠㅠ 주석처리하여 gps만 값을 받게 하면 제대로 값들이 나타나는데
ahrs와 gps 모두를 데이터를 시리얼 모니터에서 보고싶은데 gps 값만 보이지 않습니다 왜 이런현상이 일어날까요?
시리얼모니터 현상 첨부하였습니다. 보면 알 수 있듯이 아직도 값이 들어오지 않는거 같습니다
사용한 코드 첨부합니다
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <TinyGPS.h>
#define SCL 43
#define SDA 45
#define CSB 47
#define SDO 49
#define SBUF_SIZE 64
TinyGPS gps;
Adafruit_BMP280 bmp(CSB,SDA,SDO,SCL);
float lat, lon; byte month, day, hour, minute, second,hundredths; int year;
float euler[6];
char sbuf[SBUF_SIZE];
signed int sbuf_cnt=0;
int EBimuAsciiParser(float *item, int number_of_item){
int n,i; int rbytes; char *addr; int result = 0;
rbytes = Serial1.available();
for(n=0;n<rbytes;n++){
sbuf[sbuf_cnt] = Serial1.read();
if(sbuf[sbuf_cnt]==0x0a){
addr = strtok(sbuf,",");
for(i=0;i<number_of_item;i++){
item[i] = atof(addr);
addr = strtok(NULL,",");
}
result = 1;
}
else if(sbuf[sbuf_cnt]=='*'){
sbuf_cnt=-1;
}
sbuf_cnt++;
if(sbuf_cnt>=SBUF_SIZE) sbuf_cnt=0;
}
return result;
}
void setup() {
Serial.begin(9600);
Serial2.begin(9600); //gps
bmp.begin();
Serial1.begin(9600); //ahrs
}
void loop() {
if(EBimuAsciiParser(euler, 6)){
Serial.print("\n\r");
Serial.print(euler[0],3); Serial.print(",");
Serial.print(euler[1],3); Serial.print(",");
Serial.print(euler[2],3); Serial.print(",");
Serial.print(euler[3],3); Serial.print(",");
Serial.print(euler[4],3); Serial.print(",");
Serial.println(euler[5],3);
}
while(Serial2.available()){
int data=Serial2.read();
if (gps.encode(data)){
gps.f_get_position(&lat,&lon);
gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
if (hour+9>24){
hour=hour+9-24;
}
else {
hour=hour+9;
}
}
}
Serial.print("lat:");Serial.print(lat,5); Serial.print(",");
Serial.print("lon:"); Serial.println(lon,5);
Serial.print(" Time: "); Serial.print(hour,DEC); Serial.print(":");
Serial.print(minute, DEC); Serial.print(":"); Serial.println(second, DEC);
Serial.print("Temperature:"); Serial.print(bmp.readTemperature()); Serial.print(",");
Serial.print("pressure:"); Serial.print(bmp.readPressure()); Serial.print(",");
Serial.print("Altitude:"); Serial.println(bmp.readAltitude(1017.9));
delay(1200);
}
댓글 1
조회수 3,310master님의 댓글
master 작성일
루프 함수에서
if()문과 while()문은 조건에 부함될 때만 실행 합니다.
그 아래의 시리얼모니터 출력은 매 루프마다 실행하는데
필요한 조건에서 실행하도록 변경하는 것이 좋겠죠
while(Serial2.available()){
int data=Serial2.read();
if (gps.encode(data)){
gps.f_get_position(&lat,&lon);
gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
if (hour+9>24){ hour=hour+9-24; } else { hour=hour+9; }
Serial.print("lat:");Serial.print(lat,5); Serial.print(","); // <-- 이동
Serial.print("lon:"); Serial.println(lon,5); // <-- 이동
Serial.print(" Time: "); Serial.print(hour,DEC); Serial.print(":"); // <-- 이동
Serial.print(minute, DEC); Serial.print(":"); Serial.println(second, DEC); // <-- 이동
Serial.print("Temperature:"); Serial.print(bmp.readTemperature()); Serial.print(","); // <-- 이동
Serial.print("pressure:"); Serial.print(bmp.readPressure()); Serial.print(","); // <-- 이동
Serial.print("Altitude:"); Serial.println(bmp.readAltitude(1017.9)); // <-- 이동
}
}
delay(1200);
}
https://github.com/mikalhart/TinyGPS/issues/19
이 예제에서는 다른 라이브러리를 사용하고 있으므로 라이브러리를 변경해서도 테스트 해보세요