Dunque ho provato ad escludere l'RTC e a quanto pare blocchi non ce ne sono.(sto andando per esclusione),poi ho inserito la chiamata di funzione dell'invio del sms .nell'else finale per provare se c'era qualche variazione.Il sistema in questo caso mi invia gli SMS,ma ovviamente continua a mandarmi sms in modo infinito,fino a che non stacco l'alimentazione. Avevo pensato magari ad un conflitto tra l'spi della scheda SD e la scheda GSM (lo slot sd si trova on board sulla gsm e quindi condividono lo stesso canale). Infatti dopo l'else,il bus SPI non dovrebbe piu' essere occupato dalla scrittura dei dati della sd. Ho anche implementato una variabile di tipo boolean,che magari e' true quando c'e' l'impatto.Dopo che lo switch su off,ho fatto in modo che se Boolean =TRUE allora invia il messaggio.Subito dopo la variabile Boolean va su false ma non va.Come potrei fare?Sto impazzendo!!
#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 = 7; // 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
unsigned long time; // serve per misurare il tempo di esecuzione
void setup ()
{
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);
Serial.begin(115200);
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
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);
if (buttonState == HIGH) {
Serial.print("freeMemory()=");
Serial.println(freeMemory());
// turn LED on: IL LED VIENE ATTIVATO QUANDO SI PREME IL PULSANTE
digitalWrite(ledPin, HIGH);
i++;
// MISURO IL TEMPO DI ESECUZIONE
Serial.print("Time: ");
time = millis();
//prints time since program started
Serial.println(time);
// DateTime now = RTC.now(); // leggiamo l'ora
accelerometer.getAcceleration(&ax,&ay,&az);
Serial.print(ax,2);
Serial.print("g");
Serial.print(",");
Serial.print(ay,2);
Serial.print("g");
Serial.print("\t");
/*
// 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
Dati.print(ax,2);
Dati.print("g");
Dati.print(",");
Dati.print(ay,2);
Dati.print("g");
Dati.print("\t");
/*
// SCRITTURA ORA E DATA
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");
}
Serial.println(time);
// CONDIZIONE AX,AY >N
if (ax>=1 || ay>=1) { //se la collisione è forte
if (i==5) { //se la collisione forte dura da 50 loop
digitalWrite(ledSms, HIGH);
Serial.println ("Impatto avvenuto,sto inviando SMS");
impact=true;
// if (Sim900Serial.available())
Serial.write(Sim900Serial.read());
}
}
else { //altrimenti no fare nulla, c'è una collisione, è forte, ma non abbiamo ancora raggiunto 50 loop consecuutivi, OPPURE li abbiamo supertati
digitalWrite(ledSms, LOW);
i=0; //La collisione forte è finita o non c'è mai stata, assicurati di ricominciare a contare da 0
}
}
// Parentesi del IF PRINCIPALE
else {
// turn LED off:
i=0;//collisione finita o non presente, assicurati di ricominicare a contare da 0
// turn LED off:
digitalWrite(ledPin, LOW);
SendTextMessage();
}
delay (0); // cadenza della scrittura dei dati
}
void SendTextMessage()
{
Sim900Serial.print("AT+CMGF=1\r"); //Sending the SMS in text mode
delay(100);
Sim900Serial.println("AT + CMGS = \"12345666\"");//The target phone number
delay(100);
Sim900Serial.println("impatto avvenuto);//the content of the message
delay(100);
Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26
delay(100);
Sim900Serial.println();
}