this is program how build nRF51822 to get ADXL345 data

Dependencies:   BLE_API mbed nRF51822

Fork of ADXL345_I2C by Peter Swanson

Revision:
19:5b0da580c77e
Parent:
17:75e827cd0923
--- a/main.cpp	Mon Feb 19 09:11:16 2018 +0000
+++ b/main.cpp	Wed Apr 18 05:02:24 2018 +0000
@@ -3,6 +3,10 @@
 #include "ble/BLE.h"
 #include "ble/services/UARTService.h"
 #include "Serial.h"
+#include <math.h>
+#include <stdlib.h>
+#define MAX 20
+#define k 4
 
 #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console;
                                * it will have an impact on code-size and power consumption. */
@@ -53,62 +57,28 @@
 int xval[10]={0};
 int yval[10]={0};
 int zval[10]={0};
-int xavg;
-int yavg;
-int zavg;
 
-
-/*int calibratex()
-{
-   int readings[3] = {0, 0, 0};
-   led1=1;
-   int sum1  = 0;
-   for (int i=0; i<10; i++)
-   {
-       accelerometer.getOutput(readings);
-       xval[i]=(readings[0] - 345);  //nilai x adxl345
-       sum1 = xval[i]+sum1;
-   }
-   
-   xavg=sum1/10.0;
-
-   led1=0;     
-   return xavg;
-}
-int calibratey()
+using namespace std;
+enum category{STANDING,CLIMBING,WALKING};
+class data{
+    int x,y;
+    category cat;
+    public:
+    void setd(int a,int b,category c){
+        x=a;
+        y=b;
+        cat=c;
+    }
+    int getx(){return x;}
+    int gety(){return y;}
+    category getcat(){
+        return cat;
+    }
+};//end of class
+int dis(data d1,data d2)
 {
-   int readings[3] = {0, 0, 0};
-   led1=1;
-   long int sum2 = 0;
-   for (int i=0; i<10; i++)
-   {
-       accelerometer.getOutput(readings);
-        yval[i]=(readings[1] - 346); //nilai y adxl345
-       sum2 = yval[i]+sum2;
-   }
-   yavg=sum2/10.0;
-   led1=0;     
-   return yavg;
+    return sqrt(pow(((double)d2.getx()-(double)d1.getx()),2.0)+pow(((double)d2.gety()-(double)d1.gety()),2.0));
 }
-int calibratez()
-{
-   int readings[3] = {0, 0, 0};
-    
-   led1=1;
-   long int sum3 = 0;
-   for (int i=0; i<10; i++)
-   {
-       accelerometer.getOutput(readings);
-        zval[i]=(readings[2] - 416); //nilai z adxl345
-       sum3 = zval[i]+sum3;
-   }
-   
-   zavg=sum3/10.0;
-   led1=0;     
-   return zavg;
-}*/
-
-
 
  int main() 
  {
@@ -124,7 +94,7 @@
         int totave    [20] = {0};
         int totvel    [20] = {0};
         int totdist   [20] = {0};
-        int totheight [20] = {0};
+        
             
         
         //float sum1, sum2, sum3 = 0
@@ -140,14 +110,12 @@
        int16_t avg_1= 0;
        int16_t avg_2= 0;
        int16_t avg_3= 0;
+       snprintf(buffer, 20, "data: %d,%d,%d,%d,%d,%d\n",(int16_t)reading_1,(int16_t)reading_2,(int16_t)reading_3,(int16_t)avg_1,(int16_t)avg_2,(int16_t)avg_3);
        
-/*       int16_t lang     = 0;
-       int16_t perc     = 0;
-       int16_t kec      = 0;
-       int16_t jar      = 0;
-       int16_t ting     = 0;
-       snprintf(buffer, 20, "data: %d,%d,%d,%d,%d\n",(int16_t)lang,(int16_t)perc,(int16_t)kec,(int16_t)jar,(int16_t)ting);*/
-       snprintf(buffer, 20, "data: %d,%d,%d,%d,%d,%d\n",(int16_t)reading_1,(int16_t)reading_2,(int16_t)reading_3,(int16_t)avg_1,(int16_t)avg_2,(int16_t)avg_3);
+       int p,q; //input
+       int a[MAX]; //store distances
+       int b[k]; //to get min distances, used in calc
+       int c[k]; //to store freq
 
        
     led1 = 1;
@@ -191,47 +159,42 @@
     accelerometer.setDataRate(ADXL345_3200HZ);
 
     //Measurement mode.
-    accelerometer.setPowerControl(0x08);   
-     
-     /*int avg1 = calibratex();
-     int avg2 = calibratey();
-     int avg3 = calibratez();*/
-     
+    accelerometer.setPowerControl(0x08);
+    
+       
       
      while (1) 
      {
          ble.waitForEvent();
          wait(0.1);
          accelerometer.getOutput(readings);
-/*         uart1.printf("\n%i, %i, %i\n", (int16_t)readings[0], (int16_t)readings[1], (int16_t)readings[2]);
+         /*uart1.printf("\n%i, %i, %i\n", (int16_t)readings[0], (int16_t)readings[1], (int16_t)readings[2]);
          memset(&buffer, 0, sizeof(buffer));
          snprintf(buffer, 20, "data: %d,%d,%d\n\n", (int16_t)readings[0],(int16_t)readings[1],(int16_t)readings[0]);
          ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)buffer, sizeof(buffer), false);*/
          
-         uart1.printf("\n%i, %i, %i\n", (int16_t)avg1, (int16_t)avg2, (int16_t)avg3);
-         memset(&buffer, 0, sizeof(buffer));
-         snprintf(buffer, 20, "data: %d,%d,%d\n\n", (int16_t)avg1,(int16_t)avg2,(int16_t)avg3);
-         ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)buffer, sizeof(buffer), false);
-         wait(0.1);
-         
-         
          
          //float x,y,z
         for (int i=0; i<10; i++)
         {
-            xaccl[i]=(readings[0] - 345);
+            xaccl[i]=(readings[0]);
             wait(0.1);
-            yaccl[i]=(readings[1] - 346);
+            yaccl[i]=(readings[1]);
             wait(0.1);
-            zaccl[i]=(readings[2] - 416);
+            zaccl[i]=(readings[2]);
             wait(0.1);
             
+            
             //formula
-            //totvect[i] = sqrt((double)((xaccl[i]-xavg)* (xaccl[i]-xavg))+(double) ((yaccl[i] - yavg)*(yaccl[i] - yavg)) +(double) ((zaccl[i] - zavg)*(zaccl[i] - zavg)));
-            totvect[i] = sqrt((double)(xaccl[i]*xaccl[i])+(double)(yaccl[i]*yaccl[i])+(double)(zaccl[i]*zaccl[i]));
-            totave[i] = (totvect[i] + totvect[i-1]) / 2 ;
+            totvect[i] = sqrt(pow((double)xaccl[i],2.0)+pow((double)yaccl[i],2.0)+pow((double)zaccl[i],2.0));
+            wait(0.3);
+            totave[i] = ((double)totvect[i]+(double)totvect[i-1])/2.0 ;
+            wait(0.3);
             acc=acc+totave[i];
-         
+            wait(0.3);
+            totvel[i]=(1*((double)totave[i]-(double)totave[i-1]/2.0)+totvel[i-1]);
+            wait(0.3);
+            totdist[i]=(1*((double)totvel[i]-(double)totvel[i-1]/2.0)+totdist[i-1]);         
          
          
          //cal steps
@@ -248,35 +211,129 @@
              {flag=0;}
              uart1.printf("\nsteps:%i", (int16_t)steps);
              memset(&buffer, 0, sizeof(buffer));
-             snprintf(buffer, 20, "\nsteps:%d", (int16_t)steps);
+             snprintf(buffer, 20, "\n%d\t", (int16_t)steps);
              ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)buffer, sizeof(buffer), false);
              
             uart1.printf("\tacc:%i", (int16_t)totave[i]);
             memset(&buffer, 0, sizeof(buffer));
