Fermare un ciclo for.

Salve devo realizzare un semplice data logger.Esso dopo essere stato "avviato" da un sensore di prossimita',provvederà ad acquisire dati da un accelerometro i quali verranno scritti su una SD. ll sistema dovra' scrivere SOLO un certo numero di dati,per esempio i primi 50. (non in modo ciclico per intenderci).Dopodiche', di questi 50 dati che verranno man mano ricavati dall' accelerometro,se supereranno un certo valore di soglia (es: ax o ay>3),il sistema invierà un sms che informerà che e' avvenuto un impatto (rilevato appunto dall' accelerometro) .
Vorrei che fosse eseguito il ciclo FOR solo una volta,ho visto che e' possibile farlo con il comando BREAK.Ma quando compilo ho un errore ,il compilatore mi informa che il comando break e' possibile utilizzarlo solo per comando di seleziona multipla "switch" Ho provato anche a dichiarare la variabile intera I del contatore,come globale e impostare il ciclo for come
for (i; i<50;i++) Ma niente,continua a scrivermi i dati in modo ciclico.Come potrei fare?Di seguito una sorta di pseudocodice che ho scritto,giusto per far capire meglio cosa voglio fare,magari non fosse chiaro nella precedente descrizione.Ho a disposizione:
ARDUINO UNO,GSM SHIELD con SD SLOT,Accelerometro, RTC DS1307.

Ecco una sorta di pseudocodice:

LOOP

If SENSORE DI PROSSIMITA' ON
{
FOR (i=1; i<50;i++)
{
acquisisci i valori AX e AY;
scrivi su sd i valori acquisiti;
if {
Se Ax,Ay >N
X=BOOLEAN TRUE
INVIA SMS
else
X=BOOLEAN FALSE
}
}
}

else non fare nulla

fine loop

Non ho capito bene che vuoi fare ...

Riassumendo quello che dici ...
... tu vorresti che la prima volta che il sensore di prossimità va a ON, fosse eseguito quel ciclo di FOR, ma solo una volta, se poi il sensore di prossimità va di nuovo ad ON, tu non vuoi fare nulla ... fino a quando non resetti Arduino ...

Giusto ???

Se non è giusto spiega meglio quello che vuoi fare perché è veramente poco chiaro ... :roll_eyes:

Guglielmo

Devi dichiarare la variabile i=1; come globale (e ovviamente levarla dalle parentesi del ciclo for).

Una volta eseguito, no entrerà più nel ciclo.

Ok ci riprovo! :slight_smile: Allora,vorrei che il sistema facesse questo:
Quando in sensore di prossimita' = OFF,in sistema resta in stand by e non fa nulla
Quando si avvicina un oggetto al sensore di prossimita',esso andra su ON quindi
l'oggetto andra' a sbattere contro il sistema in cui e' installato l'accelerometro,il quale registrera' su sd l'accelerazione,l'ora e la data dell'impatto (grazie ad un RTC).
Se l'impatto avvenuto supera una certa soglia,il sistema invia un sms.Altrimenti va di nuovo in stand bye.

Per capirci me non serve che il sistema sia sempre in loop a registrare dati anche quando in sensore di prossimita' e' su off.Ma solo registare i dati dell'impatto avvenuto.Non so se ora e' chiaro,in caso cerchero' di esserlo ancora di piu!:smiley:

non usare il for, ma conta il numero di cicli che il sesore è on, se il sensore diventa off ricomincia a contare da 0!

se invece è la 50 volta che sei in collisione e i dati accelelrometro sono alti invia l'SMS.

int i=0;

LOOP{

  If SENSORE DI PROSSIMITA' ON{
       i++; //aumenta i di 1
       acquisisci i valori AX e AY;
       scrivi su sd i valori acquisiti;
       Se Ax,Ay >N{ //se la collisione è forte
            if  i == 50 { //se la collisione forte dura da 50 loop
              INVIA SMS
              i=0; //azzero i, vuol dire che se la collisione dura altri 50 loop invia di nuovo il messaggio. Se NON vuoi che succeda, togli questa riga
            }//altrimenti no fare nulla, c'è una collisione, è forte, ma non abbiamo ancora raggiunto 50 loop consecuutivi, OPPURE li abbiamo supertati (se hai tolto la i=0 sopra)
       }else{
             i=0; //la collisione forte è finita o non c'èmai stata, assicurati di ricomincaiare a contare da 0
       }
  }else {
       i=0; //collisione finita o non presente, assicurati di ricominicare a contare da 0
  }

}fine loop

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
    
  }

