My hookup is like this:

GND - GND VCC - 5V CS - 5V SDO - GND SDA - A4 SCL - A5

Here is the code:

#include <Wire.h>
#include <ADXL345.h>

ADXL345 accelerometer;

void setup(void) 

  // Initialize ADXL345
  Serial.println("Initialize ADXL345");

  if (!accelerometer.begin())
    Serial.println("Could not find a valid ADXL345 sensor, check wiring!");
  if (accelerometer.begin())

  // Values for Free Fall detection
  accelerometer.setFreeFallThreshold(0.35); // Recommended 0.3 - 0.6 g
  accelerometer.setFreeFallDuration(0.1);  // Recommended 0.1 s

  // Select INT 1 for get activities

  // Check settings

void checkSetup()
  Serial.print("Free Fall Threshold = "); Serial.println(accelerometer.getFreeFallThreshold());
  Serial.print("Free Fall Duration = "); Serial.println(accelerometer.getFreeFallDuration());

void loop(void) 

  // Read values for activities
  Vector norm = accelerometer.readNormalize();

  // Read activities
  Activites activ = accelerometer.readActivites();

  if (activ.isFreeFall)
    Serial.println("Free Fall Detected!");

It comes from this Github link: https://github.com/jarzebski/Arduino-ADXL345/blob/master/ADXL345_free_fall/ADXL345_free_fall.ino

Initially, it would return "Could not find a valid ADXL345 sensor, check wiring!" in serial monitor. After messing with some wiring and changing to SPI and back to I2C, it only returns "Initialize ADXL345".

I've added the second if() statement because it wouldn't say anything other than "Initialize ADXL345" even with the first if() statement, or with the first if() followed by an else. It should print the Free Fall Threshold and Duration but it hasn't. I have to leave and won't be back until tomorrow, so when I get back I'll try removing the checkSetup() command and maybe put something else in it's place to verify it's working. I feel like the answer is staring me in the face.

EDIT: Okay so after I finally got up from my computer for once, a thought popped into my mind and I figured the reason why checkSetup() isn't returning either string is because it's declared after setup() calls checkSetup()? Am I right? I feel like this would be the case in other languages.

  • Provide a link to the specific module you have; are you sure that I2C pullups are built-in? What did you change in the wiring? You're calling begin() twice; if you want to test the return value, call it once and store the result in a variable which you can then test as often as you wish. Also try using a more popular library like Adafruit's. – SoreDakeNoKoto Jun 25 '16 at 15:47
  • Here is the link to the Sparkfun ADXL345 I have: sparkfun.com/products/9836 I've gone ahead and changed from 5v to 3.3v, have a small wire that just leads from VCC to CS, and have 2 220 ohm resistors going from 3.3v on my breadboard to SDA and SCL which have wires that go into pins A4 and A5 on my microcontroller, respectively. The microcontroller is a Sparkfun Redboard, which is the same as an Arduino Uno it seems. I've removed the second begin(), and now it will say "ADXL345 Initialize" followed by "Free fall Threshold = " but no value and that's it. – Grim Jun 25 '16 at 21:30

You may have damaged the chip with 5 V already. Sparkfun didn't include a regulator in their breakout. Your pull-ups are also too small; significant current flows when the I2C lines are pulled low. Use two 4.7k or 10k resistors instead. Assuming your Redboard is just like the Uno, connect pin 2 to the INT1 pin of the breakout, to make use of the interrupt capabilities. You also need to call attachInterrupt() and register a handler.

However, you bought this module from Sparkfun, as well as your Redboard. You should first follow their tutorial and library before trying any others. Theirs is SPI-based though. If you must use I2C, try out the Adafruit library.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.