Credo di aver trovato (Uno) dei problemi..In pratica il delay del loop era troppo "corto" (l'avevo impostato a 0,in quanto ho necessita' che il sistema acquisisca segnali in tempi rapidissimi (decina di ms),invece la GSM shield,da come si vede nel codice seguente richiede almeno 400 ms totali per inviare un sms:
void SendTextMessage()
{
Sim900Serial.print("AT+CMGF=1\r"); //Sending the SMS in text mode
delay(100);
Sim900Serial.println("AT + CMGS = \"12345677\"");//The target phone number
delay(100);
Sim900Serial.println("hello");//the content of the message
delay(100);
Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26
delay(100);
Sim900Serial.println();
}
E questa differenza di "delay" eventualmente mi creava anche problema con la scrittura su SD. Infatti se imposto il delay a 0,il sistema o si blocca o non scrive su SD.
Ora ho impostato il delay del loop principale a 2 secondi,e lasciato i delay a 100 ms come si vede dallo sketch in alto.
E il sistema funziona bene.Il problema e' che per il sistema che devo realizzare 2 secondi e' un eternita'.
Dovrei fare in modo dunque di inviare l'sms,quando lo switch e' off.
In pratica dopo l'impatto,se AX O AY sono > = 1, potrei inserire una variabile di tipo boleana che va a true
Quando premo lo switch su off,se la variabile e' su true,allora invia l'sms,altrimenti rimane cosi' com'e?E' giust come ragionamento?Eventualmente come potrei modificare il codice?
Ah poi per l'invio degli sms,ho eliminato la condizione che se il valore di ax o ay era maggiore di 1,per 5 loop,allora veniva inviato l'sms.Era anche per questo che non mi inviava l'sms.
Ecco il codice funzionante,ma LENTO!
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
#include <SPI.h>
#include "ADXL335.h"
#include <SoftwareSerial.h>
SoftwareSerial Sim900Serial(2, 3);
ADXL335 accelerometer;
RTC_DS1307 RTC;
File Dati; // La variabile di tipo file che useremo per il log
const int chipSelect =10;
int i=0;
float ax,ay,az;
const int buttonPin = 8; // the number of the pushbutton pin
const int ledPin = 13; // LED CHE INDICA CHE IL SENSORE DI PROSSIMITA' E' ATTIVO (VERDE)
const int ledSms= 5; // LED IMPATTO INVIO SMS (ROSSO)
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
void setup ()
{
Serial.begin(115200);
Sim900Serial.begin(115200); // the GPRS baud rate
delay(500);
Sim900Serial.println("AT+IPR=19200");
delay(500);
Sim900Serial.begin(19200); // the GPRS baud rate
delay(1000);
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
// Inizializzazione LED invio SMS
pinMode(ledSms, OUTPUT);
Wire.begin(); // inizializziamo la libreria WIRE per usare
RTC.begin(); //il Real Time clock basato su ds1307
accelerometer.begin();
if (! RTC.isrunning())
{
Serial.println("RTC NON STA FUNZIONANDO");
//LA SEGUENTE ISTRUZIONE SERVE SOLO PER REGOLARE L'OROLOGIO.ATTIVARE SOLO SE NECESSARIO.
// RTC.adjust (DateTime(__DATE__, __TIME__)); //imposta ora e data
}
Serial.print("\nSto verificando la presenza della scheda..\n");
pinMode(10, OUTPUT); // fa funzionare la sdlib
if (!SD.begin(chipSelect))
{
Serial.println("SD card non trovata");
return;
}
else
{
Serial.println("Scheda inserita e funzionante");
Serial.println();
}
}
void loop ()
{
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// Se il pulsante e' attivo (il pulsante simula l'attivazione di un sensore di prossimita'
if (buttonState == HIGH) {
// turn LED on: IL LED VIENE ATTIVATO QUANDO SI PREME IL PULSANTE
digitalWrite(ledPin, HIGH);
DateTime now = RTC.now(); // leggiamo l'ora
accelerometer.getAcceleration(&ax,&ay,&az);
// Stampa su seriale l'accelerazione di Gravita' del sensore ADXL 335
Serial.print(ax,2);
Serial.print("g");
Serial.print(",");
Serial.print(ay,2);
Serial.print("g");
Serial.print("\t");
// // Stampa su seriale ORA E DATA
Serial.print(now.day(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.year(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.print("\n");
Dati = SD.open("datalog.txt", FILE_WRITE); // apriamo il file in scrittura
if (Dati)
{
// SCRITTURA DEI DATI DEL SENSORE SU SD
Dati.print(ax,2);
Dati.print("g");
Dati.print(",");
Dati.print(ay,2);
Dati.print("g");
Dati.print("\t");
// SCRITTURA ORA E DATA SU SD
Dati.print(now.day(), DEC);
Dati.print('/');
Dati.print(now.month(), DEC);
Dati.print('/');
Dati.print(now.year(), DEC);
Dati.print(' ');
Dati.print(now.hour(), DEC);
Dati.print(':');
Dati.print(now.minute(), DEC);
Dati.print(':');
Dati.print(now.second(), DEC);
Dati.println();
Dati.close(); // chiudiamo e trasferiamo su SD
Serial.print("Dati rilevati \t");
}
else
{
Serial.println("Errore nell'apertura di datalog.txt");
}
// CONDIZIONE AX,AY >N
if ((ax >=1) || (ay >=1)) { //Se la collisione è forte
digitalWrite(ledSms, HIGH);
Serial.println ("Impatto avvenuto,sto inviando SMS");
// INVIA SMS
Sim900Serial.print("AT+CMGF=1\r"); //Sending the SMS in text mode
delay(100);
Sim900Serial.println("AT + CMGS = \"3392747536\"");//The target phone number
delay(100);
Sim900Serial.println("Arduino impatto");//the content of the message
delay(100);
Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26
delay(100);
Sim900Serial.println();
}
else {
// Spegni il LED VERDE :
digitalWrite(ledPin, LOW);
}
digitalWrite(ledPin, LOW);
}
delay (2000); // durata del loop
}