Grazie a tutti per i preziosi consigli,ho usato il suggerimento di Iesto.Ho Inserito uno tasto switch al posto del sensore di prossimita',in quanto non ce l'ho ancora.Ad ogni modo,ho fatto cosi',quando il tasto e' premuto,il sensore di prossimita' va su ON e si attiva un LED.Inoltre ho anche inserito un led,che mi indica che si sta inviando l'sms. (ancora non ho implementato l'algoritmo,ma ho solo aggiunto un messaggio su seriale,che appunto si sta inviando l'sms). I miei dubbi sono:
Mettiamo che venga superata la soglia di impatto,allora verra' inviato un sms...bene,non vorrei che tutto il tempo che per esempio l'oggetto si trova fermo d'avanti al sensore,il sistema continui a mandare sms!!! .Forse sono io che non comprendo bene il funzionamento dell' accelerometro,cioe' una volta che avviene l'impatto,il valore captato da questo sensore dovrebbe resettarsi?Io vorrei che una volta avvenuto l'impatto ad un certa soglia,viene inviato l'sms (solo al momento dell'impatto) e non, se per esempio l'oggetto e' fermo davanti al sensore di prossimita'.Poi fatto questo,il sistema dovrebbe resettarsi.E cominciare daccapo cioe:
Capta un oggetto in avvicinamento tramite il sensore di prossimita'.
Comincia a registrare i dati su SD
Se l'oggetto si scontra col l'accelerometro ad un certa velocita' manda un sms (ma solo quando impatta)
Il sensore di prossimita' si resetta. Il sistema va in stan by,
Ecco lo sketch se puo' essere utile:
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
#include <SPI.h>
#include "ADXL335.h"
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 ()
{
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) {
// 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");
}
}
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);
}
delay (0); // cadenza della scrittura dei dati
}