problema connessione GSM e GPRS shield con arduino Mega[Risolto]

Ciao a tutti,

sto provando da diversi giorni a far girare un programmino che sfrutti il GPS e il GSM per rilevare la posizione dell’arduino e trasmetterle in rete.
Il programma è il seguente:

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"
#include "stdlib.h"
#include "gps.h"

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

//Simple sketch to start a connection as client.

InetGSM inet;
GPSGSM gps;

char lon[15];
float lon_db;
char lat[15];
float lat_db;
char lat_conv[10];
char lon_conv[10];
char variab[50];
char alt[15];
char time[20];
char vel[15];
char msg1[5];
char msg2[5];

char stat;
char inSerial[20];
int i=0;
boolean started=false;

void setup() 
{
  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(4800)){
    Serial.println("\nstatus=READY");
    //gsm.forceON(); //To ensure that SIM908 is not only in charge mode
    started=true;  
  }
  else Serial.println("\nstatus=IDLE");
  
  if(started){
    //GPS attach
    if (gps.attachGPS())
      Serial.println("status=GPSREADY");
    else Serial.println("status=ERROR");
    delay(20000); //Time for fixing
    stat=gps.getStat();
	if(stat==1)
		Serial.println("NOT FIXED");
	else if(stat==0)
		Serial.println("GPS OFF");
	else if(stat==2)
		Serial.println("2D FIXED");
	else if(stat==3)
		Serial.println("3D FIXED");
	delay(5000);
        if (inet.attachGPRS("internet.wind", "", ""))
      Serial.println("status=ATTACHED");
    else Serial.println("status=ERROR");
    delay(1000);
    
    //Read IP address.
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    //Read until serial buffer is empty.
    gsm.WhileSimpleRead();


        Serial.println("FINE SETUP");
  }
};

void loop() 
{
  //Read for new byte on serial hardware,
  //and write them on NewSoftSerial.
  serialhwread();
  if(stat==2 || stat==3)
  {

     inet.httpPOST("www.miodominio.com", 80, "/betonaggio/tracking_route_arduino/insert_data.php", variab);
     delay(5000);
  }
  
  //Read for new byte on NewSoftSerial.
  //serialswread();
};

void serialhwread(){
  i=0;

  if (Serial1.available() > 0){            
    while (Serial1.available() > 0) {
      inSerial[i]=(Serial1.read());
      delay(10);
      i++;      
    }
    
    inSerial[i]='\0';
    if(!strcmp(inSerial,"/END")){
      Serial.println("_");
      inSerial[0]=0x1a;
      inSerial[1]='\0';
      gsm.SimpleWriteln(inSerial);
    }

 if(stat==1)
 Serial.println("NOT FIXED");
 else if(stat==0)
 Serial.println("GPS OFF");
 else if(stat==2)
 Serial.println("2D FIXED");
 else if(stat==3)
 Serial.println("3D FIXED");

   delay(5000);
    //Get data from GPS
gps.getPar(lon,lat,alt,time,vel);


    lon_db=convert(lon);
    lat_db=convert(lat);
    Serial.print("LON: ");
    Serial.println(lon_db,4);
    Serial.print("LAT: ");
    Serial.println(lat_db,4);
    
    dtostrf(lat_db, 2, 4, lat_conv);
    dtostrf(lon_db, 2, 4, lon_conv);
    
 strcat(variab,"lat=");
 strcat(variab,lat_conv);
 strcat(variab,"&long=");
 strcat(variab,lon_conv);
        strcat(variab,"&username=mbistato");
    Serial.print("variab:");
    Serial.println(variab);
    
    //Read last message saved.
    if(!strcmp(inSerial,"MSG")){
      Serial.println(msg1);
    }
    else{
      Serial.println(inSerial);
      gsm.SimpleWriteln(inSerial);
    }    
    inSerial[0]='\0';
  }
}

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

Ho modificato la funzione “inet.httpPOST” in modo da inviare solo i dati alla pagina senza dover ricevere risposta (perchè a me non serve).
Facendo un debug con il serial monitor, vedo che viene rieseguito sempre il setup.
Ho letto che questo è dovuto al fatto che arduino andando in crash si resetta e riparte nuovamente.
Avete qualche idea di cosa può causare questo problema?

Grazie mille

Stai usando il modulo SIM908 o SIM900?

Il primo è abilitato a ricevere il segnale GPS, mentre il secondo no.

La libreria SIM900 deve essere l'ultima versione per comprendere anche il SIM908 ed i suoi comandi.

sto usando il modulo SIM908 e la libreria che uso è aggiornata.

Le coordinate le acquisisco e riesco a spedirle alla pagina php.

Ripeto che il problema sta solo nel fatto che viene eseguito il setup più volte.

Se il setup viene eseguito più volte vuol dire che forse l'alimentazione è insufficiente.

ma io sto usando un alimentatore da 12V 2A.

Infatti avevo letto che lo shield assorbiva max 2A.

Allora il problema deve essere in loop.

Metti dei print in modo fa monitorare i vari passaggi e vedere dove si blocca.

Grazie del consiglio. Ho capito che arduino si blocca quando esegue la

gps.getPar(lon,lat,alt,time,vel);

nel primo loop la esegue correttamente scrivendo nel serial monitor:

ATT: OK
RIC: 
0,1438.301168,3739.460213,579.344666,20141205182316.000,3,10,0.000000,0.000000
OK

Fatto ciò, riesegue il loop ma non appena arriva nuovamente alla gps.getPar da come output:

ATT: OK
RIC: 
+CGPSSTATUS: Location 3D Fix

OK

CLOSED

Subito dopo riesegue il setup.

Qualche idea?

Ho un shied gsm con chip SIM900 su un mega,

il problema del riavvio oltre ad un problema di alimentazione come ti ha suggerito @cyberhs ,

potrebbe essere un problema di memoria disponibile utilizza la funzione per vedere la memoria disponibile forse questo va bene ma non lo ho testato

// this function will return the number of bytes currently free in RAM      
extern int  __bss_end; 
extern int  *__brkval; 
int freemem()
{ 
int free_memory; 
if((int)__brkval == 0) 
   free_memory = ((int)&free_memory) - ((int)&__bss_end); 
else 
   free_memory = ((int)&free_memory) - ((int)__brkval); 
return free_memory; 
}

Un altro problema potrebbe essere la "imcompatibilità" con alcune librerie ti spiego, sempre nel shield sim900 con mega ed un modulo tft, volendo aggiungere la libreria dallas-temperature appena veniva inizializzata la funzione il sistema si riavvia, se non includo la libreria (con i richiami alla stessa), il sistema funziona.

un altro problema che ho avuto sempre con lo stesso progetto è la posizione di chiamata della libreria sim900, mettendolo all'inizio avevo problemi, l'ho dovuto inserire prima del setup.

Ha stavo dimenticando, ho avuto dei problemi con la funzione itoa() quando veniva richiamata il sistema si riavvia, mi ha fatto impazzire perchè a volte andava e volte no, la utilizzo per impostare l'orario con il touch tft, le variabili erano sempre impostate, ma si riavviava a sua "volonta" :grin:

Ciao
Pino

Ciao Pines e grazie per la risposta.
Ho risolto svuotando la variabile "variab" che si riempiva ad ogni ciclo

Samuel

Benissimo,

se non sbaglio se hai risolto metti il tag [Risolto] .