3x4 KEYPAD MPR121 is not stable when used with ESP32

Hello,
I have problems with the 3x4 keyboard with MPR121 capacitive touch. When i upload example code of Adafruit for MPR121, every things is very ok. But after a period of time, that code and that circuit board, my ESP32 did not accept the keyboard anymore.
Adafruit MPR121 Capacitive Touch sensor test MPR121 not found, check wiring?
This was the 7th keyboard I bought. The first 2 of the shops I saw the shop's instructions, I connected the Keypad's VCC to 5V of ESP32. But when I saw the Datasheet of MPR121, I found that the IC was only working at 3.3V, so I bought the replacement keyboard and used the same code and connected as above but still encountered the old situation.
Is there any idea about the above unstable situation?

My board:

My keypad:

My IDE: Arduino IDE 2.3.2

Wiring diagram:
ESP32 - KEYPAD
3.3V - VCC
GPIO22 - SCL
GPIO21 - SDA
GND - GND

Code i used:

/*********************************************************
This is a library for the MPR121 12-channel Capacitive touch sensor

Designed specifically to work with the MPR121 Breakout in the Adafruit shop 
  ----> https://www.adafruit.com/products/

These sensors use I2C communicate, at least 2 pins are required 
to interface

Adafruit invests time and resources providing this open source code, 
please support Adafruit and open-source hardware by purchasing 
products from Adafruit!

Written by Limor Fried/Ladyada for Adafruit Industries.  
BSD license, all text above must be included in any redistribution
**********************************************************/

#include <Wire.h>
#include "Adafruit_MPR121.h"

#ifndef _BV
#define _BV(bit) (1 << (bit)) 
#endif

// You can have up to 4 on one i2c bus but one is enough for testing!
Adafruit_MPR121 cap = Adafruit_MPR121();

// Keeps track of the last pins touched
// so we know when buttons are 'released'
uint16_t lasttouched = 0;
uint16_t currtouched = 0;

void setup() {
  Serial.begin(9600);

  while (!Serial) { // needed to keep leonardo/micro from starting too fast!
    delay(10);
  }
  
  Serial.println("Adafruit MPR121 Capacitive Touch sensor test"); 
  
  // Default address is 0x5A, if tied to 3.3V its 0x5B
  // If tied to SDA its 0x5C and if SCL then 0x5D
  if (!cap.begin(0x5A)) {
    Serial.println("MPR121 not found, check wiring?");
    while (1);
  }
  Serial.println("MPR121 found!");
}

void loop() {
  // Get the currently touched pads
  currtouched = cap.touched();
  
  for (uint8_t i=0; i<12; i++) {
    // it if *is* touched and *wasnt* touched before, alert!
    if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) {
      Serial.print(i); Serial.println(" touched");
    }
    // if it *was* touched and now *isnt*, alert!
    if (!(currtouched & _BV(i)) && (lasttouched & _BV(i)) ) {
      Serial.print(i); Serial.println(" released");
    }
  }

  // reset our state
  lasttouched = currtouched;

  // comment out this line for detailed data from the sensor!
  return;
  
  // debugging info, what
  Serial.print("\t\t\t\t\t\t\t\t\t\t\t\t\t 0x"); Serial.println(cap.touched(), HEX);
  Serial.print("Filt: ");
  for (uint8_t i=0; i<12; i++) {
    Serial.print(cap.filteredData(i)); Serial.print("\t");
  }
  Serial.println();
  Serial.print("Base: ");
  for (uint8_t i=0; i<12; i++) {
    Serial.print(cap.baselineData(i)); Serial.print("\t");
  }
  Serial.println();
  
  // put a delay so it isn't overwhelming
  delay(100);
}

Have you tried adding pull-up-resistors to the SDA & SCL lines? 3K3 should be good.

Does the i2c scanner sketch find the keypad?

i have been adding pull-up-resistors when i connect vcc to 5v. After i read datasheet, it show that pull-up-resistors has been integrated into the KEYPAD so i dont use in 3.3v connect

1 Like

And the i2c scanner sketch?

You should find it somewhere in the examples menu of the IDE, I think.

Of course I2C still works normally because I can still use the output with both Arduino and ESP32 before, the problem here is after a while (2-3 days), the keyboard cannot be used anymore ( or unstable use) although I have followed the manufacturer's instructions. (I welded the wires to make sure the plug is not loose)