Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从gps获取数据,然后发送到我在arduino的手机_Arduino - Fatal编程技术网

如何从gps获取数据,然后发送到我在arduino的手机

如何从gps获取数据,然后发送到我在arduino的手机,arduino,Arduino,我想做的项目将使用GPS和GSM模块,使用Arduino,从GPS(GY-GPS/NEO6MV2)获取数据,并通过GSM(SIM900 GSM/GPRS模块)发送到我的手机。我使用单独的GPS模块 我尝试了这段代码,但仍然有问题 #include <SoftwareSerial.h> #include "SIM900.h" #include <TinyGPS.h> #include "sms.h" SMSGSM sms; TinyGPS gps; SoftwareSeri

我想做的项目将使用GPS和GSM模块,使用Arduino,从
GPS(GY-GPS/NEO6MV2)
获取数据,并通过
GSM(SIM900 GSM/GPRS模块)
发送到我的手机。我使用单独的GPS模块 我尝试了这段代码,但仍然有问题

#include <SoftwareSerial.h>
#include "SIM900.h"
#include <TinyGPS.h>
#include "sms.h"
SMSGSM sms;
TinyGPS gps;
SoftwareSerial ss(4, 3);
SoftwareSerial SIM900(7, 8);
static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);
String strL, strN, message, textForSMS;
char charL[10], charN[10], text[200];
int m = 1;
boolean started = false;
void setup()
{
Serial.begin(9600);
ss.begin(9600);
  gsm.begin(9600);
}
void loop()
{
  float flat, flon;
  unsigned long age, date, time, chars = 0;
  unsigned short sentences = 0, failed = 0;
  gps.f_get_position(&flat, &flon, &age);
  textForSMS = "Moosa Home"; //testing gps from here
  Serial.println(textForSMS);
  Serial.println(flat, 6);
  Serial.println(flon, 6);
  Serial.print("longitude: ");
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
  Serial.println("");
  Serial.print("latitude : ");
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
  smartdelay(1000);
  Serial.println(""); //till here
  delay(1000);
  if (m == 5) //send sms on third reading
    {
    Serial.println("XXXXXXXXX"); //to check whether 'if' works
    dtostrf(flat, 4, 6, charL);
    for (int i = 0; i < 10; i++)
    {
  strL += charL[i];
}
dtostrf(flon, 4, 6, charN);
for (int i = 0; i < 10; i++)
{
  strN += charN[i];
}
message = "Home";
message = message + "/nLat: ";
message = message + strL;
message = message + "/nLon: ";
message = message + strN;
message.toCharArray(text, 250);
Serial.println(text);

if (sms.SendSMS("+999999999999999", text))
{
  Serial.println("\nSMS sent OK.");
}
else
{
  Serial.println("\nError sending SMS.");
}
do {} while (1);
}
m++;
}
static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (ss.available())
  gps.encode(ss.read());
  } while (millis() - start < ms);
}
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( 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);
}
static void print_str(const char *str, int len)
{
  int slen = strlen(str);
  for (int i = 0; i < len; ++i)
Serial.print(i < slen ? str[i] : ' ');
  smartdelay(0);
}
我在代码中的错误在哪里?
我确信Gps和gsm在
SoftwareSerial
+a
loop()上使用TinyGPS可以正常工作,使用
延迟(1000)
结构工作的几率非常低。
m
计数器在这里真的没用,因为当GPS字符到达时,
loop()
将执行1000次。而且做一个
获取你的位置是没有用的,因为你可能还没有任何GPS数据

基本上,
loop()。当一些重要的事情发生时(比如说得到了所有的GPS句子,或者已经过了足够的时间),那就是你做其他工作的时候(比如发短信)。TinyGPS
smartDelay
不智能

您应该重新构造循环,使其看起来更像库中的循环。所有非GPS工作应在该示例中的
数字写入
位置执行(第62行)。这就是你会花时间发送短信的地方

TinyGPS示例需要完全重写才能完成所需的操作。他们自己很好,但很难扩展到做其他事情,比如发送短信。正如我所说,循环结构必须改变

我建议看一看我编写的NeoGPS库,因为这些示例更加健壮。该库也使用更少的RAM和CPU时间,但如果您只需要发送一条SMS消息,那么这并不是一个大问题。如果您确实想尝试,请务必查看默认的
SoftwareSerial
选项

如果让简单的NMEAblink.ino示例起作用,我建议尝试使用NMEA.ino。然后将代码插入
doSomeWork
函数。
loop
中的大部分内容都需要进入
doSomeWork
函数,只有在收到完整的RMC语句时才会调用该函数

无论使用哪个库,都需要检查数据是否有效。如果你的GPS没有接收到任何卫星呢?它可能仍然发送RMC语句,但不会有任何lat/lon数据。如果位置字段无效,您可能不应该发送SMS

Home/nLat:1000.00000/nLon:1000.00000`