Конфилкт SIM900 & GPS

Тема в разделе "Arduino & Shields", создана пользователем ardurino, 14 июн 2015.

  1. ardurino

    ardurino Нерд

    Две платы GSM SIM900(стандартный)& GPS(http://au.picclick.com/GPS-Shield-GPS-Module-Expansion-Board-181582350402.html) . Есть два кода для них, которые по отдельности исправно работают. Но когда объединяешь - не хотят уживаться. Если в код для GPS переносишь код из GPRS, только доходишь до первой команды для GPRS - сразу алгоритм нарушается, и ожидаемых результатов в консоли не дождаться. Вроде бы они через разные ножки общаются: GPS 5-6, GPRS 7-8. Пробую на одном BitRate их запускать, для обоих 9600 ставлю.
    По отдельности работают. Вместе - никак.

    GPS код:

    Код C++


    #include <TinyGPS++.h>
    #include <SoftwareSerial.h>
    /*
    This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object.
    It requires the use of SoftwareSerial, and assumes that you have a
    4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
    */
    static const int RXPin = 5, TXPin = 6;
    static const uint32_t GPSBaud = 9600;
    double gpslat;
    // The TinyGPS++ object
    TinyGPSPlus gps;

    // The serial connection to the GPS device
    SoftwareSerial ss(RXPin, TXPin);

    void setup()
    {
    Serial.begin(9600);
    ss.begin(GPSBaud);

    Serial.println(F("DeviceExample.ino"));
    Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
    Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
    Serial.println(F("by Mikal Hart"));
    Serial.println();
    }

    void loop()
    {
    // This sketch displays information every time a new sentence is correctly encoded.
    while (ss.available() > 0)
    if (gps.encode(ss.read()))
    displayInfo();

    if (millis() > 5000 && gps.charsProcessed() < 10)
    {
    Serial.println(F("No GPS detected: check wiring."));
    while(true);
    }
    }

    void displayInfo()
    {
    Serial.print(F("Location: "));
    if (gps.location.isValid())
    {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
    }
    else
    {
    Serial.print(F("INVALID"));
    }

    Serial.print(F(" Date/Time: "));
    if (gps.date.isValid())
    {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
    }
    else
    {
    Serial.print(F("INVALID"));
    }

    Serial.print(F(" "));
    if (gps.time.isValid())
    {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
    }
    else
    {
    Serial.print(F("INVALID"));
    }

    Serial.println();
    }

    GPRS код:

    Код C++


    #include "SIM900.h"
    #include <SoftwareSerial.h>
    #include "inetGSM.h"
    //#include "sms.h"
    //#include "call.h"

    //To change pins for Software Serial, use the two lines in GSM.cpp.

    //GSM Shield for Arduino
    //www.open-electronics.org
    //this code is based on the example of Arduino Labs.

    //Simple sketch to start a connection as client.

    InetGSM inet;
    //CallGSM call;
    //SMSGSM sms;

    char msg[50];
    int numdata;
    char inSerial[50];
    int i=0;
    boolean started=false;

    void setup()
    {digitalWrite(9, HIGH);
    //Serial connection.
    Serial.begin(9600);

    };

    void loop()
    {
    //Read for new byte on serial hardware,
    //and write them on NewSoftSerial.
    serialhwread();
    //Read for new byte on NewSoftSerial.
    serialswread();
    Serial.println("GSM Shield testing.");
    //Start configuration of shield with baudrate.
    //For http uses is raccomanded to use 4800 or slower.
    if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;
    }
    else
    digitalWrite(9, HIGH);
    Serial.println("\nstatus=IDLE");

    if(started){
    //GPRS attach, put in order APN, username and password.
    //If no needed auth let them blank.
    if (inet.attachGPRS("internet.beeline.ru", "", ""))
    Serial.println("status=ATTACHED");
    else
    digitalWrite(9, HIGH);
    Serial.println("status=ERROR");
    delay(1000);

    //Read IP address.
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    //Read until serial buffer is emapty.
    gsm.WhileSimpleRead();

    //TCP Client GET, send a GET request to the server and
    //save the reply.
    numdata=inet.httpPOST("dev.com", 80, "/temperature ", "{\"title\":\"temp38\", \"temperature\": \"25\", \"latitude\":\"55.407749\",\"longitude\":\"38.866600\", \"device_id\":\"28\"}",msg,50);
    //Print the results.
    Serial.println("\nNumber of data received:");
    Serial.println(numdata);
    Serial.println("\nData received:");
    Serial.println(msg);
    }
    };

    void serialhwread(){
    i=0;
    if (Serial.available() > 0){
    while (Serial.available() > 0) {
    inSerial=(Serial.read());
    delay(10);
    i++;
    }

    inSerial='\0';
    if(!strcmp(inSerial,"/END")){
    Serial.println("_");
    inSerial[0]=0x1a;
    inSerial[1]='\0';
    gsm.SimpleWriteln(inSerial);
    }
    //Send a saved AT command using serial port.
    if(!strcmp(inSerial,"TEST")){
    Serial.println("SIGNAL QUALITY");
    gsm.SimpleWriteln("AT+CSQ");
    }
    //Read last message saved.
    if(!strcmp(inSerial,"MSG")){
    Serial.println(msg);
    }
    else{
    Serial.println(inSerial);
    gsm.SimpleWriteln(inSerial);
    }
    inSerial[0]='\0';
    }
    }

    void serialswread(){
    gsm.SimpleRead();
    }
     
  2. ardurino

    ardurino Нерд

    Подумал и объединил, чтобы не конфилтковали:

    #include "SIM900.h"
    #include <TinyGPS++.h>
    #include <SoftwareSerial.h>
    #include "inetGSM.h"
    InetGSM inet;
    /*
    This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object.
    It requires the use of SoftwareSerial, and assumes that you have a
    4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
    */
    static const int RXPin = 5, TXPin = 6;
    static const uint32_t GPSBaud = 9600;
    double gpslat;
    String double2string(double n, int ndec){
    String r = "";
    int v = n;
    r += v; // whole number part
    r += '.'; // decimal point
    int i;
    for (i=0;i<ndec;i++) {
    // iterate through each decimal digit for 0..ndec
    n -= v;
    n *= 10;
    v = n;
    r += v;
    }
    return r;
    };
    String ltd, lnd;
    char msg[50];
    int numdata;
    char inSerial[50];
    int i=0;
    boolean started=false;



    // The TinyGPS++ object
    TinyGPSPlus gps;

    // The serial connection to the GPS device
    SoftwareSerial ss(RXPin, TXPin);

    void setup()
    {digitalWrite(9, HIGH);
    Serial.begin(9600);
    ss.begin(GPSBaud);

    Serial.println(F("DeviceExample.ino"));
    Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
    Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
    Serial.println(F("by Mikal Hart"));
    Serial.println();
    }

    void loop()
    {
    // This sketch displays information every time a new sentence is correctly encoded.
    while (ss.available() > 0)
    if (gps.encode(ss.read()))
    displayInfo();

    if (millis() > 5000 && gps.charsProcessed() < 10)
    {
    Serial.println(F("No GPS detected: check wiring."));
    while(true);
    }
    }

    void displayInfo()
    {
    Serial.print(F("Location: "));
    if (gps.location.isValid())
    {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
    // ltd = (double2string (gps.location.lat(), 6));
    // lnd = (double2string (gps.location.lng(), 6));


    Serial.println(ltd);
    Serial.println(lnd);
    ltd = (double2string (44.391922, 5));
    lnd = (double2string (33.794126, 5));
    //Read for new byte on serial hardware,
    //and write them on NewSoftSerial.
    // serialhwread();
    //Read for new byte on NewSoftSerial.
    // serialswread();
    InetGSM inet;
    Serial.println("GSM Shield testing.");
    //Start configuration of shield with baudrate.
    //For http uses is raccomanded to use 4800 or slower.
    if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;
    }
    else
    digitalWrite(9, HIGH);
    Serial.println("\nstatus=IDLE");

    if(started){
    //GPRS attach, put in order APN, username and password.
    //If no needed auth let them blank.
    if (inet.attachGPRS("internet.beeline.ru", "", ""))
    Serial.println("status=ATTACHED");
    else
    digitalWrite(9, HIGH);
    Serial.println("status=ERROR");
    delay(1000);

    //Read IP address.
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    //Read until serial buffer is emapty.
    gsm.WhileSimpleRead();


    String str = "{\"title\":\"temp31\", \"temperature\": \"";
    str += 5;
    str += "\",\"latitude\":\"";
    str += 55;
    str += "\",\"longitude\":\"";
    str += 44;
    str += "\", \"device_id\":\"";
    str += 5;
    str += "\"}";
    int len = str.length()+1;
    unsigned char* buf = new unsigned char[len];
    str.getBytes(buf, len, 0);
    Serial.println((const char*)buf);
    numdata=inet.httpPOST("m-ark.kps-dev.com", 80, "/temperature ", (const char*)buf, msg, 50);
    delete buf;

    //TCP Client GET, send a GET request to the server and
    //save the reply.
    // numdata=inet.httpPOST("dev.com", 80, "/temperature ", "{\"title\":\"temp38\", \"temperature\": \"25\", \"latitude\":\"55.407749\",\"longitude\":\"38.866600\", \"device_id\":\"28\"}",msg,50);
    //Print the results.
    Serial.println("\nNumber of data received:");
    Serial.println(numdata);
    Serial.println("\nData received:");
    Serial.println(msg);

    Serial.begin(9600);
    ss.begin(GPSBaud);
    digitalWrite(9, HIGH);
    }


    }
    else
    {
    Serial.print(F("INVALID"));
    }

    Serial.print(F(" Date/Time: "));
    if (gps.date.isValid())
    {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
    }
    else
    {
    Serial.print(F("INVALID"));
    }

    Serial.print(F(" "));
    if (gps.time.isValid())
    {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
    }
    else
    {
    Serial.print(F("INVALID"));
    }


    }