A port of the Adafruit MPR121 Arduino library for Android Things.
dependencies {
compile 'com.nilhcem.androidthings:driver-mpr121:0.0.3'
}
int[] keyCodes = new int[] { KevEvent.KEYCODE_1, KevEvent.KEYCODE_2, ... KevEvent.KEYCODE_12 };
Mpr121InputDriver inputDriver;
HandlerThread handlerThread = new HandlerThread("Mpr121Thread");
handlerThread.start();
handler = new Handler(handlerThread.getLooper());
try {
inputDriver = new Mpr121InputDriver(i2cBusName, handler, keyCodes);
mInputDriver.register();
} catch (IOException e) {
// couldn't configure the input driver...
}
// Override key event callbacks in your Activity:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_1:
doSomethingAwesome();
return true; // handle keypress
// other cases...
}
return super.onKeyDown(keyCode, event);
}
// Unregister and close the input driver when finished:
mInputDriver.unregister;
try {
mInputDriver.close();
} catch (IOException e) {
// error closing input driver
}
Also, don't forget to add the required permission to your app's manifest file:
<uses-permission android:name="com.google.android.things.permission.MANAGE_INPUT_DRIVERS" />
You can call the Mpr121
class directly if you prefer not to receive events from the system:
// Instantiate the driver
Mpr121 peripheralDevice = new Mpr121(i2cName);
// Get the current state of each electrode
int data = peripheralDevice.getTouched();
// Loop to check the state of these electrodes
// Ideally, place this code in a thread to check continuously and add a listener when a state changes
boolean[] inputStatus = new boolean[Mpr121.NB_ELECTRODES];
for (int i = 0; i < Mpr121.NB_ELECTRODES; i++) {
if ((data & (1 << i)) != 0) {
if (!inputStatus[i]) {
Log.d(TAG, "#" + i + " touched");
inputStatus[i] = true;
}
} else {
if (inputStatus[i]) {
Log.d(TAG, "#" + i + " released");
inputStatus[i] = false;
}
}
}
// Finally, close the driver
peripheralDevice.close();
The sample project uses a passive buzzer to play a sound when an electrode is touched.
If you prefer playing a real sound file instead (e.g.: wav/mp3), use the SoundPoolHelper
instead of the PassiveBuzzerHelper
in the MainActivity
, and place your assets in res/raw
(from: res/raw/sound0.mp3
to: res/raw/sound11.mp3
)