2017-05-06 3 views
0

나는 프로젝트에서 작업 해왔다. 두 개의 스케치가 있습니다. 하나는 GPS 위치를 얻는 것이고 하나는 SMS (GSM 모듈)를 통해 위치를 전송하는 것입니다. 두 스케치를 결합하고 싶습니다.두 arduino 스케치 병합

GPS 스케치 :

#include <SoftwareSerial.h> 
#include <TinyGPS.h> 

//long lat,lon; // create variable for latitude and longitude object 
float flat, flon; 

SoftwareSerial gpsSerial(4, 3); // create gps sensor connection 
TinyGPS gps; // create gps object 

void setup(){ 
    Serial.begin(9600); // connect serial 
    gpsSerial.begin(9600); // connect gps sensor 
} 

static void print_float(float val, float invalid, int len, int prec) 
{ 
    if (val == invalid) 
    { 
    while (len-- > 1) 
     Serial.print('*'); 
    Serial.print(' '); 
    } 
    else 
    { 
    Serial.print(val, prec); 
    int vi = abs((int)val); 
    int flen = prec + (val < 0.0 ? 2 : 1); // . and - 
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1; 
    for (int i=flen; i<len; ++i) 
     Serial.print(' '); 
    } 
// smartdelay(0); 
} 

void loop(){ 
    while(gpsSerial.available()){ // check for gps data 
    if(gps.encode(gpsSerial.read())){ // encode gps data 
    // gps.get_position(&lat,&lon); // get latitude and longitude 
    gps.f_get_position(&flat, &flon); 
    String lat = String(flat,6); 
    String lon = String(flon,6); 
    Serial.print(lat); 
    Serial.print(' '); 
    Serial.println(lon); 

    } 
    } 
} 

GSM 스케치 :

내가 GSM 스케치를 통해 위치를 보내고 GPS 스케치를 통해 위치를 수신 할 수 있도록이 두 스케치를 병합 할
#include <SoftwareSerial.h> 

SoftwareSerial mySerial(9, 10); 

void setup() 
{ 
    mySerial.begin(9600); // Setting the baud rate of GSM Module 
    Serial.begin(9600); // Setting the baud rate of Serial Monitor (Arduino) 
    delay(100); 
} 

int index=0; 
long dlat=0,dlong=0; 
char st[256],st1[256],st2[256]; 
void RecieveMessage() 
{ 
    mySerial.println("AT+CNMI=2,2,0,0,0"); // AT Command to receive a live SMS 
    // mySerial.println("cheking"); 
// mySerial.println(string); 
} 

void loop() 
{ 
    if (Serial.available()>0) 
    RecieveMessage(); 

if (mySerial.available()>0) 
{ 
    //int st; 
    st[index++] = mySerial.read(); 
//Serial.write(st[index-1]); 

if(index>=51&&index<=63){ 
    st1[index-51]=st[index-1]; 
    Serial.write(st1[index-51]); 
    } 
    if(index>=65&&index<=77){ 
    st2[index-65]=st[index-1]; 
    Serial.write(st2[index-65]); 
    } 
/*if(index==77) 
{ 
int i=0; 
mySerial.print(st1); 
    for(i=0;i<13;i++) 
    { 
     if(st1[i]!='.') 
     dlat=dlat*10+(st1[i]-'0'); 
     if(st2[i]!='.') 
     dlong=dlong*10+(st2[i]-'0'); 
     //Serial.print(dlat); 
    } 

//Serial.print(dlat); 
//Serial.print(" "); 
//Serial.print(dlong); 
*/ 
    } 
} 

. 도움이 될 것입니다.

감사합니다.

+0

GPS는 매 초마다 두 번 출력을 생성하며 GSM을 통해 보낼 수는 없습니다 (GSM은 데이터를 보낼 시간이 필요합니다). 약간의 시간 제한을 줘야한다. 즉, 매 3 초마다 위치 데이터를 전송하는 것을 제한한다고 가정하자. (GSM은 설정하는데 약 2 초가 걸린다. up) – Billa

