/********************************************************* 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 #include "Adafruit_MPR121.h" // You can have up to 4 on one i2c bus but one is enough for testing! Adafruit_MPR121 cap = Adafruit_MPR121(); bool beginCap (uint8_t i2caddr) { Wire.begin(); cap.begin(i2caddr); //return true; cap.setThreshholds(1, 1); //return true; // soft reset cap.writeRegister(MPR121_SOFTRESET, 0x63); delay(1); for (uint8_t i=0; i<0x7F; i++) { // Serial.print("$"); Serial.print(i, HEX); // Serial.print(": 0x"); Serial.println(readRegister8(i)); } cap.writeRegister(MPR121_ECR, 0x0); uint8_t c = cap.readRegister8(MPR121_CONFIG2); if (c != 0x24) return false; cap.setThreshholds(1, 1); cap.writeRegister(MPR121_MHDR, 0x01); cap.writeRegister(MPR121_NHDR, 0x01); cap.writeRegister(MPR121_NCLR, 0x0E); cap.writeRegister(MPR121_FDLR, 0x00); cap.writeRegister(MPR121_MHDF, 0x01); cap.writeRegister(MPR121_NHDF, 0x05); cap.writeRegister(MPR121_NCLF, 0x01); cap.writeRegister(MPR121_FDLF, 0x00); cap.writeRegister(MPR121_NHDT, 0x00); cap.writeRegister(MPR121_NCLT, 0x00); cap.writeRegister(MPR121_FDLT, 0x00); cap.writeRegister(MPR121_DEBOUNCE, 0); //cap.writeRegister(MPR121_CONFIG1, 0x10); // default, 16uA charge current cap.writeRegister(MPR121_CONFIG1, 0x20); // 32uA charge current cap.writeRegister(MPR121_CONFIG2, 0x20); // 0.5uS encoding, 1ms period // writeRegister(MPR121_AUTOCONFIG0, 0x8F); // writeRegister(MPR121_UPLIMIT, 150); // writeRegister(MPR121_TARGETLIMIT, 100); // should be ~400 (100 shifted) // writeRegister(MPR121_LOWLIMIT, 50); // enable all electrodes cap.writeRegister(MPR121_ECR, 0x8F); // start with first 5 bits of baseline tracking return true; } 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"); if (!beginCap(0x5A)) { Serial.println("MPR121 not found, check wiring?"); while (1); } Serial.println("MPR121 found!"); } // Keeps track of the last pins touched // so we know when buttons are 'released' uint16_t lasttouched = 0; uint16_t currtouched = 0; void loop() { // Get the currently touched pads currtouched = cap.touched(); // Get the currently touched pads currtouched = cap.touched(); for (uint8_t i=4; 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; //Serial.print(cap.baselineData(0)); //Serial.print("\t"); Serial.print(cap.filteredData(11)); Serial.print("\t"); Serial.print(cap.filteredData(10)); Serial.print("\t"); Serial.print(cap.filteredData(9)); Serial.print("\t"); Serial.print(cap.filteredData(8)); Serial.print("\t"); Serial.print(cap.filteredData(7)); Serial.print("\t"); Serial.print(cap.filteredData(6)); Serial.print("\t"); Serial.print(cap.filteredData(5)); Serial.print("\t"); Serial.print(cap.filteredData(4)); Serial.println(); delay(100); return; 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); }