Teclado de matriz 4×4 analógico para arduino

Aunque ya hay teclados de matriz analógicos comerciales y librerías para arduino (este, por ejemplo: https://www.sparkfun.com/products/12080) es interesante convertir los teclados de matriz que ya tenemos por casa a analógico.
Las placas Arduino tienen entradas analógicas de 10 bit y solemos tener alguna sin usar…
Siguiendo esta idea: http://www.technoblogy.com/show?NGM puede hacerse con 7 restencias normales del 5% de tolerancia con este esquema:

Código:
/*
* AnalogKeyPad: Teclado de matriz para lectura analógica
* segun esquema: http://www.technoblogy.com/show?NGM
*
* (c) Heli Tejedor, http://heli.xbot.es, Octubre 2017
*
* Este Software se distribuye bajo licencia
*
* Creative Commons 3.0 Reconocimiento, No Comercial, Compartir Igual (CC BY-NC-SA 3.0)
* http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es_ES
* http://creativecommons.org/licenses/by-nc-sa/3.0/
*
*/

// Configuracion del teclado
#define nKeys 16

#define NO_KEY 0
#define KEYPAD_PIN A0

// Tecla de la matriz 4×4: NINGUNA S1 S5 S9 S13 S2 S3 S4 S6 S7 S8 S10 S11 S14 S12 S15 S16
const int KeyVals[nKeys+1] = { 693, 665, 624, 573, 544, 491, 463, 432, 393, 353, 308, 249, 188, 157, 117, 79, 0};
const char Keys[nKeys+1] = {NO_KEY, ‘7’, ‘4’, ‘1’, ‘A’, ‘8’, ‘9’, ‘F’, ‘5’, ‘6’, ‘E’, ‘2’, ‘3’, ‘0’, ‘T’, ‘C’, ‘P’};

// ===============================================================================
// Retorna caracter de la matriz
// ===============================================================================
char GetKey (int Val)
{
char i=0;
for (; i= KeyVals[i]) break;
return Keys[i];
}

// ===============================================================================
// Lee el teclado, retorna caracter de la matriz o NO_KEY
// ===============================================================================
char ReadKeyPad()
{
static char OldKey = NO_KEY;
char KeyPressed;
char FirstKey = GetKey (analogRead(KEYPAD_PIN));

// Necesita 10 lecturas validas seguidas durante 10ms
for (char i=0; i<10; i++) { KeyPressed = GetKey (analogRead(KEYPAD_PIN)); if (KeyPressed != FirstKey) return NO_KEY; delay (1); } if (KeyPressed == OldKey) return NO_KEY; OldKey = KeyPressed; return KeyPressed; } // =============================================================================== void setup(void) { Serial.begin (115200); Serial.println ("Testing AnalogKeyPad"); } // =============================================================================== void loop(void) { char b = ReadKeyPad(); if (b != NO_KEY) { Serial.print ("Pulsado "); Serial.println (b); } delay(100); }

Todos los ficheros del proyecto estan aqui:
http://heli.xbot.es/wp-content/uploads/2017/11/AnalogKeyPad.zip
junto con una tabla de excell para calcular los valores analógicos en función de las resistencias elegidas.

Actualización 2/11/2017: Una mejora que puede hacerse es montar la resisitencia de pullup de 15K Ohmios directamente en la entrada analógica, junto al arduino. De esta forma se evita que un mal conexionado del teclado provoque pulsaciones fantasma de las teclas. Además se elimina un cable del conexionado del teclado: ahora es solo de dos hilos!