Paso 12: Hardware adicional 1 - teclado
Problema con esto es que sólo tenemos 3 entradas que dejaron en el Arduino por lo que usando un teclado en su forma normal no funciona. Así que después de algunas investigaciones aquí y en internet, he encontrado una solución que usar sólo una entrada para detectar qué botón ha sido presionado.
Leer este excelente instructable sobre cómo detectar los pines en el cable del teclado y howto hasta sólo utiliza una entrada. Una vez había construir la matriz de resistencia, conecté la salida de teclado al pin A2. Usé un tablero mientras que prueba este hardware. Yo había soldado también pasadores de encabezado para el teclado así que puedo desconectarlo desde la placa más fácil y. también cuando se construyo el circuito final todo es modular y puede ser conectado fácilmente.
Por lo tanto, he añadido las siguientes tres declaraciones justo debajo de las definiciones de matriz
int keyboardPin = A2;
int keyboardValue = 0;
keypressed int = 0;
Luego he añadido la siguiente función para permitirme leer en que tecla ha sido presionada en el teclado. Tenga en cuenta que mis valores son diferentes del instructable sobre como he utilizado valores de resistencia diferentes.
void readkeyboard() {}
keyPressed = 0;
keyboardValue = analogRead(keyboardPin);
Si (keyboardValue < 25) {keypressed = -1;}
Si ((keyboardValue >25) & & (keyboardValue < 45)) {keypressed = 1;}
Si ((keyboardValue >45) & & (keyboardValue < 80)) {keypressed = 2;}
Si ((keyboardValue >80) & & (keyboardValue < 160)) {keypressed = 3;}
Si ((keyboardValue >162) & & (keyboardValue < 253)) {keypressed = 4;}
Si ((keyboardValue >253) & & (keyboardValue < 361)) {keypressed = 5;}
Si ((keyboardValue >361) & & (keyboardValue < 479)) {keypressed = 6;}
Si ((keyboardValue >479) & & (keyboardValue < 585)) {keypressed = 7;}
Si ((keyboardValue >585) & & (keyboardValue < 715)) {keypressed = 8;}
Si ((keyboardValue >715) & & (keyboardValue < 760)) {keypressed = 9;}
Si ((keyboardValue >839) & & (keyboardValue < 880)) {keypressed = 10;}
Si ((keyboardValue >760) & & (keyboardValue < 839)) {keypressed = 11;}
Si ((keyboardValue >880) & & (keyboardValue < 1000)) {keypressed = 12;}
Delay(50);
}
Esta función funciona al detectar que tecla ha sido presionada basada en el valor en la clavija de entrada de teclado y luego establecer la keypressed variable global a un número corresponde a esto.
Luego se cambia la función loop para leer este
void loop() {}
int randnumber = 0;
readkeyboard();
Si (keypressed > 0 & & keypressed < 12) {}
manualEffect = 1;
prevKeyPressed = keypressed;
para (int x = 0; x < 2; x ++) {}
(*funcAnimate[keypressed]) ();
Delay(1);
}
} else if (keypressed = 12) {}
manualEffect = 0;
Dejar el bucle recorren otra vez y la declaración final de la otra persona entonces ejecutarán un efecto aleatorio
como se ha reajustado el manualEffect
} else if (manualEffect = 1) {}
para (int x = 0; x < 2; x ++) {}
(*funcAnimate[prevKeyPressed]) ();
Delay(1);
}
} else {}
randnumber = random(0,2);
para (int x = 0; x < 2; x ++) {}
(*funcAnimate[randnumber]) ();
Delay(1);
}
}
}
Esto funciona mediante la lectura el valor del teclado.
Luego un si declaración comprueba para ver si se ha oprimido una tecla entre 0 y 11
Si esto es cierto entonces establece manualeffect 1 y luego ejecuta el efecto elegido.
Si ha sido presiona la tecla # y luego se establece manualeffect en 0, es ejecutar el siguiente bucle de tiempo como se oprime ninguna tecla y manualeffect se establece en 0 entonces se ejecuta un efecto aleatorio
Entonces si la declaración verifica si manualeffect es igual a 1. Esto sucede si una clave ha sido pulsada anteriormente y comenzó a correr un efecto manual. Esto nos permite seguir jugando el manual previamente seleccionado. Este efecto manual seguirá funcionando hasta que se pulse otra tecla
La declaración else final se ejecutará si manualeffect se establece en 0, lo que ocurrirá cuando la unidad está encendida o cuando se presiona la tecla random. A continuación, se ejecuta un efecto aleatorio.
El ajuste final al bosquejo es añadir la siguiente función
{} void dummy()
Entonces la matriz de funciones cambio leer como esta
funcAnimate [0] = dummy;
funcAnimate [1] = MakeSadSmileFace;
funcAnimate [2] = MakewinkingFace;
Cambiar el randNumber = random(0,2); a randnumber = random(1,3);
Estos cambios implican que cuando el teclado se presiona la función en la posición 0 de la matriz no se ejecuta debido a las asignaciones de variables. Por lo que sólo tiene que añadir una función dummy allí no hace nada. También cambiamos la randNumber se le asigna un número aleatorio a partir 1, otra vez matriz posición 0 nunca es ejecutar.
El bosquejo completo está a continuación.