diff --git a/StepCounter.hpp b/StepCounter.hpp new file mode 100644 index 0000000000000000000000000000000000000000..197c0cdb5058a24884171f494124c8a715dcf578 --- /dev/null +++ b/StepCounter.hpp @@ -0,0 +1,23 @@ +#ifndef STEPCOUNTER_HPP +#define STEPCOUNTER_HPP + +#define ADXL375_DEBUG_PRINT /* If defined it will send ADXL375 x data trough UART */ +//#define ADXL375_BOOL_OUTPUT /* Used if a boolean change is needed in stead of interger + +#define _robADXL375_setup setup +#define _robADXL375_reading loop + + +#include <Wire.h> // Wire library - used for I2C communication +#include <Arduino.h> + +#define ADXL375 0x53 // The ADXL375 sensor I2C address + + +void _robADXL375_step(); + +void _robADXL375_setup(); + +void _robADXL375_reading(); + +#endif \ No newline at end of file diff --git a/stepCounter.cpp b/stepCounter.cpp index c2997b3e407f7e9fd5f36328eb193e9c8c733b34..87c131c3283bb5dad6e90d8a0f6ea9d169c3cc09 100644 --- a/stepCounter.cpp +++ b/stepCounter.cpp @@ -1,82 +1,90 @@ -#include <Arduino.h> -#include<Wire.h> -#include <math.h> +// +// Base I2C code for interaction taken from +// https://howtomechatronics.com/tutorials/arduino/how-to-track-orientation-with-arduino-and-adxl345-accelerometer/ +// +// And then adapted to work with ADXL375 +// +// +// Step counter sends an interger number of steps. +// +// This can be changed to a boolean by defining ADXL375_BOOL_OUTPUT in header. However not sure what is preferred. +// +// In order to full embed comment out #define _robADXL375_setup setup +// #define _robADXL375_reading loop Rob xx +// +#include "StepCounter.hpp" -const int MPU_addr=0x68; // I2C address of the MPU-6050 +int16_t xRaw; // Outputs +int16_t xRawMin=100; +int16_t xRawMax=0; -int16_t AcX,AcY,AcZ; // These are the variables for reading the raw accelerometer value from the device. -double rRaw,previousR,previousPreviousR; // The resultant sqrt((x^2)+(y^2)+(z^2)) and the previous ones. -double total; // The total weighted as a low pass filter. Half current and quarter previous two. +int steps=0; // Counts number of punches . Not needed in final. +#ifdef ADXL375_BOOL_OUTPUT +bool step =false; +#endif -double maxTotal,minTotal; // The max and minimun in the current session. -int steps = 0; // Number of steps. -bool below; // Boolean to determine if the value has gone 10000 less than the maximum in that period. -unsigned long lastTimeRead =0; // Used to determine how long until next reading +bool below=false; // Determines if a full pulse has occurred +bool above =false; - - -void step(){ // I imagine this part will be where the bluetooth implemention is? +void _robADXL375_step(){ // I imagine this part will be where the bluetooth implemention is? steps++; + #ifdef ADXL375_BOOL_OUTPUT + step =true; + #endif + } -void setup(){ - Wire.begin(); - Wire.beginTransmission(MPU_addr); - Wire.write(0x6B); // PWR_MGMT_1 register - Wire.write(0); // set to zero (wakes up the MPU-6050) - Wire.endTransmission(true); - Serial.begin(9600); - previousR=14088.24; // To make sure the starting values arnt offset. - previousPreviousR=14088.24; // These are the common values. - below=true; - maxTotal=2000; // Will obviously be overwritten in first instance. - minTotal=50000; +void _robADXL375_setup() { + Serial.begin(115200); // Initiate serial communication for printing the results on the Serial monitor + Wire.begin(); // Initiate the Wire library + // Set ADXL375 in measuring mode + Wire.beginTransmission(ADXL375); // Start communicating with the device + Wire.write(0x2D); // Access/ talk to POWER_CTL Register - 0x2D + // Enable measurement + Wire.write(8); // (8dec -> 0000 1000 binary) Bit D3 High for measuring enable + Wire.endTransmission(); + delay(10); } -void loop(){ - - unsigned long now = millis(); // Checks current time - - if ((now-lastTimeRead)>5) // Checks to see if enough time has elapsed (will reduce with ne sensor) - { - Wire.beginTransmission(MPU_addr); // Reads accelerometer - Wire.write(0x3B); // - Wire.endTransmission(false); - Wire.requestFrom(MPU_addr,14,true); // - AcX=Wire.read()<<8|Wire.read(); // - AcY=Wire.read()<<8|Wire.read(); // - AcZ=Wire.read()<<8|Wire.read(); // - - rRaw=sqrt(pow(AcX,2)+pow(AcY,2)+pow(AcZ,2)); // The resultant of each axis - total= 0.5*rRaw+0.25*previousR+0.25*previousPreviousR; // The curved amount - - if ((below)&&(total-minTotal>=10000)&&(total>=30000)){ // Make sure above a certain value and has increased by a certain amount. - step(); // These will be altered. - below=false; - minTotal=total; // Resets minmum. - } +void _robADXL375_reading() { + // === Read acceleromter data === // + Wire.beginTransmission(ADXL375); + Wire.write(0x32); // Start with register 0x32 (ACCEL_XOUT_H) + Wire.endTransmission(false); + Wire.requestFrom(ADXL375, 2, true); // Read 2 registers xRaw, + xRaw = ( Wire.read()| Wire.read() << 8); // X-axis value + + xRawMin=min(xRawMin,xRaw); // Overrides min/max + xRawMax=max(xRawMax,xRaw); + + if ((below)&&(xRaw>=70)&&(xRaw-xRawMin>=30)){ // Make sure above a certain value and has increased by a certain amount. + above=true; + below=false; + xRawMin=xRaw; + } - minTotal=min(minTotal,total); // Overrides min/max - maxTotal=max(maxTotal,total); - - if (maxTotal-total>=10000){ // Checks has dropped by 10000 - maxTotal=total; - below=true; - } - - lastTimeRead=now; // Resets to current amounts - previousPreviousR=previousR; - previousR=rRaw; - - Serial.print("\n"); // Just prints steps, obviously remove. - Serial.print(steps);Serial.print(","); - } - - delay(5); - + if (xRawMax-xRaw>=30&&above){ // Ensures value has gone back below limit + _robADXL375_step(); + below=true; + above=false; + xRawMax=xRaw; + } + if (xRawMax-xRaw>=30){ // Ensures value is below a limit. + below=true; + xRawMax=xRaw; + #ifdef ADXL375_BOOL_OUTPUT + step =false; + #endif + } + + #ifdef ADXL375_DEBUG_PRINT + Serial.print(xRaw);Serial.print(","); // Debug printing + Serial.println(steps); + #endif + delay(10); } \ No newline at end of file