-            snprintf(buffer, 20, "\tacc:%d", (int16_t)totave[i]);
+            snprintf(buffer, 20, "\t%d", (int16_t)totave[i]);
             ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)buffer, sizeof(buffer), false);
         
-        
-/*            totvel[i]=(totave[i]*0.2);
             uart1.printf("\tvel:%i", (int16_t)totvel[i]);
             memset(&buffer, 0, sizeof(buffer));
-            snprintf(buffer, 20, "\tvel:%d", (int16_t)totvel[i]);
+            snprintf(buffer, 20, "\t%d", (int16_t)totvel[i]);
             ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)buffer, sizeof(buffer), false);
 
-            totdist[i]=(totvect[i]*(0.2*0.2)/2);
             uart1.printf("\tdist:%i", (int16_t)totdist[i]);
             memset(&buffer, 0, sizeof(buffer));
-            snprintf(buffer, 20, "\tdist:%d", (int16_t)totdist[i]);
+            snprintf(buffer, 20, "\t%d\n", (int16_t)totdist[i]);
             ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)buffer, sizeof(buffer), false);
   
-            totheight[i]=sqrt((double)(xaccl[i]*xaccl[i])+(double)(yaccl[i]*yaccl[i])) * ((0.2*0.2)/2);
-            uart1.printf("\thght:%i", (int16_t)totheight[i]);
-            memset(&buffer, 0, sizeof(buffer));
-            snprintf(buffer, 20, "\thght:%d", (int16_t)totheight[i]);
-            ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)buffer, sizeof(buffer), false);*/
       
         }
