Go Down

Topic: Triple Axis Accelerometer Breakout - ADXL345 (Read 2924 times) previous topic - next topic

fraser_s

I have managed to get the arduino to recognise the accelerometer but I cant work out the if/else code so that it recognises different movements.

any help would be awesome!!

AWOL

You'll need to post your code for us to see the if/else you're referring to.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

fraser_s

#include <Wire.h>

#define DEVICE (0x53)    //ADXL345 device address
#define TO_READ (6)        //num of bytes we are going to read each time (two bytes for each axis)

byte buff[TO_READ] ;    //6 bytes buffer for saving data read from the device
char str[512];                      //string buffer to transform data before sending it to the serial port

void setup()
{
 Wire.begin();        // join i2c bus (address optional for master)
 Serial.begin(9600);  // start serial for output
 
 //Turning on the ADXL345
 writeTo(DEVICE, 0x2D, 0);      
 writeTo(DEVICE, 0x2D, 16);
 writeTo(DEVICE, 0x2D, 8);
}

void loop()
{
 int regAddress = 0x32;    //first axis-acceleration-data register on the ADXL345
 int x, y, z;
 
 readFrom(DEVICE, regAddress, TO_READ, 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
 x = (((int)buff[1]) << 8) | buff[0];  
 y = (((int)buff[3])<< 8) | buff[2];
 z = (((int)buff[5]) << 8) | buff[4];
 
 //we send the x y z values as a string to the serial port
 sprintf(str, "%d %d %d", x, y, z);  
 Serial.print(str);
 Serial.print(10, BYTE);
 
 //It appears that delay is needed in order not to clog the port
 delay(1000);
}

//---------------- Functions
//Writes val to address register on device
void writeTo(int device, byte address, byte val) {
  Wire.beginTransmission(device); //start transmission to device
  Wire.send(address);        // send register address
  Wire.send(val);        // send value to write
  Wire.endTransmission(); //end transmission
}

//reads num bytes starting from address register on device in to buff array
void readFrom(int device, byte address, int num, byte buff[]) {
 Wire.beginTransmission(device); //start transmission to device
 Wire.send(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 = Wire.receive(); // receive a byte
   i++;
 }
 Wire.endTransmission(); //end transmission
}

if (

fraser_s

thats the code i have so far, all i want to the arduino to do is recognise when the accelerometer has been picked up, then put down again, by displaying a simple message in the serial monitor.

AWOL

Picking up would imply some movement in the Z axis, so that's the one I'd monitor.
You'd need to detect some acceleration over a threshold for more than, say, 100ms.

Please use the # icon in the editor when posting code.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy