【问题标题】:Sending GPS location via GSM module通过 GSM 模块发送 GPS 位置
【发布时间】:2017-12-15 09:33:21
【问题描述】:

我正在使用 SIM900A GSM 模块和 NEO-6m GPS 模块。我想在 GSM 模块收到消息时通过 GSM 模块发送位置。

当我在 GSM 模块的帮助下接收和发送任何消息时,我的代码可以工作,但当我加入这两个模块时,它就不能工作,即 GPS 和 GSM 模块。

这是我的两个代码。

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

// GSM
SoftwareSerial SIM900A(9, 10);
SoftwareSerial mySerial(5, 6);
TinyGPS gps;

void setup() {
  Serial.begin(9600);
  SIM900A.begin(9600);
  SIM900A.println("AT+CNMI=2,2,0,0,0");
  mySerial.begin(9600);
  delay(1000);
}

void loop() {
  bool newdata = false;
  String buffer = readSIM900A();
  if(SIM900A.available() > 0)
    Serial.println(SIM900A.read());
  if (buffer.startsWith("\r\n+CMT: ")) {
    // printing the number
    Serial.println(buffer.substring(9, 22));
    // Remove first 51 characters
    // buffer.remove(0, 51);
    int len = buffer.length();
    // printing message
    Serial.println(buffer.substring(51, len-2));
    if (buffer.substring(51, len-2) == "location") {
      Serial.println("Sending location");
      // GPS
      if (mySerial.available()) {
        char c = mySerial.read();
        if (gps.encode(c)) {
          newdata = true;
        }
      }
      if (newdata) {
        long int lat, lon;
        unsigned long age, age1, date, time, chars;
        gps.get_position(&lat, &lon, &age);
        gps.get_datetime(&date, &time, &age);
        Serial.print("Lat/Long(10^-5 deg): ");
        Serial.print(lat);
        Serial.print(", ");
        Serial.print(lon); 
        Serial.print(" Fix age: "); 
        Serial.print(age); Serial.println("ms.");
        Serial.print("Date(ddmmyy): "); Serial.print(date);
        Serial.print(" Time(hhmmsscc): ");
        Serial.print(time);
        Serial.print(" Fix age: "); Serial.print(age); 
        Serial.println("ms.");
        Serial.print("Alt(cm): "); Serial.print(gps.altitude());
        Serial.print(" Speed(mps): "); Serial.print(gps.f_speed_mps());
        // setting GSM module
        SIM900A.println("AT+CMGF=1"); //Sets the GSM Module in Text Mode
        delay(1000); // Delay of 1000 milli seconds or 1 second
        // sending location from which code word had come
        SIM900A.println("AT+CMGS=\"" + buffer.substring(9, 22) + "\"\r");
        // Replace x with mobile number
        Serial.println("AT+CMGS=\"" + buffer.substring(9, 22) + "\"\r");
        delay(1000);
        SIM900A.print("Lat/Long(10^-5 deg): ");
        SIM900A.print(lat);
        SIM900A.print(", ");
        SIM900A.print(lon); 
        SIM900A.print(" Fix age: "); 
        SIM900A.print(age); SIM900A.println("ms.");
        SIM900A.print("Date(ddmmyy): "); SIM900A.print(date);
        SIM900A.print(" Time(hhmmsscc): ");
        SIM900A.print(time);
        SIM900A.print(" Fix age: "); SIM900A.print(age); 
        SIM900A.println("ms.");
        SIM900A.print("Alt(cm): "); SIM900A.print(gps.altitude());
        SIM900A.print(" Speed(mps): "); SIM900A.print(gps.f_speed_mps());
        SIM900A.println((char)26);// ASCII code of CTRL+Z
        delay(1000);
      }
    }
  }
  delay(100);
}

String readSIM900A() {
  String buffer;
  while (SIM900A.available()) {
    char c = SIM900A.read();
    buffer.concat(c);
    delay(10);
  }
  return buffer;
}

以上是 GPS 和 GSM 模块一起处理时的最终代码。当它们分开处理时,它们工作得很好。

连接:

SIM900A的Tx、Rx引脚分别连接到Arduino Nano的9、10,GPS模块的Tx、Rx分别连接到5、6。而且我还与 Arduino 建立了共同点。

【问题讨论】:

  • 附加您的连接以及结合两者时收到的输出。不工作不具体
  • 串行监视器没有任何输出。
  • 抱歉,我上传了另一个代码。我刚刚更正了。
  • 是的,这就是我问的原因。在写 SO 之前请小心,否则会误导和浪费时间
  • 我已将 SIM900A 的 Tx、Rx 引脚分别连接到 Arduino nano 的 9、10 和 GPS 模块的 Tx、Rx 分别连接到 5、6。并与 Arduino 共同发展。

