Su funcionamiento se basa en usar la capacitancia de la parte metálica como condensador, cargarlo a través de una resistencia y comprobar cuanto tarda en cargarse para decidir si está en situación normal o hay alguien tocándolo. Tras comprobarlo, se procede a descargar esa capacitancia usando el mismo pin pero con polaridad negativa.
El esquema es el siguiente:
El condensador del diagrama es realmente una tira o placa metálica, que es lo que hace la función táctil.
El programa demostrativo es el siguiente:
Código: Seleccionar todo
#define CHARGE_PIN 12
#define INPUT_PIN 14
#define LED_PIN 33
#define DEBOUNCE_MS 175
#define TRAININGS 25
unsigned long maxTime = 50;
unsigned char ledOn = 0;
unsigned long debounceStop = 0;
void setup() {
Serial.begin(57600);
// Set up the switch pins.
pinMode(CHARGE_PIN, OUTPUT);
pinMode(INPUT_PIN, INPUT);
// Set up the LED pin.
pinMode(LED_PIN, OUTPUT);
Serial.println("Pins done");
train();
Serial.println("Train done");
}
unsigned long tactileCycle() {
unsigned long startTime = micros(), stopTime, ret;
uint8_t loopCount = 0;
digitalWrite(CHARGE_PIN, HIGH); // CHarge the circuit.
while(!digitalRead(INPUT_PIN) && loopCount < 254) { // Count the loops until the input pin is charged.
loopCount++;
}
digitalWrite(CHARGE_PIN, LOW); // Turn off the charge pin
if (loopCount >= 254) {
return 0;
}
stopTime = micros();
if (stopTime > startTime) {
ret = stopTime - startTime;
updateLimits(ret);
} else {
ret = maxTime;
}
return ret;
}
void updateLimits(const unsigned long actual) {
unsigned long partActual = actual * 0.75;
if (partActual > maxTime) {
maxTime = partActual;
}
}
void train() {
uint8_t i = 0;
for (i = 0; i < TRAININGS; i++) {
tactileCycle();
}
}
void loop() {
unsigned long actMs = millis();
unsigned long measured = tactileCycle();
if (actMs > debounceStop && measured > maxTime) {
debounceStop = actMs + DEBOUNCE_MS;
ledOn = !ledOn;
Serial.print("Trigger! ");
Serial.print(measured);
Serial.print("ms vs ");
Serial.print(maxTime);
Serial.println("ms");
}
digitalWrite(LED_PIN, ledOn);
}
Los parámetros a modificar son:
CHARGE_PIN - El pin usado para cargar y descargar la lámina, el que está unido a la resistencia.
INPUT_PIN - El pin usado para monitorizar el estado de carga de la lámina, directamente conectado a ella.
maxTime - El tiempo barrera inicial. El sistema se entrena solo pero ajustando este valor se puede mejorar el proceso. Depende de la lámina metálica y, en general, del montaje.
DEBOUNCE_MS - El tiempo mínimo entre pulsaciones.
LED_PIN - El led para la demostración.
TRAININGS - El ajuste inicial que hace automáticamente; podéis dejar este valor.
Idea sacada de: https://www.instructables.com/id/Capaci ... r-Arduino/
Video del interruptor funcionando en un Maple Mini (STM32) programado con el IDE Arduino: