Advertisement
Guest User

Untitled

a guest
Jul 21st, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.83 KB | None | 0 0
  1. #include <Wire.h>
  2.  
  3. float L = 0.5; //Leakage Factor.
  4. int delta_threshold = 500;
  5. int trigger_threshold = 1000;
  6.  
  7.  
  8. byte FDC = 0x2A;// FDC address either 0x2A or 0x2B;
  9. //byte FDC = 0x2B;// FDC address either 0x2A or 0x2B;
  10.  
  11.  
  12. //Build the complete conversion result from the specific channel
  13. unsigned long readChannel(byte Channel) {
  14. unsigned long val = 0;
  15. uint16_t c = 0;
  16. uint16_t d = 0;
  17. c = readValue(FDC, 2 * Channel);
  18. d = readValue(FDC, 2 * Channel + 1);
  19. val = c;
  20. val <<= 16;
  21. val += d;
  22. return val;
  23. }
  24.  
  25. //Read bytes from register channel specified
  26. word readValue (int FDC, int reg) {
  27. byte a = 0;
  28. byte b = 0;
  29. uint16_t value = 0;
  30. Wire.beginTransmission(FDC);
  31. Wire.write(reg);
  32. Wire.endTransmission();
  33. Wire.requestFrom(FDC, 2);
  34. while (Wire.available())
  35. {
  36. a = Wire.read();
  37. b = Wire.read();
  38. }
  39. value = a;
  40. value <<= 8;
  41. value += b;
  42. return value;
  43. }
  44.  
  45.  
  46. void monitor() {
  47. long current[4];
  48. long delta[4];
  49. long deltaSum[4];
  50. long last[4];
  51. boolean sign[4];
  52. boolean triggered[4];
  53. long trigCounts[4];
  54. byte n;
  55. unsigned long zt, target;
  56.  
  57. for (n = 0; n < 4; n++) {
  58. current[n] = readChannel(n);
  59. delta[n] = 0;
  60. deltaSum[n] = 0;
  61. last[n] = 0;
  62. sign[n] = false;
  63. triggered[n] = false;
  64. trigCounts[n] = 0;
  65. }
  66. long rc;
  67. zt = millis();
  68. target = zt + 1000;
  69.  
  70. for (;;) {
  71. for (n = 0; n < 4; n++) {
  72. last[n] = current[n];
  73. rc = readChannel(n);
  74. current[n] = (3 * current[n] + rc) / 4;
  75. //Serial.println(current[n]);
  76.  
  77. delta[n] = (current[n] - last[n]);
  78. sign[n] = (delta[n] > 0);
  79. delta[n] = abs(delta[n]);
  80.  
  81. if (delta[n] > delta_threshold) {
  82. deltaSum[n] += delta[n];
  83. if ((sign[n] == 0) && (deltaSum[n] > trigger_threshold)) {
  84. // detect only downward changes
  85. if (triggered[n] == false) {
  86. trigCounts[n]++;
  87. //avoid multiple counts for single triggers;
  88. //triggered[] is reset to false only once per second
  89. }
  90. triggered[n] = true;
  91. // Serial.print(deltaSum[n]);
  92. // Serial.print('\t');
  93. // Serial.print(sign[n]);
  94. // Serial.print('\t');
  95. // Serial.println("DETECT!");
  96. }
  97. } else {
  98. deltaSum[n] *= L;
  99. // Serial.print(deltaSum[n]);
  100. // Serial.print('\t');
  101. // Serial.print(sign[n]);
  102. // Serial.print('\t');
  103. // Serial.println("-");
  104. }
  105.  
  106. }
  107.  
  108. delay(50);
  109.  
  110. zt = millis();
  111. if (zt >= target) {
  112. target += 1000;
  113. // accept only 1 event per second across all sensors
  114. for (n = 0; n < 4; n++) {
  115. triggered[n] = false;
  116. }
  117. for (n = 0; n < 4; n++) {
  118. Serial.print(trigCounts[n]);
  119. Serial.print('\t');
  120. }
  121. Serial.println("");
  122. }
  123. }
  124. }
  125.  
  126.  
  127. //Configuring the FDC2214
  128. void writeConfig(int FDC, byte reg, byte MSB, byte LSB) {
  129. Wire.beginTransmission(FDC);
  130. Wire.write(reg);
  131. Wire.write(MSB);
  132. Wire.write(LSB);
  133. Wire.endTransmission();
  134. }
  135.  
  136. void Configure() {
  137. // based on best results with the TI demo program
  138. writeConfig(FDC, 0x14, 0x10, 0x01);//CLOCK_DIVIDERS_CH0
  139. writeConfig(FDC, 0x1E, 0x88, 0x00);//DRIVE_CURRENT_CH0
  140. writeConfig(FDC, 0x10, 0x04, 0x00);//SETTLECOUNT_CH0
  141. writeConfig(FDC, 0x08, 0xFF, 0xFF);//RCOUNT_CH0
  142.  
  143. writeConfig(FDC, 0x15, 0x10, 0x01);//CLOCK_DIVIDERS_CH1
  144. writeConfig(FDC, 0x1F, 0x88, 0x00);//DRIVE_CURRENT_CH1
  145. writeConfig(FDC, 0x11, 0x04, 0x00);//SETTLECOUNT_CH1
  146. writeConfig(FDC, 0x09, 0xFF, 0xFF);//RCOUNT_CH1
  147.  
  148. writeConfig(FDC, 0x16, 0x10, 0x01);//CLOCK_DIVIDERS_CH2
  149. writeConfig(FDC, 0x20, 0x88, 0x00);//DRIVE_CURRENT_CH2
  150. writeConfig(FDC, 0x12, 0x04, 0x00);//SETTLECOUNT_CH2
  151. writeConfig(FDC, 0x0A, 0xFF, 0xFF);//RCOUNT_CH2
  152.  
  153. writeConfig(FDC, 0x17, 0x10, 0x01);//CLOCK_DIVIDERS_CH3
  154. writeConfig(FDC, 0x21, 0x88, 0x00);//DRIVE_CURRENT_CH3
  155. writeConfig(FDC, 0x13, 0x04, 0x00);//SETTLECOUNT_CH3
  156. writeConfig(FDC, 0x0B, 0xFF, 0xFF);//RCOUNT_CH3
  157.  
  158. writeConfig(FDC, 0x19, 0x00, 0x01);//ERROR_CONFIG
  159. writeConfig(FDC, 0x1B, 0xC2, 0x0C);//MUX_CONFIG
  160. writeConfig(FDC, 0x1A, 0x1E, 0x01);//CONFIG
  161. }
  162.  
  163.  
  164. void setup() {
  165. Wire.begin();
  166. Serial.begin(9600);
  167. Serial.println("And so it begins");
  168. Configure();
  169. }
  170.  
  171. void loop() {
  172. Wire.beginTransmission(FDC);
  173. monitor();
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement