The MCP23017 I happened to get are I2C models, stamped: MCP23017 E/SP. Not as familiar to me as SPI, it gave me some grieve on top of the challenge what the universality of the chip already posed to me, especially the re-config from 16 bit to 8 bit mode (and of course also some lousy wiring flaws and coding typos made me burn some night oil).
The code is not the most leanest, but having implemented a touch UI, I knew about the needs and challenges to meet. Therefore, the 'Kpd' module (or class) supports the use of multiple types of callbacks: callback on key up (preferred), callback on key down, and both. It even supports a polling mode if you want to live an Arduino loop and lifecycle...
The code also supports bouncy hardware and clumsy key press and releases behavior.
Example output - with key number first in line - from provided sample callback look like this:
_____ _
| __|___ ___ ___ _ _|_|___ ___
| __|_ -| . | _| | | | | . |
|_____|___| _|_| |___|_|_|_|___|
|_| http://espruino.com
1v94 Copyright 2016 G.Williams
>
=undefined
0 . up at 946686483.38686466217 after 0.22292900085
5 . up at 946686484.37534046173 after 0.17869758605
9 . up at 946686487.18709087371 after 0.13181495666
7 . up at 946686513.53536319732 after 0.06225681304
9 . up at 946686515.38583564758 after 0.04290485382
1 . up at 946686517.51007080078 after 0.04504585266
2 . up at 946686519.69350910186 after 0.04776573181
and:
6 ... down at 946691897.44143199920
8 ... down at 946691898.60526180267
2 ... down at 946691898.89713573455
and both down AND up callbacks:
4 ... down at 946692008.95299339294
4 . up at 946692009.08904552459 after 0.13605213165
5 ... down at 946692010.02036190032
5 . up at 946692010.13677501678 after 0.11641311645
5 ... down at 946692014.20031738281
5 . up at 946692014.23853874206 after 0.03822135925
2 ... down at 946692016.39242458343
2 . up at 946692016.42747020721 after 0.03504562377
1 ... down at 946692021.18497848510
1 . up at 946692021.22566699981 after 0.04068851470
>
Usage with no callbacks - ciao Arduino - can look like this:
var kpd = new Kpd().connect(i2a,pxa,pxi,pxr).enable(); // ciao Arduino
var lastUpT = kpd.upT;
setInterval(function(){
if ( ! kpd.down && (kpd.upT !== lastUpT)) {
console.log(kpd.key," up at ",(lastUpT = kpd.upT));
} },50);
and related output:
7 up at 946692250.16881752014
6 up at 946692252.47182941436
6 up at 946692253.89186477661
8 up at 946692255.25380229949
6 up at 946692264.55666446685
Even though the interval driven polling / Arduino loop is not the most efficient, it is though already a lot more efficient that doing just every thing with polling / in loop.
As mentioned earlier, the implementation could be leaner (.enable() and ```.disable() can be removed when arm part of .enable is put into connect), including more efficient to the point that also the key up is detected with interrupts and setWatch. Eventually I will get 'there'. Also, it would be nice to have a 'key repeat' callback and related configuration... *...I'm thinking about it.... (help / enhancement contributions are always welcome...).
Espruino is a JavaScript interpreter for low-power Microcontrollers. This site is both a support community for Espruino and a place to share what you are working on.
...continued...
The MCP23017 I happened to get are I2C models, stamped: MCP23017 E/SP. Not as familiar to me as SPI, it gave me some grieve on top of the challenge what the universality of the chip already posed to me, especially the re-config from 16 bit to 8 bit mode (and of course also some lousy wiring flaws and coding typos made me burn some night oil).
The code is not the most leanest, but having implemented a touch UI, I knew about the needs and challenges to meet. Therefore, the 'Kpd' module (or class) supports the use of multiple types of callbacks: callback on key up (preferred), callback on key down, and both. It even supports a polling mode if you want to live an Arduino loop and lifecycle...
The code also supports bouncy hardware and clumsy key press and releases behavior.
Example output - with key number first in line - from provided sample callback look like this:
and:
and both down AND up callbacks:
Usage with no callbacks - ciao Arduino - can look like this:
and related output:
Even though the interval driven polling / Arduino loop is not the most efficient, it is though already a lot more efficient that doing just every thing with polling / in loop.
As mentioned earlier, the implementation could be leaner (
.enable()
and ```.disable() can be removed when arm part of .enable is put into connect), including more efficient to the point that also the key up is detected with interrupts and setWatch. Eventually I will get 'there'. Also, it would be nice to have a 'key repeat' callback and related configuration... *...I'm thinking about it.... (help / enhancement contributions are always welcome...).