Adafruit MPR121 Touch Sensor how to skip checking states condition?

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

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

// 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;

// constants won't change. They're used here to set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  while (!Serial) { // needed to keep leonardo/micro from starting too fast!
  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();
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  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!
  // 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.print("Base: ");
  for (uint8_t i=0; i<12; i++) {
    Serial.print(cap.baselineData(i)); Serial.print("\t");
  // put a delay so it isn't overwhelming

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);

Besically I am using the sample code of "Adafruit MPR121 Touch sensor" but i need combined this sensor code with another pushbutton code. The problem i facing now was , when i plug out the touch sensor. The code it self will keep detecting the sensor like "MPR121 is not found" until it detecting the MPR121 sensor, it makes that my pushbutton cannot function well as my pushbutton is inside the Void loop it need run the checking condition for void setup first . Anyway to skip the checking condition of MPR121 example like it only check for 1 time after that it will turn off the checking condition if MPR121 is not found. As i am the beginner for arduino , the checking condition for the sample code in inside the " Void setup" i have no idea for it. Thanks for helping.

Instead of entering the infinite while() loop if the sensor is not found, have the code set a global boolean variable to false so that the rest of the code continues to run

Then, in loop() make running the code associated with the cap sensor dependant on the boolean value being true

1 Like

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.