Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.02 KB | None | 0 0
  1. #include <Wire.h>
  2. #include <LSM303.h>
  3.  
  4. LSM303 compass;
  5. int running_min[3], running_max[3], last_a[3], curr_a[3];
  6.  
  7. // The previous 4 readings, used to find the current reading which is their average.
  8. // Use idx as an index.
  9. int sumX, sumY, sumZ, idx;
  10. int xSamples[4], ySamples[4], zSamples[4];
  11.  
  12. int samplingCounter, steps;
  13.  
  14. // Unused.
  15. //int badFlag;
  16.  
  17. int dynamicPrecision[3], dynamicThreshold[3];
  18.  
  19. void reInit(){
  20. samplingCounter = 0;
  21.  
  22. int p2pX = running_max[0] - running_min[0];
  23. int p2pY = running_max[1] - running_min[1];
  24. int p2pZ = running_max[2] - running_min[2];
  25.  
  26. //badFlag = 0;
  27.  
  28. dynamicPrecision[0] = p2pX / 10;
  29. dynamicPrecision[1] = p2pY / 10;
  30. dynamicPrecision[2] = p2pZ / 10;
  31. //Serial.print("Dynamic Precision : ");
  32. //Serial.println(dynamicPrecision);
  33.  
  34. int avgX = (running_max[0] + running_min[0]) / 2;
  35. int avgY = (running_max[1] + running_min[1]) / 2;
  36. int avgZ = (running_max[2] + running_min[2]) / 2;
  37.  
  38. dynamicThreshold[0] = avgX;
  39. dynamicThreshold[1] = avgY;
  40. dynamicThreshold[2] = avgZ;
  41.  
  42. running_min[0] = running_min[1] = running_min[2] = 32767;
  43. running_max[0] = running_max[1] = running_max[2] = -32768;
  44. }
  45.  
  46. bool check_valid_read() {
  47. return abs(sumX/4-cur_a[0]) >= dynamicPrecision[0] && abs(sumY/4-cur_a[1]) >= dynamicPrecision[1]
  48. && abs(sumZ/4-cur_a[2]) >= dynamicPrecision[2];
  49. }
  50.  
  51. bool read(){
  52. sumX -= xSamples[idx];
  53. sumY -= ySamples[idx];
  54. sumZ -= zSamples[idx];
  55.  
  56. compass.read();
  57.  
  58. xSamples[idx] = compass.a.x;
  59. ySamples[idx] = compass.a.y;
  60. zSamples[idx] = compass.a.z;
  61.  
  62. sumX += xSamples[idx];
  63. sumY += ySamples[idx];
  64. sumZ += zSamples[idx];
  65.  
  66. if(!check_valid_read())
  67. return false;
  68.  
  69.  
  70. idx = (idx + 1) % 4;
  71.  
  72. for(int i = 0; i < 3; ++i)
  73. last_a[i] = curr_a[i];
  74.  
  75. curr_a[0] = sumX / 4;
  76. curr_a[1] = sumY / 4;
  77. curr_a[2] = sumZ / 4;
  78.  
  79. for(int i = 0; i < 3; ++i){
  80. running_min[i] = min(running_min[i], curr_a[i]);
  81. running_max[i] = max(running_max[i], curr_a[i]);
  82. }
  83.  
  84. return true;
  85. /*
  86. curr_a[0] = compass.a.x;
  87. curr_a[1] = compass.a.y;
  88. curr_a[2] = compass.a.z;
  89. */
  90.  
  91. /*
  92. //Serial.println("readings");
  93. Serial.print(curr_a[0]);
  94. Serial.print(" ");
  95. Serial.print(curr_a[1]);
  96. Serial.print(" ");
  97. Serial.println(curr_a[2]);
  98. */
  99. }
  100.  
  101. bool checkStep(){
  102. if(!read() )
  103. return false;
  104.  
  105. for(int i = 0; i < 3; ++i){
  106. int d = abs(last_a[i] - curr_a[i]);
  107. if(d >= dynamicPrecision[i] && last_a[i] > dynamicThreshold[i] && curr_a[i] < dynamicThreshold[i]){
  108. ++steps;
  109. break;
  110. }
  111. }
  112. return true;
  113. }
  114.  
  115. void setup(){
  116. Serial.begin(9600);
  117. Wire.begin();
  118. compass.init();
  119. compass.enableDefault();
  120.  
  121. running_min[0] = running_min[1] = running_min[2] = 32767;
  122. running_max[0] = running_max[1] = running_max[2] = -32768;
  123.  
  124. for(int i = 0; i < 20; ++i) read();
  125. reInit();
  126. }
  127.  
  128. void loop(){
  129. if(samplingCounter == 20) reInit();
  130. samplingCounter += checkStep();
  131. //Serial.print("steps :");
  132. //Serial.println(steps);
  133. //delay(100);
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement