Advertisement
Guest User

Untitled

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