+0

'SoftwareSerial'은 조금 사용하기를 꺼려합니다. – Billa

+0

@Billa gsm에서 gps로 데이터를 전송하지 않습니다. 별도로 gsm으로 데이터를 보내고 gps가 자동으로 위치 정보를 얻습니다. 이 두 코드를 하나에 병합하기 만하면됩니다. –

답변

1

다음과 같은 방법으로 당신이 당신이 스케치를 병합 할 수 있습니다 :

#include <AltSoftSerial.h> 
#include <SoftwareSerial.h> 
#include <TinyGPS.h> 

//long lat,lon; // create variable for latitude and longitude object 
float flat, flon; 

SoftwareSerial gpsSerial(4, 3); // create gps sensor connection 
TinyGPS gps; // create gps object 
static const int RXPin = 8, TXPin = 9; 
AltSoftSerial mySerial(RXPin, TXPin); 

int index=0; 
long dlat=0,dlong=0; 
char st[256],st1[256],st2[256]; 
void RecieveMessage() 
{ 
    mySerial.println("AT+CNMI=2,2,0,0,0"); // AT Command to receive a live SMS 
    // mySerial.println("cheking"); 
// mySerial.println(string); 
} 


void setup(){ 
    Serial.begin(9600); // connect serial 
    gpsSerial.begin(9600); // connect gps sensor 
    mySerial.begin(9600); // Setting the baud rate of GSM Module 
    delay(100); 
} 

static void print_float(float val, float invalid, int len, int prec) 
{ 
    if (val == invalid) 
    { 
    while (len-- > 1) 
     Serial.print('*'); 
    Serial.print(' '); 
    } 
    else 
    { 
    Serial.print(val, prec); 
    int vi = abs((int)val); 
    int flen = prec + (val < 0.0 ? 2 : 1); // . and - 
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1; 
    for (int i=flen; i<len; ++i) 
     Serial.print(' '); 
    } 
// smartdelay(0); 
} 

void loop(){ 
    while(gpsSerial.available()){ // check for gps data 
    if(gps.encode(gpsSerial.read())){ // encode gps data 
    // gps.get_position(&lat,&lon); // get latitude and longitude 
    gps.f_get_position(&flat, &flon); 
    String lat = String(flat,6); 
    String lon = String(flon,6); 
    Serial.print(lat); 
    Serial.print(' '); 
    Serial.println(lon); 

    if (Serial.available()>0) 
    RecieveMessage(); 

if (mySerial.available()>0) 
{ 
    //int st; 
    st[index++] = mySerial.read(); 
//Serial.write(st[index-1]); 

if(index>=51&&index<=63){ 
    st1[index-51]=st[index-1]; 
    Serial.write(st1[index-51]); 
    } 
    if(index>=65&&index<=77){ 
    st2[index-65]=st[index-1]; 
    Serial.write(st2[index-65]); 
    } 
/*if(index==77) 
{ 
int i=0; 
mySerial.print(st1); 
    for(i=0;i<13;i++) 
    { 
     if(st1[i]!='.') 
     dlat=dlat*10+(st1[i]-'0'); 
     if(st2[i]!='.') 
     dlong=dlong*10+(st2[i]-'0'); 
     //Serial.print(dlat); 
    } 

//Serial.print(dlat); 
//Serial.print(" "); 
//Serial.print(dlong); 
*/ 
    } 

    } 
    } 
} 

PS를 : 나는 GPS와 나머지 부분에 대한 핀 변경은 SoftwareSerial (에서 다운로드와 같은 라이브러리입니다 AltSoftSerial을 추가 같은 관계없이입니다 라이브러리를 관리하고 8 번 핀과 9 번 핀이 필요합니다.)

+0

당신이 그걸 가지고 갈 때 얻을 수있는 것. 제 생각에는 핀 8과 9로 바꾸는 것이 문제가되지 않을 것 같아요. – Billa

+0

고마워요! 그것은 성공적으로 일했다 :) –

+0

그것이 듣게되어서 기뻤다. – Billa