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