Files
ESPEasy/lib/Adafruit_MPR121/Adafruit_MPR121.cpp
T

149 lines
4.4 KiB
C++

/***************************************************
This is a library for the MPR121 I2C 12-chan Capacitive Sensor
Designed specifically to work with the MPR121 sensor from Adafruit
----> https://www.adafruit.com/products/1982
These sensors use I2C to communicate, 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 "Adafruit_MPR121.h"
Adafruit_MPR121::Adafruit_MPR121() {
}
boolean Adafruit_MPR121::begin(uint8_t i2caddr, uint8_t sensitivity) {
//Wire.begin(); called in ESPEasy framework
_i2caddr = i2caddr;
_sensitivity = sensitivity;
// soft reset
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));
}
writeRegister(MPR121_ECR, 0x0);
uint8_t c = readRegister8(MPR121_CONFIG2);
if (c != 0x24) return false;
setThresholds(12, 6);
writeRegister(MPR121_MHDR, 0x01);
writeRegister(MPR121_NHDR, 0x01);
writeRegister(MPR121_NCLR, 0x0E);
writeRegister(MPR121_FDLR, 0x00);
writeRegister(MPR121_MHDF, 0x01);
writeRegister(MPR121_NHDF, 0x05);
writeRegister(MPR121_NCLF, 0x01);
writeRegister(MPR121_FDLF, 0x00);
writeRegister(MPR121_NHDT, 0x00);
writeRegister(MPR121_NCLT, 0x00);
writeRegister(MPR121_FDLT, 0x00);
writeRegister(MPR121_DEBOUNCE, 0);
switch(_sensitivity) {
case MPR212_EXTRA_SENSITIVITY:
writeRegister(MPR121_CONFIG1, 0x20); // increased to 32uA charge current
writeRegister(MPR121_CONFIG2, 0x3A); // 0.5uS encoding, 18 samples, 4ms period
break;
default: // MPR212_NORMAL_SENSITIVITY
writeRegister(MPR121_CONFIG1, 0x10); // default, 16uA charge current
writeRegister(MPR121_CONFIG2, 0x20); // 0.5uS encoding, 1ms period
break;
}
// writeRegister(MPR121_AUTOCONFIG0, 0x8F);
// writeRegister(MPR121_UPLIMIT, 150);
// writeRegister(MPR121_TARGETLIMIT, 100); // should be ~400 (100 shifted)
// writeRegister(MPR121_LOWLIMIT, 50);
// enable all electrodes
writeRegister(MPR121_ECR, 0x8F); // start with first 5 bits of baseline tracking
return true;
}
void Adafruit_MPR121::setThreshholds(uint8_t touch, uint8_t release) {
setThresholds(touch, release);
}
void Adafruit_MPR121::setThresholds(uint8_t touch, uint8_t release) {
for (uint8_t i=0; i<12; i++) {
writeRegister(MPR121_TOUCHTH_0 + 2*i, touch);
writeRegister(MPR121_RELEASETH_0 + 2*i, release);
}
}
void Adafruit_MPR121::setThreshold(uint8_t t, uint8_t touch, uint8_t release) {
if (t > 12) return;
writeRegister(MPR121_TOUCHTH_0 + 2 * t, touch);
writeRegister(MPR121_RELEASETH_0 + 2 * t, release);
}
uint16_t Adafruit_MPR121::filteredData(uint8_t t) {
if (t > 12) return 0;
return readRegister16(MPR121_FILTDATA_0L + t*2);
}
uint16_t Adafruit_MPR121::baselineData(uint8_t t) {
if ((_sensitivity == MPR212_EXTRA_SENSITIVITY) && (t > 3)) return 0;
if (t > 12) return 0; // MPR212_NORMAL_SENSITIVITY
uint16_t bl = readRegister8(MPR121_BASELINE_0 + t);
return (bl << 2);
}
uint16_t Adafruit_MPR121::touched(void) {
uint16_t t = readRegister16(MPR121_TOUCHSTATUS_L);
return t & 0x0FFF;
}
/*********************************************************************/
uint8_t Adafruit_MPR121::readRegister8(uint8_t reg) {
Wire.beginTransmission(_i2caddr);
Wire.write(reg);
Wire.endTransmission(false);
while (Wire.requestFrom(_i2caddr, 1) != 1);
return ( Wire.read());
}
uint16_t Adafruit_MPR121::readRegister16(uint8_t reg) {
Wire.beginTransmission(_i2caddr);
Wire.write(reg);
Wire.endTransmission(false);
while (Wire.requestFrom(_i2caddr, 2) != 2);
uint16_t v = Wire.read();
v |= ((uint16_t) Wire.read()) << 8;
return v;
}
/**************************************************************************/
/*!
@brief Writes 8-bits to the specified destination register
*/
/**************************************************************************/
void Adafruit_MPR121::writeRegister(uint8_t reg, uint8_t value) {
Wire.beginTransmission(_i2caddr);
Wire.write((uint8_t)reg);
Wire.write((uint8_t)(value));
Wire.endTransmission();
}