【问题标题】:Merging two arduino sketches合并两个 arduino 草图
【发布时间】:2017-05-09 00:23:53
【问题描述】:

我一直在做一个项目。我有两张草图。一种是获取 GPS 位置,一种是通过 SMS(GSM 模块)发送位置。我想合并两个草图。

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 草图:

#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);
 */
  }
 }

我想合并这两个草图,以便我可以通过 GSM 草图发送位置并通过 GPS 草图接收位置。 任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • GPS 每秒会生成几次输出,并且无法通过 GSM 发送(因为 GSM 需要一些时间来发送数据)。你应该给一些时间限制,即假设限制它说每 3 秒发送一次位置数据(GSM 可能需要大约 2 秒来设置)
  • SoftwareSerial 有点贬义,你应该避免使用它。
  • @Billa 我没有将数据从 gsm 发送到 gps。我将数据单独发送到 gsm,gps 会自动获取其位置。我只想将这两个代码合并为一个。
  • 是的。我知道你是从 gps 发送到 gsm。但我可以告诉你它不会像你想的那样工作,因为它可能会因为 GSM 导致一些滞后。你能添加两张截图gps 和 gsm 工作

标签: arduino arduino-uno arduino-ide


【解决方案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);
 */
  }

   }
  }
}

P.S : 我已经更改了 GPS 的引脚,其余部分是相同的,无论添加 AltSoftSerial 它是一个与 SoftwareSerial 相同的库(从管理库下载它,它需要引脚 8 和 9)

【讨论】:

  • 请告诉我你使用它时得到了什么。我认为切换到引脚 8 和 9 对你来说不会有问题
  • 很高兴听到它有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多