Advertisement
Guest User

Untitled

a guest
Dec 15th, 2018
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.96 KB | None | 0 0
  1. #include <Wire.h> // Must include Wire library for I2C
  2. #include <SparkFun_MMA8452Q.h> // Includes the SFE_MMA8452Q library
  3. #include <SPI.h>
  4. #include <LoRa.h>
  5.  
  6. MMA8452Q accel;
  7.  
  8. float prevAX,prevAY,prevAZ;
  9. float dervAX,dervAY,dervAZ;
  10. float dervAXAVG,dervAYAVG,dervAZAVG;
  11. unsigned long timeHolder;
  12. float delta;
  13.  
  14. #define BPM_SENSOR_PORT A3
  15. #define BPM_LED_PORT 8
  16.  
  17. #define BPM_SAMPLEPERIOD 10
  18. #define BPM_HIGHTHRESH 250
  19. #define NUM_AVG 10
  20. #define BPM_DEBOUNCE 600 //limits the max bpm to 150, got a heart issue?
  21.  
  22. #define TRANSMIT_PERIOD 50
  23.  
  24. #define JERK_THRESH 50 //jerk greater than this will trigger a jesture in that axis
  25. #define JERK_DEBOUNCE 200 //time in msec allowed between single axis repeated jestures
  26. #define JERK_AVG 10
  27. #define JERK_SAMPLE_PERIOD 10
  28.  
  29. #define X_POS_MASK 1
  30. #define X_NEG_MASK 2
  31. #define Y_POS_MASK 4
  32. #define Y_NEG_MASK 8
  33. #define Z_POS_MASK 16
  34. #define Z_NEG_MASK 32
  35.  
  36.  
  37. unsigned long loopTimer, sampleLoop;
  38.  
  39. uint16_t bpmMinVal = 1024,bpmMaxVal = 0;
  40. uint8_t accMask;
  41.  
  42. uint16_t prevBPMValue;
  43. uint16_t currentBPMValue;
  44.  
  45. unsigned long bpmPeriod,bpmTime,bpmDebounceTimer;
  46. int16_t bpm;
  47. uint8_t bpmAvg = 70;
  48. bool seen = false;
  49.  
  50. unsigned long xTimer,yTimer,zTimer,jerkTimer;
  51.  
  52. void setup()
  53. {
  54. Serial.begin(115200);
  55. pinMode(BPM_SENSOR_PORT,INPUT);
  56. accel.init();
  57. if (!LoRa.begin(433E6)) {
  58. Serial.println("Starting LoRa failed!");
  59. while (1);
  60. }
  61. pinMode(BPM_LED_PORT,OUTPUT);
  62.  
  63. /**
  64. * BPM ANALOG DISCORVERY PERIOD
  65. */
  66. /*while(millis() - loopTimer < 5000 || bpmMaxVal - bpmMinVal < 300){
  67. uint16_t currentReading = analogRead(BPM_SENSOR_PORT);
  68. if(currentReading > bpmMaxVal){
  69. bpmMaxVal = currentReading;
  70. }else if(currentReading < bpmMinVal){
  71. bpmMinVal = currentReading;
  72. }
  73.  
  74. if(millis() - sampleLoop > 100){
  75. sampleLoop = millis();
  76. digitalWrite(BPM_LED_PORT,!digitalRead(BPM_LED_PORT));
  77. }
  78. }*/
  79. bpmMaxVal = 900;
  80. Serial.printf("max: %d min: %d\n",bpmMaxVal,bpmMinVal);
  81. digitalWrite(BPM_LED_PORT,LOW);
  82. }
  83.  
  84. void loop()
  85. {
  86. if (accel.available())
  87. {
  88. accel.read();
  89. delta = (millis() - timeHolder)*1.0;
  90. timeHolder = millis();
  91. dervAX = (accel.cx - prevAX)/delta*1000;
  92. dervAY = (accel.cy - prevAY)/delta*1000;
  93. dervAZ = (accel.cz - prevAZ)/delta*1000;
  94. prevAX = accel.cx;
  95. prevAY = accel.cy;
  96. prevAZ = accel.cz;
  97. dervAXAVG = ((dervAXAVG*(JERK_AVG-1))+dervAX)/JERK_AVG;
  98. dervAYAVG = ((dervAYAVG*(JERK_AVG-1))+dervAY)/JERK_AVG;
  99. dervAZAVG = ((dervAZAVG*(JERK_AVG-1))+dervAZ)/JERK_AVG;
  100. }
  101.  
  102. if(millis() - loopTimer > TRANSMIT_PERIOD){
  103. loopTimer = millis();
  104. sendDataSmall();
  105. }
  106.  
  107. if(millis() - sampleLoop > BPM_SAMPLEPERIOD){
  108. sampleLoop = millis();
  109.  
  110. currentBPMValue = analogRead(BPM_SENSOR_PORT);
  111.  
  112.  
  113. if(millis() - jerkTimer > JERK_SAMPLE_PERIOD){
  114. jerkTimer = millis();
  115. if(millis() - xTimer > JERK_DEBOUNCE){
  116. accMask &= ~(X_POS_MASK | X_NEG_MASK);
  117. if(dervAXAVG > JERK_THRESH){
  118. xTimer = millis();
  119. accMask |= X_POS_MASK;
  120. }else if(dervAXAVG < -JERK_THRESH){
  121. xTimer = millis();
  122. accMask |= X_NEG_MASK;
  123. }
  124. }
  125.  
  126. if(millis() - yTimer > JERK_DEBOUNCE){
  127. accMask &= ~(Y_POS_MASK | Y_NEG_MASK);
  128. if(dervAYAVG > JERK_THRESH){
  129. yTimer = millis();
  130. accMask |= Y_POS_MASK;
  131. }else if(dervAYAVG < -JERK_THRESH){
  132. yTimer = millis();
  133. accMask |= Y_NEG_MASK;
  134. }
  135. }
  136.  
  137. if(millis() - zTimer > JERK_DEBOUNCE){
  138. accMask &= ~(Z_POS_MASK | Z_NEG_MASK);
  139. if(dervAZAVG > JERK_THRESH){
  140. zTimer = millis();
  141. accMask |= Z_POS_MASK;
  142. }else if(dervAZAVG < -JERK_THRESH){
  143. zTimer = millis();
  144. accMask |= Z_NEG_MASK;
  145. }
  146. }
  147. }
  148.  
  149.  
  150. if(currentBPMValue > (bpmMaxVal - BPM_HIGHTHRESH) && !seen && millis() - bpmDebounceTimer > BPM_DEBOUNCE){
  151. bpmDebounceTimer = millis();
  152. bpmPeriod = millis() - bpmTime;
  153. seen = true;
  154. bpmTime = millis();
  155. bpm = 1.0/(bpmPeriod/1000.0)*60.0;
  156. bpmAvg = ((bpmAvg*(NUM_AVG-1))+bpm)/NUM_AVG;
  157. Serial.println(bpmAvg);
  158. digitalWrite(BPM_LED_PORT,HIGH);
  159. }else if(currentBPMValue < (bpmMaxVal - 2*BPM_HIGHTHRESH)){
  160. seen = false;
  161. digitalWrite(BPM_LED_PORT,LOW);
  162. }
  163. }
  164. }
  165.  
  166.  
  167. void sendData(){
  168. int16_t x = (int16_t)dervAX;
  169. int16_t y = (int16_t)dervAY;
  170. int16_t z = (int16_t)dervAZ;
  171. Serial.printf("%d\n",(int)bpmAvg);
  172. LoRa.beginPacket();
  173. LoRa.write(0xFA);
  174. LoRa.write(x&0xFF);
  175. LoRa.write(0xFF&(x>>8));
  176. LoRa.write(y&0xFF);
  177. LoRa.write(0xFF&(y>>8));
  178. LoRa.write(z&0xFF);
  179. LoRa.write(0xFF&(z>>8));
  180. LoRa.write(bpmAvg&0xFF);
  181. LoRa.endPacket();
  182. }
  183.  
  184.  
  185. void sendDataSmall(){
  186. LoRa.beginPacket();
  187. LoRa.write(0xFA); //header
  188. LoRa.write(accMask); //acceleration directions masked into one byte
  189. LoRa.write(bpmAvg&0xFF);//bpm avg
  190. LoRa.endPacket();
  191. accMask = 0;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement