Libelium is offering new technical support channels, to contact with de Technical Support team to solve any issue our doubt please contact with your sales agent or visit our contact site



Post a new topicPost a reply Page 1 of 1   [ 9 posts ]
Author Message
 Post subject: Arduino restarts. Why
PostPosted: Sat Apr 12, 2014 9:27 pm 

Joined: Sun Sep 15, 2013 12:51 pm
Posts: 11
Location: France
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


Top
 Profile  
 
 Post subject: Re: Arduino restarts. Why
PostPosted: Mon Apr 14, 2014 8:18 am 

Joined: Mon Sep 28, 2009 12:06 pm
Posts: 11366
Hi yaaak,

Can you tell us exactly where your sketch restart?

Have you tested our example codes? Have you got any problem with them?

Regards.


Top
 Profile  
 
 Post subject: Re: Arduino restarts. Why
PostPosted: Mon Apr 14, 2014 6:44 pm 

Joined: Sun Sep 15, 2013 12:51 pm
Posts: 11
Location: France
Hello and thanks for reply

The arduino restarts just after issuing the http request.
The samples with arduino IDE don't work for me.

Thanks again


Top
 Profile  
 
 Post subject: Re: Arduino restarts. Why
PostPosted: Tue Apr 15, 2014 7:25 am 

Joined: Mon Sep 28, 2009 12:06 pm
Posts: 11366
Hi yaaak,

The samples of Arduino IDE are not for aour shield.

We talked about the examples of our tutorial:

http://www.cooking-hacks.com/documentat ... and-sim900

Thanks.

Regards.


Top
 Profile  
 
 Post subject: Re: Arduino restarts. Why
PostPosted: Tue Apr 15, 2014 10:53 pm 

Joined: Sun Sep 15, 2013 12:51 pm
Posts: 11
Location: France
I m so sorry....

I used your code and i have the same result. The sketch restarts just after the first http request.

Should i buy another gsm shield??

Thanks for help


Top
 Profile  
 
 Post subject: Re: Arduino restarts. Why
PostPosted: Tue Apr 15, 2014 10:54 pm 

Joined: Sun Sep 15, 2013 12:51 pm
Posts: 11
Location: France
Here is the new code :
void loop()
{
bool newdata = false;
unsigned long start = millis();

// Every 20 seconds we print an update
while (millis() - start < 20000)
// 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);
// Initializes HTTP service
answer = sendATcommand("AT+HTTPINIT", "OK", 10000);

if (answer == 1)
{
// Sets CID parameter
answer = sendATcommand("AT+HTTPPARA=\"CID\",1", "OK", 5000);

if (answer == 1)
{
// Sets url
answer = sendATcommand("AT+HTTPPARA=\"URL\",\"http://myipaddress/ArramAPI/api/Article/test?chaine=\'1,2.36080,48.66798,0.53708\'\"", "OK", 5000);

if (answer == 1)
{
// Starts GET action
answer = sendATcommand("AT+HTTPACTION=0", "+HTTPACTION:0,200", 10000);

}
}
}
//delay(5000);
sendATcommand("AT+HTTPTERM", "OK", 5000);
delay(3000);
//sendHTTP(dataString);
}
else
{
Serial.println("\nCouldn't open the log file!");
}
}
just afer the last sendATcommand("AT+HTTPTERM", "OK", 5000);
arduino restats from the beginning and still sending

sendATcommand("AT+SAPBR=1,1", "OK", 20000) == 0)
is the command arduino mega is repeating from setup method.

my web server receives the first http request.


Top
 Profile  
 
 Post subject: Re: Arduino restarts. Why
PostPosted: Wed Apr 16, 2014 8:07 am 

Joined: Mon Sep 28, 2009 12:06 pm
Posts: 11366
Hi yaaak,

How do you power the module?

Regards.


Top
 Profile  
 
 Post subject: Re: Arduino restarts. Why
PostPosted: Wed Apr 16, 2014 7:10 pm 

Joined: Sun Sep 15, 2013 12:51 pm
Posts: 11
Location: France
Hello

I m using external power 1.5A

Thanks for help


Top
 Profile  
 
 Post subject: Re: Arduino restarts. Why
PostPosted: Mon Apr 21, 2014 9:12 am 

Joined: Mon Sep 28, 2009 12:06 pm
Posts: 11366
Hi yaaak,

If you use the module in gateway mode and send all the commands that you use, have you got the same problem?

Regards.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post a new topicPost a reply Page 1 of 1   [ 9 posts ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
cron


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Libelium theme based on 610nm Style by Daniel St. Jules of http://www.gamexe.net


© Libelium Comunicaciones Distribuidas S.L. | Terms of use.