Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Wire.h>
- float L = 0.5; //Leakage Factor.
- int delta_threshold = 500;
- int trigger_threshold = 1000;
- byte FDC = 0x2A;// FDC address either 0x2A or 0x2B;
- //byte FDC = 0x2B;// FDC address either 0x2A or 0x2B;
- //Build the complete conversion result from the specific channel
- unsigned long readChannel(byte Channel) {
- unsigned long val = 0;
- uint16_t c = 0;
- uint16_t d = 0;
- c = readValue(FDC, 2 * Channel);
- d = readValue(FDC, 2 * Channel + 1);
- val = c;
- val <<= 16;
- val += d;
- return val;
- }
- //Read bytes from register channel specified
- word readValue (int FDC, int reg) {
- byte a = 0;
- byte b = 0;
- uint16_t value = 0;
- Wire.beginTransmission(FDC);
- Wire.write(reg);
- Wire.endTransmission();
- Wire.requestFrom(FDC, 2);
- while (Wire.available())
- {
- a = Wire.read();
- b = Wire.read();
- }
- value = a;
- value <<= 8;
- value += b;
- return value;
- }
- void monitor() {
- long current[4];
- long delta[4];
- long deltaSum[4];
- long last[4];
- boolean sign[4];
- boolean triggered[4];
- long trigCounts[4];
- byte n;
- unsigned long zt, target;
- for (n = 0; n < 4; n++) {
- current[n] = readChannel(n);
- delta[n] = 0;
- deltaSum[n] = 0;
- last[n] = 0;
- sign[n] = false;
- triggered[n] = false;
- trigCounts[n] = 0;
- }
- long rc;
- zt = millis();
- target = zt + 1000;
- for (;;) {
- for (n = 0; n < 4; n++) {
- last[n] = current[n];
- rc = readChannel(n);
- current[n] = (3 * current[n] + rc) / 4;
- //Serial.println(current[n]);
- delta[n] = (current[n] - last[n]);
- sign[n] = (delta[n] > 0);
- delta[n] = abs(delta[n]);
- if (delta[n] > delta_threshold) {
- deltaSum[n] += delta[n];
- if ((sign[n] == 0) && (deltaSum[n] > trigger_threshold)) {
- // detect only downward changes
- if (triggered[n] == false) {
- trigCounts[n]++;
- //avoid multiple counts for single triggers;
- //triggered[] is reset to false only once per second
- }
- triggered[n] = true;
- // Serial.print(deltaSum[n]);
- // Serial.print('\t');
- // Serial.print(sign[n]);
- // Serial.print('\t');
- // Serial.println("DETECT!");
- }
- } else {
- deltaSum[n] *= L;
- // Serial.print(deltaSum[n]);
- // Serial.print('\t');
- // Serial.print(sign[n]);
- // Serial.print('\t');
- // Serial.println("-");
- }
- }
- delay(50);
- zt = millis();
- if (zt >= target) {
- target += 1000;
- // accept only 1 event per second across all sensors
- for (n = 0; n < 4; n++) {
- triggered[n] = false;
- }
- for (n = 0; n < 4; n++) {
- Serial.print(trigCounts[n]);
- Serial.print('\t');
- }
- Serial.println("");
- }
- }
- }
- //Configuring the FDC2214
- void writeConfig(int FDC, byte reg, byte MSB, byte LSB) {
- Wire.beginTransmission(FDC);
- Wire.write(reg);
- Wire.write(MSB);
- Wire.write(LSB);
- Wire.endTransmission();
- }
- void Configure() {
- // based on best results with the TI demo program
- writeConfig(FDC, 0x14, 0x10, 0x01);//CLOCK_DIVIDERS_CH0
- writeConfig(FDC, 0x1E, 0x88, 0x00);//DRIVE_CURRENT_CH0
- writeConfig(FDC, 0x10, 0x04, 0x00);//SETTLECOUNT_CH0
- writeConfig(FDC, 0x08, 0xFF, 0xFF);//RCOUNT_CH0
- writeConfig(FDC, 0x15, 0x10, 0x01);//CLOCK_DIVIDERS_CH1
- writeConfig(FDC, 0x1F, 0x88, 0x00);//DRIVE_CURRENT_CH1
- writeConfig(FDC, 0x11, 0x04, 0x00);//SETTLECOUNT_CH1
- writeConfig(FDC, 0x09, 0xFF, 0xFF);//RCOUNT_CH1
- writeConfig(FDC, 0x16, 0x10, 0x01);//CLOCK_DIVIDERS_CH2
- writeConfig(FDC, 0x20, 0x88, 0x00);//DRIVE_CURRENT_CH2
- writeConfig(FDC, 0x12, 0x04, 0x00);//SETTLECOUNT_CH2
- writeConfig(FDC, 0x0A, 0xFF, 0xFF);//RCOUNT_CH2
- writeConfig(FDC, 0x17, 0x10, 0x01);//CLOCK_DIVIDERS_CH3
- writeConfig(FDC, 0x21, 0x88, 0x00);//DRIVE_CURRENT_CH3
- writeConfig(FDC, 0x13, 0x04, 0x00);//SETTLECOUNT_CH3
- writeConfig(FDC, 0x0B, 0xFF, 0xFF);//RCOUNT_CH3
- writeConfig(FDC, 0x19, 0x00, 0x01);//ERROR_CONFIG
- writeConfig(FDC, 0x1B, 0xC2, 0x0C);//MUX_CONFIG
- writeConfig(FDC, 0x1A, 0x1E, 0x01);//CONFIG
- }
- void setup() {
- Wire.begin();
- Serial.begin(9600);
- Serial.println("And so it begins");
- Configure();
- }
- void loop() {
- Wire.beginTransmission(FDC);
- monitor();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement