-
Notifications
You must be signed in to change notification settings - Fork 75
Open
Description
More info in this forum thread:
https://forums.adafruit.com/viewtopic.php?t=220309
Test sketch to use for demonstrating the issue:
/*********************************************************
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!");
// adding the next line per this forum thread: https://forums.adafruit.com/viewtopic.php?t=220309
cap.setAutoconfig(true);
}
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);
}Different setups seem to experience the issue more readily than others. Commenting out the delay(100); in the loop() also seems to make the issue show up faster.
The issue appears as saturated values in the reported touch values:
Filt: 696 538 356 274 712 715 716 716 720 720 722 713
Base: 704 700 716 708 712 712 716 716 716 716 720 712
0 touched
4 released
0xF
Filt: 591 437 296 256 713 716 717 717 720 719 722 714
Base: 704 700 716 708 712 712 716 716 716 716 720 712
4 touched
5 touched
6 touched
7 touched
8 touched
9 touched
10 touched
11 touched
0xFFF
Filt: 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
Base: 1020 1020 1020 1020 1020 1020 1020 1020 1020 1020 1020 1020
0xFFF
Filt: 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
Base: 1020 1020 1020 1020 1020 1020 1020 1020 1020 1020 1020 1020
0xFFF
Filt: 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535
Base: 1020 1020 1020 1020 1020 1020 1020 1020 1020 1020 1020 1020
Additionally - the MPR121 seems to be stuck at this point. The LED attached to the INT pin becomes stuck on. And the MPR121 is generally unresponsive.
guidoschmidt
Metadata
Metadata
Assignees
Labels
No labels