this is program how build nRF51822 to get ADXL345 data
Dependencies: BLE_API mbed nRF51822
Fork of ADXL345_I2C by
Revision 19:5b0da580c77e, committed 2018-04-18
- Comitter:
- asyrofi
- Date:
- Wed Apr 18 05:02:24 2018 +0000
- Parent:
- 18:3e3143249113
- Commit message:
- masih salah tolong diperbaiki..
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
diff -r 3e3143249113 -r 5b0da580c77e main.cpp --- 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); }
diff -r 3e3143249113 -r 5b0da580c77e mbed.bld --- a/mbed.bld Mon Feb 19 09:11:16 2018 +0000 +++ b/mbed.bld Wed Apr 18 05:02:24 2018 +0000 @@ -1,1 +1,1 @@ -https://os.mbed.com/users/mbed_official/code/mbed/builds/7130f322cb7e \ No newline at end of file +http://mbed.org/users/mbed_official/code/mbed/builds/7130f322cb7e \ No newline at end of file