Две платы 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(); }
Подумал и объединил, чтобы не конфилтковали: #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")); } }