如何从gps获取数据,然后发送到我在arduino的手机
我想做的项目将使用GPS和GSM模块,使用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(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
+aloop()上使用TinyGPS可以正常工作,使用延迟(1000)
的结构工作的几率非常低。m
计数器在这里真的没用,因为当GPS字符到达时,loop()
将执行1000次。而且做一个获取你的位置是没有用的,因为你可能还没有任何GPS数据
基本上,loop()。当一些重要的事情发生时(比如说得到了所有的GPS句子,或者已经过了足够的时间),那就是你做其他工作的时候(比如发短信)。TinyGPSsmartDelay
不智能
您应该重新构造循环,使其看起来更像库中的循环。所有非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`