+       
+       do{
+        wait(0.1);
         
+        for(int i=0;i<k;i++)
+        { //initiLIZATION
+            b[i]=-1;
+            c[i]=0;
+        } 
+        int min=1000;
+        p = (readings[0]);
+        q = (readings[1]);
+        //uart1.scanf("%ld,%ld",&p,&q);
+        if((p < 0) | (q < 0))
+            exit(0);
+        data n; //data point to classify
+        n.setd(p,q,STANDING);
+        data d[MAX]; //training set
+        
+        d[0].setd(1,1,STANDING);
+        d[1].setd(1,2,STANDING);
+        d[2].setd(1,3,STANDING);
+        d[3].setd(1,4,STANDING);
+        d[4].setd(1,5,STANDING);
+        d[5].setd(1,6,STANDING);
+        d[6].setd(1,7,STANDING);
+        d[7].setd(2,1,STANDING);
+        d[8].setd(2,2,STANDING);
+        d[9].setd(2,3,WALKING);
+        d[10].setd(2,4,WALKING);
+        d[11].setd(2,5,WALKING);
+        d[12].setd(2,6,WALKING);
+        d[13].setd(2,7,WALKING);
+        d[14].setd(5,1,CLIMBING);
+        d[15].setd(5,2,CLIMBING);
+        d[16].setd(5,3,CLIMBING);
+        d[17].setd(5,4,CLIMBING);
+        d[18].setd(5,5,CLIMBING);
+        d[19].setd(5,6,CLIMBING);
+        for(int i=0;i<20;i++){
+            a[i]=dis(n,d[i]);
+            //uart1.printf("\t\t %d\n", a[i]);
+        }
+        //k-nearest neighbours calculation i.e smallest k distances
+        for(int j=0;j<k;j++)
+        {
+            min=1000;
+            for(int i=0;i<20;i++)
+            {
+                if(i!=b[0]&&i!=b[1]&&i!=b[2])
+                { 
+                    if((a[i]<=min))
+                    {
+                        min=a[i];
+                        b[j]=i;
+                    }
+                }
+            } 
+            
+            //uart1.printf("%d\n",min);
+        }
+        //counting frequency of a class in each neighbour   
+        for(int i=0;i<k;i++)
+        {
+            switch (d[b[i]].getcat())
+            { 
+            case STANDING:
+                c[0]++;
+                break;
+            case WALKING:
+                c[2]++;
+                break;
+            case CLIMBING:
+                c[1]++;
+                break;
+            }
+        } //counting max frequency
+        int max=-1,j;
+        for(int i=0;i<k;i++)
+        {    
+            if(c[i]>max){
+                max=c[i];
+                j=i;
+            }
+        }
+       
+            wait(0.1);
+            printf("Prediction is:");
+            switch (j)
+            {    
+            case 0:
+                uart1.printf("STANDING\n");
+                break;
+            case 1:
+                uart1.printf("CLIMBING\n");
+                break;
+            case 2:
+                uart1.printf("WALKING\n");
+                break;
+            }
+         
+        
+    }while(true); 
         
     }