标签: arduino gps gsm


【解决方案1】:
#include <NeoSWSerial.h>
//#include <SoftwareSerial.h>
#include <AltSoftSerial.h>
// GPS
#include <TinyGPS.h>

// GSM
static const int RXPin = 8, TXPin = 9;
AltSoftSerial SIM900A(RXPin, TXPin);

NeoSWSerial mySerial(5, 6);
TinyGPS gps;

void setup()
{
Serial.begin(9600);
SIM900A.begin(9600);
SIM900A.println("AT+CNMI=2,2,0,0,0");
mySerial.begin(9600);
delay(1000);
}

void loop()
{
bool newdata = false;
String buffer = readSIM900A();
if(SIM900A.available() > 0)
  Serial.println(SIM900A.read());
if (buffer.startsWith("\r\n+CMT: "))
{
    // printing the number
    Serial.println(buffer.substring(9, 22)); 

    // Remove first 51 characters
    // buffer.remove(0, 51);
    int len = buffer.length();
    // Remove \r\n from tail
    // buffer.remove(len - 2, 2);
    // printing message
    Serial.println(buffer.substring(51, len-2));
    if (buffer.substring(51, len-2) == "location")
    {
      Serial.println("Sending location");

      // GPS
      if (mySerial.available()) 
      {
         char c = mySerial.read();
         if (gps.encode(c)) 
         {
            newdata = true;
         }
      }
      if (newdata)
      {
        long int lat, lon;
        unsigned long age, age1, date, time, chars;

        gps.get_position(&lat, &lon, &age);
        gps.get_datetime(&date, &time, &age);
        Serial.print("Lat/Long(10^-5 deg): ");
        Serial.print(lat);
        Serial.print(", ");
        Serial.print(lon); 
        Serial.print(" Fix age: "); 
        Serial.print(age); Serial.println("ms.");

        Serial.print("Date(ddmmyy): "); Serial.print(date); Serial.print(" 
        Time(hhmmsscc): ");
        Serial.print(time);
        Serial.print(" Fix age: "); Serial.print(age); 
        Serial.println("ms.");

        Serial.print("Alt(cm): "); Serial.print(gps.altitude());
        Serial.print(" Speed(mps): "); Serial.print(gps.f_speed_mps());

        // setting GSM module
        SIM900A.println("AT+CMGF=1");    //Sets the GSM Module in Text Mode
        delay(1000);  // Delay of 1000 milli seconds or 1 second
        // sending location from which code word had come
        SIM900A.println("AT+CMGS=\"" + buffer.substring(9, 22) + "\"\r"); // 
         Replace x with mobile number
        Serial.println("AT+CMGS=\"" + buffer.substring(9, 22) + "\"\r");
        delay(1000);

        SIM900A.print("Lat/Long(10^-5 deg): ");
        SIM900A.print(lat);
        SIM900A.print(", ");
        SIM900A.print(lon); 
        SIM900A.print(" Fix age: "); 
        SIM900A.print(age); SIM900A.println("ms.");

        SIM900A.print("Date(ddmmyy): "); SIM900A.print(date); 
        SIM900A.print(" Time(hhmmsscc): ");
        SIM900A.print(time);
        SIM900A.print(" Fix age: "); SIM900A.print(age); 
        SIM900A.println("ms.");

        SIM900A.print("Alt(cm): "); SIM900A.print(gps.altitude());
        SIM900A.print(" Speed(mps): "); SIM900A.print(gps.f_speed_mps());

        SIM900A.println((char)26);// ASCII code of CTRL+Z
        delay(1000);
      }
    }
    }
    delay(100);
   }

 String readSIM900A()
{
String buffer;

while (SIM900A.available())
{
    char c = SIM900A.read();
    buffer.concat(c);
    delay(10);
}

return buffer;
}

P.S:我已经更改了 GSM 的引脚,其余部分相同。除了添加AltSoftSerial之外,它是一个与SoftwareSerial相同的库(从管理库下载它,它需要引脚8和9)。不要在草图中更改引脚号更改连接。

【讨论】:

  • 如果您有任何疑问,请随时询问。
  • 我不认为 8 是 pwm pin arduino nano
  • 所以我认为pin 8不能用于串行通信。您对此有什么建议或解释吗?
  • 试试看。我已经在 arduino uno 上对其进行了测试,它确实有效。 8 也不是 uno 上的 pwm。
  • 嘿,它不起作用,我尝试了上面的代码。我再也没有得到任何输出。 Pin 8 工作正常,我认为还有其他问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多