AVR Memory Usage
----------------
Device: Unknown
Program: 25346 bytes
(.text + .data + .bootloader)
Data: 2025 bytes
(.data + .bss + .noinit)
#include "Wire.h"
#include "SoftwareSerial.h"
#include "SD.h"
// Dichiarazioni modulo SD
File record;
// Dichiarazioni modulo MPL115A2
#include "Adafruit_MPL115A2.h"
Adafruit_MPL115A2 mpl115a2;
// Dichiarazioni modulo DHT
#include "DHT.h"
#define DHTPIN 5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Dichiarazioni modulo GSM/GPS
#include "SIM900.h"
#include "sms.h"
#include "gps.h"
SMSGSM sms;
int numdata;
char smsbuffer[160];
char n[20];
GPSGSM gps;
char lon[15];
char lat[15];
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.begin(9600);
dht.begin();
mpl115a2.begin();
Serial.println(F("CONTROLLO COMUNICAZIONE MODULI IN CORSO"));
// Controllo stato modulo DHT
if (isnan(dht.readTemperature()) || isnan(dht.readHumidity())) {
Serial.println(F("Modulo DHT: ERRORE"));
}
else {
Serial.println(F("Modulo DHT: OK "));
}
// Controllo stato modulo MPL115A2
if (isnan(mpl115a2.getPressure())) {
Serial.println(F("Modulo MPL115A2: ERRORE"));
}
else {
Serial.println(F("Modulo MPL115A2: OK "));
}
// Controllo stato modulo GSM/GPS
if (gsm.begin(2400)) {
Serial.println(F("Modulo GSM/GPS: OK"));
gsm.forceON(); //To ensure that SIM908 is not only in charge mode
started=true;
}
else {
Serial.println(F("Modulo GSM/GPS: ERRORE"));
}
Serial.println(F("\tReset del GPS in corso, 60 secondi"));
gsm.SimpleWriteln(F("AT+CGPSRST=1"));
delay(60000);
Serial.println(F("\tAttivazione del GPS in corso, 180 secondi"));
gsm.SimpleWriteln(F("AT+CGPSPWR=1"));
delay(180000);
Serial.println();
};
void loop()
{
record = SD.open("record.txt", FILE_WRITE);
if (record) {
serialhwread();
gsm.SimpleRead();
delay(20000); //Time for fixing
gps.getPar(lon,lat,alt,vel,time);
// if (alt < 80) sms.SendSMS("333000000", lat, lon); //Invia coordinate
record.print(lat);
record.print(";");
Serial.print(lat);
Serial.print(';');
record.print(lon);
record.print(";");
Serial.print(lon);
Serial.print(';');
record.print(alt);
record.print(";");
Serial.print(alt);
Serial.print(';');
record.print(dht.readTemperature());
record.print(";");
Serial.print(dht.readTemperature());
Serial.print(';');
record.print(dht.readHumidity());
record.print(";");
Serial.print(dht.readHumidity());
Serial.print(';');
record.print(mpl115a2.getPressure());
record.print(";");
Serial.print(mpl115a2.getPressure());
Serial.print(';');
record.println("");
Serial.println("");
record.close();
}
else {
Serial.println(F("ERRORE scrittura record"));
}
delay(40000);
}
void serialhwread(){
i=0;
if (Serial.available() > 0){
while (Serial.available() > 0) {
inSerial[i]=(Serial.read());
delay(10);
i++;
}
inSerial[i]='\0';
if(!strcmp(inSerial,"/END")){
Serial.println("_");
inSerial[0]=0x1a;
inSerial[1]='\0';
gsm.SimpleWriteln(inSerial);
}
//Send a saved AT command using serial port.
if(!strcmp(inSerial,"TEST")){
// Serial.println("BATTERY TEST 1");
// gps.getBattInf(msg1,msg2);
// Serial.println(msg1);
// Serial.println(msg2);
// Serial.println("BATTERY TEST 2");
// gps.getBattTVol(msg1);
// Serial.println(msg1);
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"));
}
//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();
}
La funzione printSemicolon() è una stupidaggine... evidentemente il compilatore è abbastanza "intelligente" da ottimizzare da solo questo aspetto.
PS: Uso Arduino 1.0.3 su Linux 32 bit. Scheda selezionata: Arduino 2009.