(4/4) BPM (Pulse Sensor) and Pedometer (ADXL345 Accelerometer) Wearable Device with OLED Display

Overview

Finally, We integrate all the three sensors into a one working mini-wearable project.

Hardware Used

  • Arduino Nano V3 (Robotdyn)

  • ADXL345 Accelerometer
  • 
    
  • 128×64 0.96″ OLED Display
  • 
    
  • Pulse/Heart Beat Sensor
  • 
    
  • Jumper Wires
  • 
    
  • Breadboard
  • 
    
    

    Software Used

    Libraries Used

    The libraries used will be the compilation of the previous libraries.

     

    Application Description

    To make this a mini-wearable project, we will switch from Uno R3 to a Nano. The components will work with 3.3V.

    Set-up the Hardware

    Code

     

    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #include <PulseSensorPlayground.h>
    //PulseSensor
    #define USE_ARDUINO_INTERRUPTS true    // Set-up low-level interrupts for most accurate BPM math.   
    
    //OLED Display
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);
    #if (SSD1306_LCDHEIGHT != 32)
    #error("Height incorrect, please fix Adafruit_SSD1306.h!");
    #endif
    
    //Accelerometer
    #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)
    
    #define offsetX   -10.5       // OFFSET values
    #define offsetY   -2.5
    #define offsetZ   -4.5
    
    #define gainX     257.5        // GAIN factors
    #define gainY     254.5
    #define gainZ     248.5
    
    //Pulse Sensor Variables
    PulseSensorPlayground pulseSensor;  // Creates an instance of the PulseSensorPlayground object called "pulseSensor"
    
    const int PulseWire = 0;       // PulseSensor Analog WIRE connected to ANALOG PIN 0
    int Threshold = 385;           // Determine which Signal to "count as a beat" and which to ignore.
                                   // Use the "Gettting Started Project" to fine-tune Threshold Value beyond default setting.
                                   // Otherwise leave the default "550" value. 
    //Accelerometer Variables
    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
    
    int x,y,z, stepsStepped;
    
    int xavg, yavg,zavg, steps=0, flag=0;
    int xval[15]={0}, yval[15]={0}, zval[15]={0};
    int threshhold = 60.0;
    
    
    void setup()   {                
      Serial.begin(9600);
      Wire.begin();
      
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
      pulseSensor.analogInput(PulseWire);   
      pulseSensor.setThreshold(Threshold);   
      // init done
      
      //Turning on the ADXL345
      writeTo(DEVICE, 0x2D, 0);      
      writeTo(DEVICE, 0x2D, 16);
      writeTo(DEVICE, 0x2D, 8);
    
      if (pulseSensor.begin()) {
        Serial.println("Pulse Sensor Initialized...");  //This prints one time at Arduino power-up,  or on Arduino reset.  
      }
      // Show image buffer on the display hardware.
      // Since the buffer is intialized with an Adafruit splashscreen
      // internally, this will display the splashscreen.
      display.display();
      delay(2000);
    
      // Clear the buffer.
      display.clearDisplay();
    
    }
    
    
    void loop() {
      int regAddress = 0x32; //First axis-acceleration-data register on the ADXL345
      readFrom(DEVICE, regAddress, TO_READ, buff); //read the acceleration data from the ADXL345
      
      int myBPM = pulseSensor.getBeatsPerMinute();  // Calls function on our pulseSensor object that returns BPM as an "int".
                                                   // "myBPM" hold this BPM value now.
    
      //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];
      
      stepsStepped = ArduinoPedometer();
     
      if (pulseSensor.sawStartOfBeat()) {          // Constantly test to see if "a beat happened". 
          display.setTextSize(1.2);
          display.setTextColor(WHITE);
          display.setCursor(0,0);
          display.println("Your BPM is: " + String(myBPM) );
          display.setCursor(0,10);
          display.println("You # Of steps are: " + String(stepsStepped));
          display.display(); 
          display.clearDisplay();
      } 
      delay(100);
      
    }
    
    //---------------- Functions
    //Writes val to address register on device
    void writeTo(int device, 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(int device, 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
    }
    
    
    //Get pedometer.
    
    int ArduinoPedometer(){
        int acc=0;
        int totvect[15]={0};
        int totave[15]={0};
        int xaccl[15]={0};
        int yaccl[15]={0};
        int zaccl[15]={0};
        for (int i=0;i<15;i++)
        {
          xaccl[i]= x;
          delay(1);
          yaccl[i]= y;
          delay(1);
          zaccl[i]= z;
          delay(1);
          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 ;
          delay(150);
      
          //cal steps 
          if (totave[i]>threshhold && flag==0)
          {
             steps=steps+1;
             flag=1;
          }
          else if (totave[i] > threshhold && flag==1)
          {
              //do nothing 
          }
          if (totave[i] <threshhold  && flag==1)
          {
            flag=0;
          }
         // Serial.print("steps=");
         // Serial.println(steps);
         return(steps);
        }
      delay(100); 
     }

     

    Conclusion

     

    Reference

    https://create.arduino.cc/projecthub?category=wearables-health-fitness&sort=updated

    The post (4/4) BPM (Pulse Sensor) and Pedometer (ADXL345 Accelerometer) Wearable Device with OLED Display appeared first on CreateLabz.

    Adxl345, Arduino, Arduino nano, Display, Fitness, Heart, Heart sensor, Knowledgebase, Oled, Pedometer, Pulse, Pulse sensor, Ssd1306, Wearable

    Leave a comment

    All comments are moderated before being published