const int TX_PIN = 12; const int RX_PIN = 13; const int SAMPLES = 50; const int TIMEOUT = 2000; // much lower ceiling than 20000 long readCapacitance() { long total = 0; for (int i = 0; i < SAMPLES; i++) { // discharge pinMode(RX_PIN, OUTPUT); digitalWrite(RX_PIN, LOW); digitalWrite(TX_PIN, LOW); delayMicroseconds(10); // pulse TX, count until RX goes high pinMode(RX_PIN, INPUT); digitalWrite(TX_PIN, HIGH); long count = 0; while (digitalRead(RX_PIN) == LOW && count < TIMEOUT) { count++; } total += count; digitalWrite(TX_PIN, LOW); delayMicroseconds(10); } return total / SAMPLES; } long baseline = 0; void setup() { Serial.begin(115200); pinMode(TX_PIN, OUTPUT); digitalWrite(TX_PIN, LOW); delay(100); // calibrate — don't touch pads during startup long sum = 0; for (int i = 0; i < 100; i++) { sum += readCapacitance(); } baseline = sum / 100; Serial.print("Baseline: "); Serial.println(baseline); } void loop() { long val = readCapacitance(); long delta = val - baseline; // positive = more capacitance Serial.print(val); Serial.print("\t"); Serial.println(delta); delay(10); }