Hello there
I have connected sim900, gps shield and sd card on mega arduino.
The first time the program runs, evreything works fine and an http get is sent to my web server.
After that, it restarts from the beginning and nothing works while it s supposed to loop every minute and send gps infomations to my web server.
If i use sending sms messages, everything works and i can send sms every minute for example with no problem.
Here is my code
#include <TinyGPS.h> #include <SD.h> #include <stdlib.h>
//GSM int8_t answer; int onModulePin= 2; char data[512]; int data_size; char aux_string[100]; int x = 0; char phone_number[]="+3366666666666";
String URL = "http://mywebserveraddress/mywebsitepage/test?chaine="; String chainehttp = ""; String VehiculeId = "1"; char aux_str[100];
char aux; //FIN GSM
TinyGPS gps; static char dtostrfbuffer[20]; int CS = 53; int LED = 13;
//Define String String SD_date_time = "invalid"; String SD_lat = "invalid"; String SD_lon = "invalid"; String SD_speed = "invalid"; String SD_madate = "invalide";
String dataString =""; String message ="no gps";
static void gpsdump(TinyGPS &gps); static bool feedgps(); static void sendSMS(String donnees); static void sendHTTP(String donnees); static void print_float(float val, float invalid, int len, int prec, int SD_val); 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);
void setup() { pinMode(CS, OUTPUT); //Chip Select Pin for the SD Card pinMode(LED, OUTPUT); //LED Indicator //Serial interfaces Serial.begin(115200); Serial3.begin(4800); //GSM pinMode(onModulePin, OUTPUT); Serial.println("Starting..."); power_on(); delay(3000); Serial.println("Connecting to the network...");
while( (sendATcommand("AT+CREG?", "+CREG: 0,1", 500) || sendATcommand("AT+CREG?", "+CREG: 0,5", 500)) == 0 );
// Serial.print("Setting SMS mode..."); //sendATcommand("AT+CMGF=1", "OK", 1000); // sets the SMS mode to text Serial.print("Setting http mode..."); sendATcommand("AT+SAPBR=3,1,\"Contype\",\"GPRS\"", "OK", 2000); sendATcommand("AT+SAPBR=3,1,\"APN\",\"wap66\"", "OK", 2000); sendATcommand("AT+SAPBR=3,1,\"USER\",\"\"", "OK", 2000); sendATcommand("AT+SAPBR=3,1,\"PWD\",\"\"", "OK", 2000);
while (sendATcommand("AT+SAPBR=1,1", "OK", 20000) == 0) { delay(5000); } answer = sendATcommand("AT+HTTPINIT", "OK", 10000); //FIN GSM //Connect to the SD Card if(!SD.begin(CS)) { Serial.println("Card Failure ok?"); return; } Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version()); Serial.println("by Mikal Hart"); Serial.println(); Serial.print("Sizeof(gpsobject) = "); Serial.println(sizeof(TinyGPS)); Serial.println(); Serial.println("Sats HDOP Latitude Longitude Fix Date Time Date Alt Course Speed Card Distance Course Card Chars Sentences Checksum"); Serial.println(" (deg) (deg) Age Age (m) --- from GPS ---- ---- to London ---- RX RX Fail"); Serial.println("--------------------------------------------------------------------------------------------------------------------------------------"); }
void loop() { bool newdata = false; unsigned long start = millis(); // Every second we print an update while (millis() - start < 60000) // while (millis() - start < 10000) { if (feedgps()) newdata = true; } gpsdump(gps); //Write the newest information to the SD Card dataString = SD_date_time + "," + SD_lat + "," + SD_lon; if(SD_date_time != "invalid") digitalWrite(LED, HIGH); else digitalWrite(LED, LOW); //Open the Data CSV File File dataFile = SD.open("LOG.csv", FILE_WRITE); if (dataFile) { dataFile.println(dataString); Serial.println(dataString); dataFile.close(); //sendSMS(dataString); sendHTTP(dataString); } else { Serial.println("\nCouldn't open the log file!"); } }
static bool feedgps() { while (Serial3.available()) { if (gps.encode(Serial3.read())) { //Serial.println("gps ok"); digitalWrite(13, HIGH); return true; } } //Serial.println("gps not ok"); //digitalWrite(13, LOW); return false; }
static void gpsdump(TinyGPS &gps) { float flat, flon; unsigned long age, date, time, chars = 0; unsigned short sentences = 0, failed = 0; static const float LONDON_LAT = 51.508131, LONDON_LON = -0.128002; print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5); print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5); gps.f_get_position(&flat, &flon, &age); print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 9, 5, 1); //LATITUDE print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 10, 5, 2); //LONGITUDE print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
print_date(gps); //DATE AND TIME
print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 8, 2, 0); print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2, 0); print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2, 3); print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6); print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0UL : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9); print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : TinyGPS::course_to(flat, flon, 51.508131, -0.128002), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2, 0); print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);
gps.stats(&chars, &sentences, &failed); print_int(chars, 0xFFFFFFFF, 6); print_int(sentences, 0xFFFFFFFF, 10); print_int(failed, 0xFFFFFFFF, 9); digitalWrite(13, LOW); Serial.println(); }
static void sendHTTP(String datas) { Serial.println("Sending HTTP Request"); //chainehttp = VehiculeId + "," + SD_madate + "," + SD_speed; SD_lat.trim(); SD_lon.trim(); SD_speed.trim(); chainehttp = "\'" + VehiculeId + "," + SD_lat + "," + SD_lon + "," + SD_speed + "\'"; sendATcommand("AT+HTTPTERM", "OK", 5000); Serial.println("End HTTP Request"); sendATcommand("AT+HTTPTERM", "OK", 5000); } void power_on(){
uint8_t answer=0; // checks if the module is started answer = sendATcommand("AT", "OK", 2000); if (answer == 0) { // power on pulse digitalWrite(onModulePin,HIGH); delay(3000); digitalWrite(onModulePin,LOW); // waits for an answer from the module while(answer == 0){ // Send AT every two seconds and wait for the answer answer = sendATcommand("AT", "OK", 2000); } } }
static void print_int(unsigned long val, unsigned long invalid, int len) { char sz[32]; if (val == invalid) strcpy(sz, "*******"); else sprintf(sz, "%ld", val); sz[len] = 0; for (int i=strlen(sz); i<len; ++i) sz[i] = ' '; if (len > 0) sz[len-1] = ' '; Serial.print(sz); feedgps(); }
static void print_float(float val, float invalid, int len, int prec, int SD_val) { char sz[32]; if (val == invalid) { strcpy(sz, "*******"); sz[len] = 0; if (len > 0) sz[len-1] = ' '; for (int i=7; i<len; ++i) sz[i] = ' '; Serial.print(sz); if(SD_val == 1) SD_lat = sz; else if(SD_val == 2) SD_lon = sz; else if(SD_val == 3) SD_speed = sz; } else { Serial.print(val, prec); if (SD_val == 1) SD_lat = dtostrf(val,10,5,dtostrfbuffer); else if (SD_val == 2) SD_lon = dtostrf(val,10,5,dtostrfbuffer); else if (SD_val == 3) SD_speed = dtostrf(val,10,5,dtostrfbuffer); int vi = abs((int)val); int flen = prec + (val < 0.0 ? 2 : 1); flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1; for (int i=flen; i<len; ++i) Serial.print(" "); } feedgps(); }
static void print_date(TinyGPS &gps) { int year; byte month, day, hour, minute, second, hundredths; unsigned long age; gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age); if (age == TinyGPS::GPS_INVALID_AGE) { Serial.print("******* ******* "); SD_date_time = "invalid"; } else { char sz[32]; sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d", month, day, year, hour, minute, second); Serial.print(sz); SD_date_time = sz; char tz[32]; sprintf(tz, "%02d/%02d/%02d %02d:%02d:%02d", day, month, year, hour, minute, second); SD_madate = tz; Serial.print(tz); } print_int(age, TinyGPS::GPS_INVALID_AGE, 5); feedgps(); }
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] : ' '); feedgps(); }
int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout){
uint8_t x=0, answer=0; char response[100]; unsigned long previous;
memset(response, '\0', 100); // Initialice the string delay(100); while( Serial.available() > 0) Serial.read(); // Clean the input buffer Serial.println(ATcommand); // Send the AT command
x = 0; previous = millis();
// this loop waits for the answer do{ // if there are data in the UART input buffer, reads it and checks for the asnwer if(Serial.available() != 0){ response[x] = Serial.read(); x++; // check if the desired answer is in the response of the module if (strstr(response, expected_answer) != NULL) { answer = 1; } } // Waits for the asnwer with time out }while((answer == 0) && ((millis() - previous) < timeout));
return answer; }
int8_t sendATcommand3(String ATcommand, char* expected_answer, unsigned int timeout){
uint8_t x=0, answer=0; char response[100]; unsigned long previous;
memset(response, '\0', 100); // Initialice the string delay(100); while( Serial.available() > 0) Serial.read(); // Clean the input buffer Serial.println(ATcommand); // Send the AT command
x = 0; previous = millis();
// this loop waits for the answer do{ // if there are data in the UART input buffer, reads it and checks for the asnwer if(Serial.available() != 0){ response[x] = Serial.read(); x++; // check if the desired answer is in the response of the module if (strstr(response, expected_answer) != NULL) { answer = 1; } } // Waits for the asnwer with time out }while((answer == 0) && ((millis() - previous) < timeout));
return answer; }
int8_t sendATcommand2(char* ATcommand, char* expected_answer1, char* expected_answer2, unsigned int timeout){
uint8_t x=0, answer=0; char response[100]; unsigned long previous;
memset(response, '\0', 100); // Initialize the string
delay(100);
while( Serial.available() > 0) Serial.read(); // Clean the input buffer
Serial.println(ATcommand); // Send the AT command
x = 0; previous = millis();
// this loop waits for the answer do{ if(Serial.available() != 0){ response[x] = Serial.read(); x++; // check if the desired answer 1 is in the response of the module if (strstr(response, expected_answer1) != NULL) { answer = 1; } // check if the desired answer 2 is in the response of the module if (strstr(response, expected_answer2) != NULL) { answer = 2; } } // Waits for the asnwer with time out }while((answer == 0) && ((millis() - previous) < timeout));
return answer; }
the serial screem shows that Starting... AT Connecting to the network... AT+CREG? Setting http mode...AT+SAPBR=3,1,"Contype","GPRS" AT+SAPBR=3,1,"APN","wap66" AT+SAPBR=3,1,"USER","" AT+SAPBR=3,1,"PWD","" AT+SAPBR=1,1 AT+SAPBR=1,1 AT+HTTPINIT Testing TinyGPS library v. 13 by Mikal Hart
Sizeof(gpsobject) = 115
Sats HDOP Latitude Longitude Fix Date Time Date Alt Course Speed Card Distance Course Card Chars Sentences Checksum (deg) (deg) Age Age (m) --- from GPS ---- ---- to London ---- RX RX Fail -------------------------------------------------------------------------------------------------------------------------------------- **** **** ******* ******* **** ******* ******* **** ******* ****** ***** *** 0 0.00 *** 9123 0 0 invalid,******* ,******* Sending HTTP Request AT+HTTPPARA="CID",1 AT+HTTPPARA="URL","http://urll/test?chaine='1,*******,*******,*****'" AT+HTTPTERM End HTTP Request AT+HTTPTERM Starting... AT Connecting to the network... AT+CREG? Setting http mode...AT+SAPBR=3,1,"Contype","GPRS" AT+SAPBR=3,1,"APN","wap66" AT+SAPBR=3,1,"USER","" AT+SAPBR=3,1,"PWD","" AT+SAPBR=1,1 AT+SAPBR=1,1 AT+SAPBR=1,1 AT+SAPBR=1,1 AT+SAPBR=1,1 AT+SAPBR=1,1 AT+SAPBR=1,1 etc etc etc
Why the mega restarts after issuing the first http call???
Thanks for any help Most of the source is from Jeremy Blum
|