Salve allora vi spiego in breve il progetto:
Devo realizzare una sorta di scatola nera per automodelli. Il sistema deve "registare" su sd l'accelerazione con cui un automodello va a sbattere contro una certa barriera e l'ora e la data dell'impatto.Se l'impatto e' forte,inviare un sms.
Il sistema e' composto da :
ARDUINO UNO
Accelerometro ADXL 335 ANALOGICO (connesso ai pin X=A0,Y=A1, Z(non connesso perche' non mi serve),3.3V,GND )
RTC DS 1307 (I2c) Connesso ai pin (SCL A5, SDA A4,5V,GND)
GSM SHIELD CON SD CARD SLOT (BUS SPI CONDIVISO CON GSM E SD)
,questa per l'esattezza:
http://wiki.epalsite.com/index.php?title=SIM900_Quad-Band_GPRS_shield_with_Micro_SD_card_slot
In futuro dovrei aggiungere un sensore di prossimita',ma per ora lo sto "simulando" con un semplice switch.
FUNZIONAMENTO DETTAGLIATO
Il sistema e' posizionato nei pressi di una barriera,in un certo punto della pista.Se il sensore di prossimita' e' off (nel mio caso quando lo switch non e' premuto) il sistema e' in stand by.
Se l'automodello si trova ad una certa distanza dal sensore di prossimita',esso andra' su ON (tasto switch premuto) :comincia a registare i dati su sd (accelerazione di gravita',ora e data corrente) .Se andra' anche a sbattere contro la barriera e se l'accelerazione rilevata e' di una certa entita',il sistema deve anche inviare un sms,altrimenti,torna in stanby e ricomincia il LOOP.
Ho realizzato il seguente sketch:
Ma il sistema non mi invia l'sms quando i valori dell'accelerometro raggiungono o superano i valori impostati:
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
#include <SPI.h>
#include "ADXL335.h"
#include <SoftwareSerial.h>
#include <MemoryFree.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 ()
{
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 ()
{
Serial.print("freeMemory()="); // Controllo per la quantita' di memoria disponibile ad ogni ciclo di LOOP
Serial.println(freeMemory());
// 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) {
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);
// 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");
}
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 5 loop
digitalWrite(ledSms, HIGH);
Serial.println ("Impatto avvenuto,sto inviando SMS");
// INVIA SMS
SendTextMessage();
}
}
else
{ //altrimenti no fare nulla, c'è una collisione ed è forte,
//ma non abbiamo ancora raggiunto 50 loop consecuutivi, OPPURE li abbiamo superati
// Spegni led INVIO SMS
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 {
i=0;//collisione finita o non presente, assicurati di ricominicare a contare da 0
// Spegni il LED VERDE :
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\"");//Mio numero di telefono
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();
}
Ho provato ad inserire la chiamata SendTextMessage,quando lo switch e' su off,e in effetti i messaggi vengono inviati (a ripetizione)
else { //altrimenti no fare nulla, c'è una collisione, è forte, ma non abbiamo ancora raggiunto 5 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
}
Inoltre ho provato anche eseguire lo sketch escludendo:
la scrittura su SD,e l'RTC.
In caso che aggiungo l'RTC il sistema dopo un po che ho premuto il tasto SWITCH si blocca,non succede invece se escludo l'RTC dallo sketch.
Inoltre ho anche inserito la procedura per verificare la quantita' di memoria disponibile:
RTC E SD DISATTIVATI = 1367 byte FREE
SD ATTIVA, RTC DISATTIVA = 521 byte Free
SD ATTIVA e RTC ATTIVA 474 byte free (BLOCCO DEL SISTEMA SE LO SWITCH E' TENUTO PREMUTO PER UN PO DI TEMPO)
Cosa sbaglio?Grazie mille a tutti in anticipo.