// Cabling for i2c,
//using Sparkfun breakout with an Arduino Uno / Duemilanove:
// Arduino <-> Breakout board
// Gnd - GND
// 3.3v - VCC
// 3.3v - CS
// Analog 4 - SDA
// Analog 5 - SLC
// Cabling for i2c using Sparkfun breakout with an Arduino Mega / Mega ADK:
// Arduino <-> Breakout board
// Gnd - GND
// 3.3v - VCC
// 3.3v - CS
// 20 - SDA
// 21 - SLC
#include <Wire.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#define DEVICE (0x53) // Device address as specified in data sheet
TinyGPS gps;
SoftwareSerial ss(10, 11);
static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);
char inchar;
byte _buff[6];
char POWER_CTL = 0x2D; //Power Control Register
char DATA_FORMAT = 0x31;
char DATAX0 = 0x32; //X-Axis Data 0
char DATAX1 = 0x33; //X-Axis Data 1
char DATAY0 = 0x34; //Y-Axis Data 0
char DATAY1 = 0x35; //Y-Axis Data 1
char DATAZ0 = 0x36; //Z-Axis Data 0
char DATAZ1 = 0x37; //Z-Axis Data 1
int xmax = 0;
int ymax = 0;
int zmax = 0;
int xmax2 = 0;
int ymax2 = 0;
int zmax2 = 0;
const int xMin = 100; // (-1 G)
const int xMax = 596; // (+1 G)
const int yMin = 100; // (-1 G)
const int yMax = 597; // (+1 G)
const int zMin = 100; // (-1 G)
const int zMax = 612; // (+1 G)
int xVal = 0;
int yVal = 0;
int zVal = 0;
float flat, flon;
unsigned long age, date, time, chars = 0;
unsigned short sentences = 0, failed = 0;
static const double MALANG_LAT = 51.508131, MALANG_LON = -0.128002;
void setup()
{
pinMode(4, OUTPUT);
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output. Make sure you set your Serial Monitor to the same!
Serial.print("init");
//Put the ADXL345 into +/- 4G range by writing the value 0x01 to the DATA_FORMAT register.
writeTo(DATA_FORMAT, 0x01);
//Put the ADXL345 into Measurement Mode by writing 0x08 to the POWER_CTL register.
writeTo(POWER_CTL, 0x08);
digitalWrite(4, 1);
ss.begin(9600);
}
void loop()
{
readAccel(); // read the x/y/z tilt
}
void readAccel() {
xVal = analogRead(0);
yVal = analogRead(1);
zVal = analogRead(2);
long xScaled = map(xVal, xMin, xMax, -1000, 1000);
long yScaled = map(yVal, yMin, yMax, -1000, 1000);
long zScaled = map(zVal, zMin, zMax, -1000, 1000);
uint8_t howManyBytesToRead = 6;
readFrom( DATAX0, howManyBytesToRead, _buff); //read the acceleration data from the ADXL345
// each axis reading comes in 10 bit resolution, ie 2 bytes. Least Significat Byte first!!
// thus we are converting both bytes in to one int
int x = (((int)_buff[1]) << 8) | _buff[0];
int y = (((int)_buff[3]) << 8) | _buff[2];
int z = (((int)_buff[5]) << 8) | _buff[4];
if (x > xmax)
{
xmax = x;
}
if (y > ymax)
{
ymax = y;
}
if (z > zmax)
{
zmax = z;
}
if (xScaled > xmax2)
{
xmax2 = xScaled;
}
if (yScaled > ymax2)
{
ymax2 = yScaled;
}
if (zScaled > zmax2)
{
zmax2 = zScaled;
}
if ((xmax >= 150) && (ymax >= 150) && (zmax >= 150))
{
if ((xmax2 >= 150) && (ymax2 >= 150) && (zmax2 >= 150))
{
digitalWrite(4, 0);
gps.f_get_position(&flat, &flon, &age);
smartdelay(1000);
gps.f_get_position(&flat, &flon, &age);
smartdelay(1000);
Serial.println("AT");
delay(1000);
Serial.println("AT+CMGF=1");
delay(1000);
Serial.println("AT+CMGS=\"mobile phone"\r");
delay(1000);
Serial.print(flat, 6);
Serial.print(",");
Serial.println(flon, 6);
delay(1000);
Serial.println((char)26);
delay(1000);
Serial.println("AT+CMGS=\"mobile phone"\r");
delay(1000);
Serial.print(flat, 6);
Serial.print(",");
Serial.println(flon, 6);
delay(1000);
Serial.println((char)26);
delay(2000);
Serial.println("AT+CMGS=\"mobile phone\"\r");
delay(1000);
Serial.print(flat, 6);
Serial.print(",");
Serial.println(flon, 6);
delay(1000);
Serial.println((char)26);
delay(1000);
Serial.println("AT+CMGS=\"mobile phone"\r");
delay(1000);
Serial.print(flat, 6);
Serial.print(",");
Serial.println(flon, 6);
delay(1000);
Serial.println((char)26);
delay(3000);
Serial.println("AT+CMGS=\"mobile phone"\r");
delay(1000);
Serial.print(flat, 6);
Serial.print(",");
Serial.println(flon, 6);
delay(1000);
Serial.println((char)26);
delay(4000);
Serial.println("AT+CMGS=\"mobile phone"\r");
delay(1000);
Serial.print(flat, 6);
Serial.print(",");
Serial.println(flon, 6);
delay(1000);
Serial.println((char)26);
delay(5000);
Serial.println("AT+CMGS=\"mobile phone"\r");
delay(1000);
Serial.print(flat, 6);
Serial.print(",");
Serial.println(flon, 6);
delay(1000);
Serial.println((char)26);
delay(6000);
boolean in = false;
do
{
if (Serial.available() > 0)
{
inchar = Serial.read ();
Serial.print ((char)inchar);
if (inchar == 'e')
{
delay (10);
inchar = Serial.read();
Serial.print ((char)inchar);
if (inchar == 'c')
{
delay (10);
inchar = Serial.read();
Serial.print ((char)inchar);
if (inchar == '0')
{
in = true;
digitalWrite(4, 0);
delay (10);
digitalWrite(4, 1);
goto sini;
}
}
}
}
} while (in == false);
sini:
in = false;
xmax = 0;
ymax = 0;
zmax = 0;
digitalWrite(4, 1);
}
}
}
void writeTo(byte address, byte val)
{
Wire.beginTransmission(DEVICE); // start transmission to device
Wire.write(address); // send register address
Wire.write(val); // send value to write
Wire.endTransmission(); // end transmission
}
// Reads num bytes starting from address register on device in to _buff array
void readFrom(byte address, int num, byte _buff[])
{
Wire.beginTransmission(DEVICE); // start transmission to device
Wire.write(address); // sends address to read from
Wire.endTransmission(); // end transmission
Wire.beginTransmission(DEVICE); // start transmission to device
Wire.requestFrom(DEVICE, num); // request 6 bytes from device
int i = 0;
while (Wire.available()) // device may send less than requested (abnormal)
{
_buff[i] = Wire.read(); // receive a byte
i++;
}
Wire.endTransmission(); // end transmission
}
static void smartdelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (ss.available())
gps.encode(ss.read());
} while (millis() - start < ms);
}
static void print_float(float val, float invalid, int len, int prec)
{
if (val == invalid)
{
while (len-- > 1)
Serial.print('*');
Serial.print(' ');
}
else
{
Serial.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1); // . and -
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i = flen; i < len; ++i)
Serial.print(' ');
}
}
Comments