-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathADVcapacitiveSensor.cpp
More file actions
79 lines (72 loc) · 2.02 KB
/
ADVcapacitiveSensor.cpp
File metadata and controls
79 lines (72 loc) · 2.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "ADVcapacitiveSensor.h"
#include <math.h>
ADVcapacitiveSensor::ADVcapacitiveSensor() {
}
static void swap(double* a, double* b) {
double c = *a;
*a = *b;
*b = c;
}
static void sort(double* array) {
int size = sizeof(array) / sizeof(double);
for(int i = 0;i < size;i++)
for(int j = size - 1;j > i; j--)
if(array[j] < array[j - 1])
swap(&array[j], &array[j - 1]);
}
double ADVcapacitiveSensor::begin(int send, int receive, double voltage, int frequency, int breakthreshold, double exceptratio) {
SEND = send;
RECEIVE = receive;
VOLTAGE = voltage;
FREQUENCY = frequency;
BREAKTHRESHOLD = breakthreshold;
EXCEPTRATIO = exceptratio;
OFFSETZERO = 0.00;
double valtouch = 0.00;
for (int i = 0; i < 10; i++) { // take the lowest of ten readings
delay(10);
valtouch += ADVcapacitiveSensor::touch();
}
OFFSETZERO = valtouch/10.3; // -3% for noise
return OFFSETZERO;
}
double ADVcapacitiveSensor::touch() {
double VAL[FREQUENCY];
double INPUTTHRESHOLD = VOLTAGE * 1024 / 5 * 0.9;
for (int i = 0; i < FREQUENCY; i++) {
double val = 0;
unsigned long starttim;
digitalWrite(SEND, HIGH);
starttim = micros();
while (analogRead(RECEIVE) < INPUTTHRESHOLD) {
val = micros() - starttim;
if (val > BREAKTHRESHOLD) {
int tim = micros() - starttim;
int vol = analogRead(RECEIVE);
double gamma = -log(1 - vol / (INPUTTHRESHOLD / 0.9)) / tim;
val = -log(1 - 0.9) / gamma;
break;
}
}
digitalWrite(SEND, LOW);
delayMicroseconds(10);
if (val > 0) {
VAL[i] = val;
} else
i--;
}
sort(VAL);
double VALsum = 0;
int except = FREQUENCY * EXCEPTRATIO;
for (int i = except;i < FREQUENCY - except;i++)
VALsum += VAL[i];
int dev = FREQUENCY - 2 * except;
return VALsum / dev - OFFSETZERO;
}
bool ADVcapacitiveSensor::booltouch() {
double valtouch = 0.00;
for (int i = 0; i < 6; i++) { // take tree readings
valtouch += ADVcapacitiveSensor::touch();
}
return valtouch > OFFSETZERO ? HIGH:LOW;
}