(25-10-2014, 10:44 PM)william escribió: hola Antonio mira te paso estos link
http://www.hackshed.co.uk/arduino-lcd-ke...nu-system/
http://www.freetronics.com/pages/16x2-lc...Ev9jmdO6Um
Buena noticia. Han usado el mismo principio que yo. Una linea analógica los botones formando un divisor de tensión.
Código:
void mainMenu() {
//State = 0 every loop cycle.
int state = 0;
//Refresh the button pressed.
int x = analogRead (0);
//Set the Row 0, Col 0 position.
lcd.setCursor(0,0);
//Check analog values from LCD Keypad Shield
if (x < 100) {
//Right
} else if (x < 200) {
//Up
state = 1;
} else if (x < 400){
//Down
state = 2;
} else if (x < 600){
//Left
} else if (x < 800){
//Select
state = 3;
}
El planteamiento de la botonera de CAO1 es muy similar. Distintos valores de resistencias, y distinta disposición del divisor de tensión.
Mira en n el fichero
Cao1_Botonera5Puls.h
Las constantes para mis resistencias figuran como:
Código:
#define V_0 1023 // 0 Ohm
#define V_2K2 842 // 2K2 // 840
#define V_4K7 697 // 4k7 // 698
#define V_10K 510 // 10K // 511
#define V_22K 319 // 22K // 322
#define V_INF 0 // Sin pulsador
Por desgracia nada de esto tiene sentido ya, así que esta parte que ves arriba se puede suprimir ya que no se puede usar.
Habrá que modificar lo siguiente:
Código:
#define B_NULL V_INF // ningún botón pulsado
#define B_SELECT V_0 // Boton central SELECT
#define B_DOWN V_2K2 // Botón inferior DOWN
#define B_UP V_22K // Boton superior UP
#define B_LEFT V_10K // Botón izquierdo LEFT
#define B_RIGHT V_4K7 // Botón derecho RIGHT
#define B_UNDEF 35 // Indicador de valor no reconocible
En lugar de ello, hay que olvidarse del tema de las resistencias porque ya tienen poco que ver con nuestro hardware y nos centraremos en el valor que se va a recibir en la entrada analógica. No conocemos esos valores, pero tres de los valores necesarios te los puedo proporcionar ya mismo.
Código:
#define B_NULL 0 // ningún botón pulsado
#define B_SELECT 1023 // Boton central SELECT
#define B_UNDEF 10 // Indicador de valor no reconocible
Hay cuatro valores más que tienes que averiguar tú, porque yo no tengo ese hardware.
Tendrás que poner una traza al puerto Serial después de la sentencia analogRead (0).
Código:
//Refresh the button pressed.
int x = analogRead (0);
Serial. println(x);
Apretando los distintos botones obtendrás en la traza el valor que debes poner para cada botón. Analizándo la lógica del programa te puedo decir dentro de que rango de valores se va a encontrar cada uno de los botones restantes. Te pongo los rangos entre paréntesis. Tu tienes que averiguar el valor exacto y ponerlo.
Código:
#define B_DOWN (200..400) // Botón inferior DOWN
#define B_UP (100..200) // Boton superior UP
#define B_LEFT (400..600) // Botón izquierdo LEFT
#define B_RIGHT (0..100) // Botón derecho RIGHT
Todo esto son deducciones, pero al no poder verificar con el hardware, me puedo equivocar.
La buena noticia es que tu hardware se puede adaptar para ser usado con CAO1, pero mi software solo acepta determinados valores con un margen de error, porque así se eliminan posibles lecturas falsas por interferencias. Por ello hay que tantear pulsando botones y mirando en las trazas para averiguar los valores exactos.
Yo te iré ayudando en todo lo que pueda.