dato che quì

if (i==5) {           //se la collisione forte dura da 50 loop
      digitalWrite(ledSms, HIGH);
      Serial.println ("Impatto avvenuto,sto inviando SMS");
      
      
      }

no stai azzerando i, e che NON invii controlli per i > 5, mandi l'SMS una sola volta..... o meglio, a meno che il loop non duri tanto che i supera il suo valore massimo e ricominci dall'arta prte fino a ritornare a 5... ovvero ogni 65536 loop

Rieccomi,dunque ho aggiunto il codice riguardo la gestione degli sms della GSM SHIELD,come ho scritto in un altro post, ho preferito utilizzare i comandi AT piuttosto che la libreria completa GSM.h,la quale mi occupava un sacco di risorse inutilimente.
Ebbene,ho un problema. Lo sketch di esempio funziona bene,ma ho provato ad inserirlo nel mio progetto e non mi invia gli sms.
Lo sketch di esempio e' questo:

/*Note:This code is used for Arduino 1.0 or later*/
#include <SoftwareSerial.h>
SoftwareSerial Sim900Serial(2, 3);
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(9600);               // the Hardware serial rate 
 Serial.println("Please type 's' to send  SMS"); 
}
void loop()
{   
   if (Serial.available())
    switch(Serial.read())
   {
     case 's':
       SendTextMessage();
       break;
    } 
   if (Sim900Serial.available())
    Serial.write(Sim900Serial.read());
}
void SendTextMessage()
{
  Sim900Serial.print("AT+CMGF=1\r");    //Sending the SMS in text mode
  delay(100);
  Sim900Serial.println("AT + CMGS = \"***********\"");//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();

Mentre il mio codice e' questo:

#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) {
    // 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");
       SendTextMessage();
      
      }
    }  
      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
    
  }
  
 void SendTextMessage()
{
  Sim900Serial.print("AT+CMGF=1\r");    //Sending the SMS in text mode
  delay(100);
  Sim900Serial.println("AT + CMGS = \"123456789\"");//Qui inserisco il mio numero di cellulare
  delay(100);
  Sim900Serial.println("Impatto avvenuto");//Contenuto del messaggio
  delay(100);
  Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26
  delay(100);
  Sim900Serial.println();
}

Il problema credo sia dovuto a questo pezzo di codice preso da quello originale che non ho inserito,in effetti nel mio caso non dovrei premere nessun tasto per poter inviare il messaggio,quindi ho ritenuto opportuno eliminarlo

if (Serial.available())
    switch(Serial.read())
   {
     case 's':
       SendTextMessage();
       break;
    } 
   if (Sim900Serial.available())

Cosa sbaglio?

direi nulla... ma il primo codice manca un pezzo.

se aggungi

if (Sim900Serial.available())
    Serial.write(Sim900Serial.read());

nel tuo loop() ricevi i messaggi di risposta dal chip, il che sarebbe interessante da anlizzare, magari ti dice perchè non sta andando

Dunque,errori veri e propri non me li da aggiungendo quella riga:
Ma ho notato che:
Sotto all messaggio "Impatto avvenuto,sto inviando SMS",mi appare un carattere casuale,ma solo uno,tipo un quadrato,una C una b ecc..
Poi,quando rilascio i pulsante che dovrebbe simulare il comportamento di un sensore di prossimita',il sensore si blocca,cio' non accade se elimino la suddetta riga.Potrebbe essere un conflitto Seriale/ SPI?Se si come lo risolvo?

a me sembra più un caso di RAM esaurita.. cercasul playground, ci sono delle librerie per controllare lo statoi dello della RAM a runtime.

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();
  
}

ahhh apsetta, quante cose stai usando sulla SPI? devi fare attenzione.

Ogni slave sul canale SPI ha un pin "CS", tu devi mettere a HIGH SOLO UNO slave alla volta, altrimenti hai casini assicurati, perchè i due sensori si intralcaino a vicenda.

Col codice che hai ora, anche senza RTC NON dovrebbe mandare sms all'infinito...

e fai stobenedetto check della ram, maagri sei al limite e togliere l'RTC ti ha fatto rientrare

Ciao ho spostato qui la discussione,se vedi ho anche fatto il test della memoria Problema invio sms con GSM SHIELD - Software - Arduino Forum