Measuring steps using the ADXL335 accelerometer
In this project I will tell you how to make a simple fitness tracker (step counter) using Arduino. In this project we will be using a simple ADXL335 accelerometer to count the number of times our hand accelerates and decelerates and count it as one step.
What does the ADXL335 do?
The ADXL335 is a triple axis accelerometer with extremely low noise and power consumption The and has a full sensing range of +/- 3g. It has a voltage consumption of between 1.8 and 3.6Volts DC.
The ADXL335 |
Materials required
- An Arduino uno
- An ADXL335 accelerometer
- A few male to femalejumper wires
Making the Arduino connections
The connections for this project are very easy.
- Connect the pin labelled VCC on the ADXL335 to the pin labelled A4 on the Arduino. You can also connect it to the in labelled 3.3V on the Arduino.
- Connect the GND on the ADXL335 to the pin labelled A0 on the Arduino. You can also connect it eo the GND of the Arduino
- Connect the X_OUT on the ADXL335 to the pin labelled A3 on the Arduino
- Connect the Y_OUT on the ADXL335 to the pin labelled A2 on the Arduino
- Connect the Z_OUT on the ADXL335 to the pin labelled A1 on the Arduino
Coding
The basic structure of our code is as follows
- On powering up the board, continuously read the data using the accelerometer
- Calculate the total acceleration vector with respect to starting point
- Acceleration vector = sqrt (x^2 + y^2 + z^2)
- Analyze the data for setting up a threshold using trial and error
- If acceleration vector crosses threshold , steps ++
- display number of steps
int xpin=A3; int ypin=A2; int zpin=A1; int powerpin=A4; int gnd=A0; float threshhold=80.0; float xval[100]={0}; float yval[100]={0}; float zval[100]={0}; float xavg; float yavg; float zavg; int steps = 0; int state=0; void setup() { Serial.begin(9600); pinMode(powerpin,OUTPUT); pinMode(gnd,OUTPUT); digitalWrite(powerpin,HIGH); digitalWrite(gnd,LOW); pinMode(13,OUTPUT); calibrate(); }void loop() { int acc=0; float totvect[100]={0}; float totave[100]={0}; float xaccl[100]={0}; float yaccl[100]={0}; float zaccl[100]={0}; for (int i=0;i<100;i++){ xaccl[i]=float(analogRead(xpin)); yaccl[i]=float(analogRead(ypin)); zaccl[i]=float(analogRead(zpin)); totvect[i] = sqrt(((xaccl[i]-xavg)* (xaccl[i]-xavg))+ ((yaccl[i] - yavg)*(yaccl[i] - yavg)) + ((zval[i] - zavg)*(zval[i] -zavg))); totave[i] = (totvect[i] + totvect[i-1]) / 2 ; Serial.println(totave[i]); delay(200); //calculating number of steps if (totave[i]>threshhold && state==0){ steps=steps+1; state=1; } if (totave[i] <threshhold && state==1) {state=0;} Serial.println('\n'); Serial.print("steps="); Serial.println(steps); }; delay(1000); } void calibrate(){ float sum=0; float sum1=0; float sum2=0; for (int i=0;i<100;i++){ xval[i]=float(analogRead(xpin)); sum=xval[i]+sum; } delay(100); xavg=sum/100.0; Serial.println(xavg); for (int j=0;j<100;j++){ xval[j]=float(analogRead(xpin)); sum1=xval[j]+sum1; } yavg=sum1/100.0; Serial.println(yavg); delay(100); for (int i=0;i<100;i++){ zval[i]=float(analogRead(zpin)); sum2=zval[i]+sum2; } zavg=sum2/100.0; delay(100); Serial.println(zavg); }
hi, i was testing the code of the pedometer and i ran into some problems.
ReplyDeleteIt turns out that the accelerometer is very sensitive and detects all movements, this is already known. The issue is that at times there is a lot of noise and I cannot distinguish in the graph between one step and another, can I explain? this sometimes causes extra steps to be added.
Hello this is a old page of mine and I no longer follow it but I can help you out if u still need help . Here is my discord id Sherr#3741. Sorry for the late reply
DeleteOh wait I used a wrong account
Delete