Ciao a tutti,
utilizzo Arduino Mega2560, lo shield GSM/GPRS/GPS SHIELDV2 comprato da futura elettronica ed il SIM908.
Ho implementato il seguente sketch che, ogni 22 secondi (tempo di ciclo), riceve vari dati dal GPS e invia le coordinate (latitudine e longitudine) tramite richiesta post ad una pagina php:
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"
#include "stdlib.h"
#include "gps.h"
InetGSM inet;
GPSGSM gps;
char lon[15];
float lon_db;
char lat[15];
float lat_db;
char lat_conv[15];
char lon_conv[15];
char variab[70];
char alt[15];
char time[20];
char vel[15];
char stat;
char inSerial[20];
char inSerial2[20];
int i=0;
boolean started=false;
void setup()
{
//Serial connection.
Serial.begin(9600);
Serial.println(F("GSM Shield testing."));
//Start configuration of shield with baudrate.
if (gsm.begin(4800)){
Serial.println(F("\nstatus=GSM READY"));
}
else Serial.println(F("\nstatus=IDLE"));
if(started){
//GPS attach
if (gps.attachGPS())
Serial.println(F("status=GPS READY"));
else Serial.println(F("status=ERROR"));
delay(20000); //Time for fixing
stat=gps.getStat();
if(stat==1)
Serial.println(F("NOT FIXED"));
else if(stat==0)
Serial.println(F("GPS OFF"));
else if(stat==2)
Serial.println(F("2D FIXED"));
else if(stat==3)
Serial.println(F("3D FIXED"));
delay(5000);
if (inet.attachGPRS("internet.wind", "", ""))
Serial.println(F("status=ATTACHED"));
else Serial.println(F("status=ERROR"));
delay(1000);
//Read IP address.
gsm.SimpleWriteln("AT+CIFSR");
delay(5000);
//Read until serial buffer is empty.
gsm.WhileSimpleRead();
}
};
void loop()
{
Serial.println(F("inizio loop"));
serialhwread();
};
void serialhwread(){
i=0;
while (Serial1.available() > 0) {
inSerial[i]=Serial1.read();
Serial.print(inSerial[i]);
i++;
delay(10);
}
inSerial[i]='\0';
stat=gps.getStat();
if(stat==1)
Serial.println(F("NOT FIXED"));
else if(stat==0)
Serial.println(F("GPS OFF"));
else if(stat==2)
Serial.println(F("2D FIXED"));
else if(stat==3)
Serial.println(F("3D FIXED"));
// }
if(stat==2 || stat==3) {
//Get data from GPS
gps.getPar(lon,lat,alt,time,vel);
lon_db=convert(lon);
lat_db=convert(lat);
Serial.print(F("LON: "));
Serial.println(lon_db,4);
Serial.print(F("LAT: "));
Serial.println(lat_db,4);
dtostrf(lat_db, 2, 4, lat_conv);
dtostrf(lon_db, 2, 4, lon_conv);
variab[0]='\0';
strcat(variab,"lat=");
strcat(variab,lat_conv);
strcat(variab,"&long=");
strcat(variab,lon_conv);
Serial.print(F("variab:"));
Serial.println(variab);
Serial.println("richesta post");
inet.httpPOST("www.miodominio.com", 80, "/betonaggio/tracking_route_arduino/insert_data.php", variab, "read message", 0);
delay(15000);
}
inSerial[0]='\0';
}
int strpos(char *str, char *target) {
char *res=0;
res = strstr(str, target);
if (res == NULL) return false;
else return res - str;
}
float convert(char* str){
float mmmmmm;
float dd;
int pos;
pos=strpos(str,".");
char dd_str[pos-1];
dd_str[0]='\0';
char mmmmmm_str[7];
mmmmmm_str[0]='\0';
for (int i=0; i<pos-2; i++){
dd_str[i]=str[i];
}
dd_str[pos-2]='\0';
dd=atof(dd_str);
mmmmmm_str[0]=str[pos-2];
mmmmmm_str[1]=str[pos-1];
mmmmmm_str[2]=str[pos];
mmmmmm_str[3]=str[pos+1];
mmmmmm_str[4]=str[pos+2];
mmmmmm_str[5]=str[pos+3];
mmmmmm_str[6]='\0';
mmmmmm=atof(mmmmmm_str);
float result;
result=dd+mmmmmm/60;
return result;
}
Il programma gira correttamente come sopra descritto ma in alcuni loop la richiesta post non va a buon fine e sul serial monitor ottengo il seguente messaggio:
SEND FAIL
CLOSED
Solo nel loop successivo verranno inviate le coordinate alla pagina php.
In altre parole, quando si verifica ciò, devo attendere due loop o al max tre per visualizzare le coordinate nella pagina.
Questo malfunzionamento non mi permette di avere online i dati di mio interesse ad intervalli di tempo costanti.
Da cosa può dipendere questo malfunzionamento?
- Dal server che non riesce a ricevere la richiesta (utilizzo "topweb" come host provider)
- Dalla connessione GSM
- Dal buffer seriale (lo svuoto ad ogni ciclo)
Ciao,
David