정보나눔

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

전 글에 이어서 시리얼통신 질문 드려요
박창영 | 2016-09-30

시리얼통신이기에 hc-11로 연결된 상태에서 gps값을 안받고 명령을 주면 그때 hc-11을 멈추고 gps값을 받기 시작하고 

원하는 값을 받고 나면 다시 gps를 멈추고 hc-11로 값을 전송하고 싶습니다

 

listen()이 수신대기상태로 들어가고 isListening에서 case을 선택시 1이 입력돼서 1>0이 되니까 gpsvalue(gps)가

실행되는게 맞나요?

 

또 Serial.flush로 값이 다 전송되면 다시 대기상태로 돌리는 건가요?

 

 

색깔로 표시해뒀습니다

------------------------------------------------------------------------

#include

#include

 

SoftwareSerial gpsmodule(9, 10); // RX, TX

SoftwareSerial commodule(6, 7); // RX, TX

TinyGPS gps;

 

int select; // 조건문 변수

float latitude; // 위도좌표 변수

float longitude; // 경도좌표 변수

char wd; // 위도방위 변수

char kd; // 경도방위 변수

 

void setup() {

 

  Serial.begin(9600);

  gpsmodule.begin(9600);

  commodule.begin(9600);

 

  Serial.println(" 1: 현재 GPS값 , 2: GPS값 입력모드, 3: 입력된 GPS 값 확인");

  Serial.println("===========================================================================");

}

 

void loop() {

// 기본상태는 hc-11로 통신상태

// 명령시 통신중단 -> gps값 받아옴 -> 통신재개

  

  

if(Serial.available()){

  select=Serial.parseInt();

  

  switch(select){

 

    case 1: 

            Serial.println("드론의 현재위치 GPS 값");

            gpsmodule.listen();

            //while(gpsmodule.available()>0)

             if(gpsmodule.isListening()){

             gpsvalue(gps);

             

             }

             

             Serial.println("===========================================================================");

             

            break;

    case 2:

            caseselect();

            

             Serial.println("===========================================================================");

            break;

 

    case 3:

             Serial.println("입력된 위도,경도 : ");

             if(latitude==0) {

             Serial.println("입력되지 않았습니다.");

              }

    if(latitude!=0){

    Serial.print(latitude)  ;

    Serial.print(wd);

    Serial.print(" , ");

    Serial.print(longitude  );

    Serial.println(kd);

    }

     

     Serial.println("===========================================================================");

     break;

 

     // case 4 입력값 초기화 후 제자리 비행

 

    default:

    Serial.println("잘못된 입력입니다 1: 현재 GPS값 , 2: GPS값 입력모드, 3: 입력된 GPS 값 확인");

     Serial.println("===========================================================================");

    break;

  }

  }

}

void caseselect() // GPS 입력모드

{

   Serial.println("GPS Data Input ");

   Serial.println("");

   

  Serial.println("Latitude(xxxx.xxxx) : "); // 위도좌표 입력

  while (Serial.available() == 0) {}

  latitude = Serial.parseFloat();

  Serial.println(latitude,4);

 

  while (wd != 'E' && wd != 'W' && wd != 'S' && wd != 'N') { // 위도좌표 방위입력

    Serial.println("Latitude bearing : ");

   while (Serial.available() == 0) {}

    wd = Serial.read();

  }

  Serial.println(wd);

 

  Serial.println("Longitude(xxxx.xxxx) :" ); // 경도좌표 입력

  while (Serial.available() == 0) {}

  longitude = Serial.parseFloat();

  Serial.println(longitude,4);

 

  while (kd != 'E' && kd != 'W' && kd != 'S' && kd != 'N') { // 경도좌표 방위입력

    Serial.println("Longitude bearing : ");

    while (Serial.available() == 0) {}

    kd = Serial.read();

  }

    Serial.println(kd);

    

}

 

void gpsvalue(TinyGPS &gps)

{

  float latitude, longitude; // 

 

  gps.f_get_position(&latitude, &longitude); // 위도, 경도 변수 선언

 

  Serial.print("Lat/Long: "); 

  Serial.print(latitude,5); 

  Serial.print(", "); 

  Serial.println(longitude,5);

  

 

  int year;

  byte month, day, hour, minute, second, hundredths; // 날짜, 시간 변수 선언

  gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);

 

  Serial.print("Date: "); Serial.print(month, DEC); Serial.print("/"); 

  Serial.print(day, DEC); Serial.print("/"); Serial.print(year);

  Serial.print("  Time: "); Serial.print(hour, DEC); Serial.print(":"); 

  Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC); 

  Serial.print("."); Serial.println(hundredths, DEC);

 

  Serial.print("Altitude (meters): "); Serial.println(gps.f_altitude());  

 

  Serial.print("Course (degrees): "); Serial.println(gps.f_course()); 

 

  Serial.print("Speed(kmph): "); Serial.println(gps.f_speed_kmph());

  Serial.println();  

 

  unsigned long chars;

  unsigned short sentences, failed_checksum;

  gps.stats(&chars, &sentences, &failed_checksum);

}

이전글   |    날씨 정보를 루프문으로 돌리고 싶은데 어렵네요... 2016-09-30
다음글   |    코드합치는거 감이 잡히지 않습니다 2016-09-30