Sensor Capacitivo MPR121 y LEDs

Hola a todos:

Quiero realizar un proyecto con el sensor MPR121 y unos LEDs. La idea es la siguiente:

  1. Si toco con la mano uno de los electrodos conectados al sensor, se encienden unos LEDs de forma consecutiva.
  2. Cuando suelto la mano, se quedará encendido únicamente aquel LED que se estaba iluminando en el momento de dejar de tocar. 3) Cuando vuelva a tocar el electrodo, se debe apagar el LED que permanecía encendido.

El problema es que el paso 2 no me le hace, ¿qué tendría que modificar del programa?. (Adjunto sketch)

Muchas gracias de antemano por la ayuda,
Un saludo

mpr121.rar (2.12 KB)

Así, a primera vista, te falta un :

pinMode(ledPins[4], OUTPUT);

Muchas gracias por la corrección. Se me había olvidado poner esa instrucción.

Una vez corregido este fallo, el programa sigue sin realizar la función deseada. Creo que el problema está en que el sensor no detecta cuando dejo de pulsar el electrodo.

¿Alguna idea?

Hola.
Lo primero sería cambiar tu enfoque del asunto. Creo que deberías echar un buen vistazo al ejemplo blinkWithoutDelay que viene en el ide del arduino. Básicamente debes controlar el estado anterior y actual del pulsador, y los milisegundos transcurridos desde que el botón se pulsó. Luego no es más que poner las condiciones que detectarán:
Mira a ver si este código te funciona o al menos te sirve de inspiración. No he utilizado tu sensor capacitivo, sino un simple pulsador, pero no creo que sea difícil adaptarlo a tu proyecto. He comentado las distintas condiciones posibles, incluso las que vamos a desechar (puedes borrarlas si quieres) para hacértelo más ilustrativo:

const int ledPins[] = {4,5,6,7,8}; // Pines digital 4,5,6,7,8
const int buttonPin = 2; 
int lastButtonState = LOW;
int Led = -1; // Led encendido actualmente. -1 para indicar todos apagados.

unsigned lastTime;
const unsigned delayTime = 500;

void setup(){
  pinMode(buttonPin, INPUT);
  for (int i=0; i<5; i++)
        pinMode(ledPins[i], OUTPUT);
  actualizaLeds();  
  Serial.begin(9600);
}

void loop(){
      int currentButtonState = digitalRead(buttonPin); // Lectura de pulsador. Teóricamente lo único que debes cambiar, si no he metido la pata.
      if (currentButtonState = HIGH) {      // Botón pulsado
            if (lastButtonState == LOW){    // Recién pulsado
                  if (Led >= 0) {           // Botón recién pulsado y había led encendido, lo apagamos
                        Led = -1;
                  } else {
                        Led = 0;            // Botón recién pulsado y no había led encendido, iniciamos secuencia y contador tiempo
                        lastTime = millis();
                  }
            } else {                        // Botón continúa pulsado
                  if (Led >= 0){            // Botón continúa pulsado, estamos en secuencia
                        unsigned currTime = millis();
                        if (currTime-lastTime >= delayTime){ // Botón continúa pulsado, estamos en secuencia y ha pasado tiempo para saltar led
                              Led ++;
                              Led %= 5;
                              lastTime = millis();
                        } else {            // Botón continúa pulsado, estamos en secuencia, no ha pasado tiempo para saltar led
                              // Nada que hacer aquí
                        }
                  } else {                  // Botón continúa pulsado, no estamos en secuencia (la última pulsación fue de apagado) 
                        // Nada que hacer aquí
                  }
            }
      } else {                              // Botón suelto
            // Nada que hacer aquí
      }
      lastButtonState = currentButtonState;
      actualizaLeds();
}

void actualizaLeds(){
      for (int i=0; i<5; i++)
            if (i==Led) digitalWrite(ledPins[i], HIGH);
            else digitalWrite(ledPins[i], LOW);
}

Muchas gracias por el programa y los comentarios :slight_smile: . Le echaré un vistazo